Adding Shooting to the Game

We’re so close to a completed game at this point! Now it’s time to wire up our Player so it can shoot. We stubbed it earlier in Player.gd, time to revisit that code.

Change the _input() function in Player.gd, to look like:

Change the _input() function in Player.gd, to look like:
  if(event.is_action("PLAYER_SHOOT")):
    if(shotCooldown.time_left == 0):
      var bullet = bulletObj.instance()
      bullet.position = self.get_position()
      bullet.position.y = bullet.position.y + 20
      get_node("/root/GameSceneRoot").add_child(bullet)
      shotCooldown.start()

This will spawn a bullet at the location of our Player and slightly down. After the bullet is spawned, we add it to the current scene. We also fire off a timer to prevent us from firing another bullet for a little while.

Load up the Player level in the 2D panel, and add a new Node of type Timer. Your Player object should now look like:

Player-hierarchy-with-Timer Godot Screenshot

At this point, update your Player.gd script to match the following:

extends Node2D
# Called when the node enters the scene tree for the first time.
var speed = 150
var verticalMovement = 0
const MAX_VERTICAL_MOVEMENT = 200
var bulletObj = null
const RATE_OF_FIRE = 3.0

onready var shotCooldown = $Timer

func _ready():
  bulletObj = load("res://Bullet/Bullet.tscn")
  shotCooldown.wait_time = 1.0/RATE_OF_FIRE
  shotCooldown.one_shot = true

func _process(delta):
  move_local_x(speed*delta)
  if(self.position.y > 1  && self.position.y <= get_viewport_rect().size.y):
    move_local_y(verticalMovement*delta)
  else:
    if(self.position.y < 1): 
      move_local_y(10) #Bounce off top
      verticalMovement = 0
    if(self.position.y > get_viewport_rect().size.y): 
      move_local_y(-10) #Bounce off bottom
      verticalMovement = 0

func stop():
  speed = 0

func explode():
  #Make sure we arent currently exploding!
  if(!$AnimationPlayer.is_playing()):
    $AnimationPlayer.play("Explode")  

func dead():
  get_node("/root/GameSceneRoot").PlayerDied()
 
func _input(event):
  if(event.is_action("PLAYER_UP")):
    if(verticalMovement >= -MAX_VERTICAL_MOVEMENT):
      verticalMovement-=10
  if(event.is_action("PLAYER_DOWN")):
    if(verticalMovement <= MAX_VERTICAL_MOVEMENT):
      verticalMovement+=10
  if(event.is_action("PLAYER_SHOOT")):
    if(shotCooldown.time_left == 0):
      var bullet = bulletObj.instance()
      bullet.position = self.get_position()
      bullet.position.y = bullet.position.y + 20
      get_node("/root/GameSceneRoot").add_child(bullet)
      shotCooldown.start()

func _on_Area2D_area_entered(area):
  #Layer 2 is another enemy
  if(area.get_collision_layer_bit(2)):
    explode()

We still need to implement the explosion logic in the above code.

 

Scroll to Top