godot-first-2d-game/player.gd

61 lines
1.5 KiB
GDScript

extends Area2D
signal hit
@export var speed = 400
var screen_size
# Called when the node enters the scene tree for the first time.
func _ready():
screen_size = get_viewport_rect().size
# Hide the player initially.
hide()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
# Set player velocity to 0,0.
var velocity = Vector2.ZERO
if Input.is_action_pressed("move_right"):
velocity.x += 1
if Input.is_action_pressed("move_left"):
velocity.x -= 1
if Input.is_action_pressed("move_down"):
velocity.y += 1
if Input.is_action_pressed("move_up"):
velocity.y -= 1
if velocity.length() > 0:
# Prevent fast diagonal movement.
velocity = velocity.normalized() * speed
# $ = get_node()
# So this is the same as get_node("AnimatedSprite2D").play()
$AnimatedSprite2D.play()
else:
$AnimatedSprite2D.stop()
position += velocity * delta
# Restrict position to within the screen.
position = position.clamp(Vector2.ZERO, screen_size)
if velocity.x != 0:
$AnimatedSprite2D.animation = "walk"
$AnimatedSprite2D.flip_v = false
$AnimatedSprite2D.flip_h = velocity.x < 0
elif velocity.y != 0:
$AnimatedSprite2D.animation = "up"
$AnimatedSprite2D.flip_v = velocity.y > 0
func _on_body_entered(body):
# Hide player when hit.
hide()
hit.emit()
# Defer as you can't change physics properties on a physics callback.
# This tells Godot to wait until it's safe to disable it.
$CollisionShape2D.set_deferred("disabled", true)
func start(pos):
position = pos
show()
$CollisionShape2D.disabled = false