godot-shooter / meteor / files / Player.gd
Branch meteor · default branch · all branches
Player.gd
b856550a 2023-10-30 Pavel Safronov | 1 | extends KinematicBody2D |
f398dcb9 2023-11-02 Pavel Safronov | 2 | class_name Player |
b856550a 2023-10-30 Pavel Safronov | 3 | |
748f09d4 2023-11-02 Pavel Safronov | 4 | export var move_speed = 35 |
f398dcb9 2023-11-02 Pavel Safronov | 5 | export var health = 10 |
b856550a 2023-10-30 Pavel Safronov | 6 | export var max_health = 10 |
4872f90d 2023-11-02 Pavel Safronov | 7 | export var shot_period_seconds = .5 |
b856550a 2023-10-30 Pavel Safronov | 8 | export var bullet: PackedScene |
d99ccd2a 2023-11-04 Pavel Safronov | 9 | export var is_invincible = false |
b856550a 2023-10-30 Pavel Safronov | 10 | |
f1a0def4 2023-10-31 Pavel Safronov | 11 | var PopupControl = preload("res://Popup.tscn") |
b856550a 2023-10-30 Pavel Safronov | 12 | |
| 13 | var dead = false | |
| 14 | var velocity = Vector2.ZERO | |
| 15 | var can_fire = true | |
f398dcb9 2023-11-02 Pavel Safronov | 16 | var destination: Vector2 |
| 17 | var is_destination_set = false | |
b856550a 2023-10-30 Pavel Safronov | 18 | |
236d1677 2023-11-01 Pavel Safronov | 19 | func _process(_delta: float) -> void: |
b856550a 2023-10-30 Pavel Safronov | 20 | if dead: |
| 21 | return | |
c7a34446 2023-10-31 Pavel Safronov | 22 | $Graphics/Alive/Control/HealthLabel.text = "%s / %s" % [health, max_health] |
| 23 | $Graphics/Alive/Control.global_rotation = 0 | |
b856550a 2023-10-30 Pavel Safronov | 24 | |
8c2ffd3f 2023-11-02 Pavel Safronov | 25 | func _physics_process(_delta: float) -> void: |
b856550a 2023-10-30 Pavel Safronov | 26 | if dead: |
| 27 | return | |
8c2ffd3f 2023-11-02 Pavel Safronov | 28 | global_rotation = global_position.direction_to(get_global_mouse_position()).angle() + PI/2.0 |
b856550a 2023-10-30 Pavel Safronov | 29 | velocity = move_and_slide(velocity) |
| 30 | ||
| 31 | func restart(): | |
236d1677 2023-11-01 Pavel Safronov | 32 | var _error = get_tree().reload_current_scene() |
b856550a 2023-10-30 Pavel Safronov | 33 | |
| 34 | func kill(): | |
d99ccd2a 2023-11-04 Pavel Safronov | 35 | if dead or is_invincible: |
b856550a 2023-10-30 Pavel Safronov | 36 | return |
| 37 | dead = true | |
| 38 | $Graphics/Dead.show() | |
| 39 | $Graphics/Alive.hide() | |
f398dcb9 2023-11-02 Pavel Safronov | 40 | $CanvasLayer/CenterContainer/DeathScreen.show() |
b856550a 2023-10-30 Pavel Safronov | 41 | z_index = -1 |
| 42 | ||
f398dcb9 2023-11-02 Pavel Safronov | 43 | func hurt(damage_amount: int = 1): |
d99ccd2a 2023-11-04 Pavel Safronov | 44 | if dead or is_invincible: |
b856550a 2023-10-30 Pavel Safronov | 45 | return |
a261d90c 2023-11-02 Pavel Safronov | 46 | health -= damage_amount |
b856550a 2023-10-30 Pavel Safronov | 47 | if health <= 0: |
| 48 | kill() | |
| 49 | ||
| 50 | func shoot(): | |
| 51 | if !can_fire: | |
| 52 | return | |
| 53 | can_fire = false | |
| 54 | $ShotTimer.wait_time = shot_period_seconds | |
| 55 | $ShotTimer.start() | |
| 56 | var b = bullet.instance() | |
| 57 | owner.add_child(b) | |
| 58 | b.transform = $Barrel.global_transform | |
| 59 | ||
f398dcb9 2023-11-02 Pavel Safronov | 60 | func shoot_at(pos: Vector2): |
| 61 | if !can_fire: | |
| 62 | return | |
| 63 | can_fire = false | |
| 64 | $ShotTimer.wait_time = shot_period_seconds | |
| 65 | $ShotTimer.start() | |
| 66 | var b = bullet.instance() as Bullet | |
| 67 | owner.add_child(b) | |
| 68 | b.global_position = global_position | |
| 69 | b.global_rotation = global_position.angle_to_point(pos) + PI / 2.0 | |
| 70 | ||
b856550a 2023-10-30 Pavel Safronov | 71 | func allow_fire(): |
| 72 | can_fire = true | |
f398dcb9 2023-11-02 Pavel Safronov | 73 | |
| 74 | func _on_Button_pressed() -> void: | |
| 75 | restart() |