godot/demos/2d/space_shooter/ship.gd

89 lines
1.8 KiB
GDScript

extends Area2D
# member variables here, example:
# var a=2
# var b="textvar"
const SPEED = 200
var screen_size
var prev_shooting=false
func _process(delta):
var motion = Vector2()
if Input.is_action_pressed("move_up"):
motion+=Vector2(0,-1)
if Input.is_action_pressed("move_down"):
motion+=Vector2(0,1)
if Input.is_action_pressed("move_left"):
motion+=Vector2(-1,0)
if Input.is_action_pressed("move_right"):
motion+=Vector2(1,0)
var shooting = Input.is_action_pressed("shoot")
var pos = get_pos()
pos+=motion*delta*SPEED
if (pos.x<0):
pos.x=0
if (pos.x>screen_size.x):
pos.x=screen_size.x
if (pos.y<0):
pos.y=0
if (pos.y>screen_size.y):
pos.y=screen_size.y
set_pos(pos)
if (shooting and not prev_shooting):
# just pressed
var shot = preload("res://shot.scn").instance()
#use the position3d as reference
shot.set_pos( get_node("shootfrom").get_global_pos() )
#put it two parents above, so it is not moved by us
get_node("../..").add_child(shot)
#play sound
get_node("sfx").play("shoot")
prev_shooting = shooting
#update points counter
get_node("../hud/score_points").set_text( str(get_node("/root/game_state").points) )
func _ready():
# Initialization here
screen_size = get_viewport().get_rect().size
set_process(true)
pass
var killed=false
func _hit_something():
if (killed):
return
killed=true
get_node("anim").play("explode")
get_node("sfx").play("sound_explode")
get_node("../hud/game_over").show()
get_node("/root/game_state").game_over()
get_parent().stop()
set_process(false)
func _on_ship_body_enter( body ):
_hit_something()
func _on_ship_area_enter( area ):
if (area.has_method("is_enemy") and area.is_enemy()):
_hit_something()
func _on_back_to_menu_pressed():
get_tree().change_scene("res://main_menu.scn")
pass # replace with function body