1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- class_name Player
- extends Area2D
- signal hit
- enum State {SLEEPING, DODGING, DEAD}
- export var speed = 400 # pixel / sec
- var screen
- var target = Vector2()
- var target_reached = true
- var _current_state
- func spawn(pos):
- _current_state = State.DODGING
- $CollisionShape2D.disabled = false
- go_to(pos)
- func sleep():
- _current_state = State.SLEEPING
- $AnimatedSprite.animation = "sleep"
- $AnimatedSprite.play()
- func die():
- _current_state = State.DEAD
- $AnimatedSprite.animation = "die"
- $AnimatedSprite.play()
- func _ready():
- screen = get_viewport_rect()
- sleep()
- func _process(delta: float):
- if _current_state == State.DODGING:
- dodge(delta)
- func dodge(delta: float):
- var velocity = get_velocity_from_action()
- if velocity == Vector2.ZERO :
- velocity = get_velocity_from_target(delta)
-
- if velocity.length_squared() > 0:
- velocity = velocity.normalized() * speed
- position += velocity * delta
- position.x = clamp(position.x, 0, screen.size.x)
- position.y = clamp(position.y, 0, screen.size.y)
- $AnimatedSprite.animation = "move"
- $AnimatedSprite.flip_h = velocity.x < 0
- else:
- $AnimatedSprite.animation = "idle"
- func go_to(pos: Vector2):
- target = pos
- target_reached = false
- func _input(event):
- if event is InputEventMouseButton or event is InputEventMouseMotion :
- go_to(event.position)
- func _on_Player_body_entered(_body):
- die()
- emit_signal("hit")
- $CollisionShape2D.set_deferred("disabled", true)
- func get_velocity_from_action() -> Vector2:
- var velocity = Vector2()
- if Input.is_action_pressed("ui_right"):
- velocity.x += 1
- if Input.is_action_pressed("ui_left"):
- velocity.x -= 1
- if Input.is_action_pressed("ui_down"):
- velocity.y += 1
- if Input.is_action_pressed("ui_up"):
- velocity.y -= 1
- return velocity;
- func get_velocity_from_target(delta):
- if target_reached :
- return Vector2.ZERO
- var path = target - position
- if path.length_squared() < speed * speed * delta * delta :
- target_reached = true
- return Vector2.ZERO
- return path
|