diff --git a/Action.gd b/Action.gd new file mode 100644 index 0000000..c362504 --- /dev/null +++ b/Action.gd @@ -0,0 +1,7 @@ +extends Node +class_name Action + +var action_id = -1 + +func process(actor, delta): + actor.setState(action_id) diff --git a/Actor.gd b/Actor.gd new file mode 100644 index 0000000..8d685a0 --- /dev/null +++ b/Actor.gd @@ -0,0 +1,10 @@ +extends Area2D +class_name Actor + +var state = 0 +var health = 100 +var state_map = {} # {STATE, Action Node} +export var speed = 200 # How fast the actor will move (pixels/sec). + +func setState(new_state): + state = new_state diff --git a/ActorProcess.gd b/ActorProcess.gd new file mode 100644 index 0000000..1eccaec --- /dev/null +++ b/ActorProcess.gd @@ -0,0 +1,16 @@ +extends Node + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass diff --git a/Main.tscn b/Main.tscn index fbcbb3a..a8f666e 100644 --- a/Main.tscn +++ b/Main.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=4 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://test-scene.tscn" type="PackedScene" id=1] [ext_resource path="res://Main.gd" type="Script" id=2] +[ext_resource path="res://Actor.gd" type="Script" id=3] [ext_resource path="res://Ground.tscn" type="PackedScene" id=4] [node name="Main" type="Node"] @@ -18,3 +19,6 @@ collision_mask = 0 [node name="StartPosition" type="Position2D" parent="."] position = Vector2( 240, 450 ) + +[node name="Actor" type="Area2D" parent="."] +script = ExtResource( 3 ) diff --git a/PlayerAttack.gd b/PlayerAttack.gd new file mode 100644 index 0000000..8923618 --- /dev/null +++ b/PlayerAttack.gd @@ -0,0 +1,22 @@ +extends Node +class_name PlayerAttack + +func run(actor, delta): + + actor.getAnimatedSprite().animation = "slash" + actor.getAnimatedSprite().speed_scale = 4 + var velocity = actor.last_process_velocity + velocity = velocity.normalized() * actor.speed + if velocity.length() > 0: + actor.getAnimatedSprite().play() + actor.position += velocity * delta * 0.5 + actor.position.x = clamp(actor.position.x, 0, actor.get_viewport_rect().size.x) + actor.position.y = clamp(actor.position.y, 0, actor.get_viewport_rect().size.y) + actor.getAnimatedSprite().flip_h = velocity.x < 0 + + +func spriteFinished(actor): + + actor.state = actor.PlayerState.NORMAL + actor.getAnimatedSprite().flip_h = false + actor.getAnimatedSprite().speed_scale = 1 diff --git a/PlayerDash.gd b/PlayerDash.gd new file mode 100644 index 0000000..00c87f2 --- /dev/null +++ b/PlayerDash.gd @@ -0,0 +1,22 @@ +extends Node +class_name PlayerDash + +func run(actor, delta): + + actor.getAnimatedSprite().animation = "dash" + actor.getAnimatedSprite().speed_scale = 2.5 + var velocity = actor.last_process_velocity + velocity = velocity.normalized() * actor.speed + if velocity.length() > 0: + actor.getAnimatedSprite().play() + actor.position += velocity * delta * 1.8 + actor.position.x = clamp(actor.position.x, 0, actor.get_viewport_rect().size.x) + actor.position.y = clamp(actor.position.y, 0, actor.get_viewport_rect().size.y) + actor.getAnimatedSprite().flip_h = velocity.x < 0 + + +func spriteFinished(actor): + + actor.state = actor.PlayerState.STANDING + actor.getAnimatedSprite().flip_h = false + actor.getAnimatedSprite().speed_scale = 1 diff --git a/PlayerNormal.gd b/PlayerNormal.gd new file mode 100644 index 0000000..888a1ad --- /dev/null +++ b/PlayerNormal.gd @@ -0,0 +1,37 @@ +extends Node +class_name PlayerNormal + +func run(actor, delta): + + var velocity = Vector2() # The player's movement vector. + if Input.is_key_pressed(KEY_SHIFT): + actor.setState(actor.PlayerState.DASHING) + if Input.is_key_pressed(KEY_Z): + actor.setState(actor.PlayerState.ATTACKING) + 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 + if velocity.length() > 0: + velocity = velocity.normalized() * actor.speed + actor.getAnimatedSprite().play() + + actor.position += velocity * delta + actor.position.x = clamp(actor.position.x, 0, actor.get_viewport_rect().size.x) + actor.position.y = clamp(actor.position.y, 0, actor.get_viewport_rect().size.y) + + if velocity.x > 0 or velocity.y != 0: + actor.getAnimatedSprite().animation = "forward" + elif velocity.x < 0: + actor.getAnimatedSprite().animation = "backward" + else: + actor.getAnimatedSprite().animation = "idle" + + actor.last_process_velocity = velocity + +func spriteFinished(actor): + pass diff --git a/PlayerStanding.gd b/PlayerStanding.gd new file mode 100644 index 0000000..40aac71 --- /dev/null +++ b/PlayerStanding.gd @@ -0,0 +1,17 @@ +extends Node +class_name PlayerStanding + +func run(actor, delta): + + actor.getAnimatedSprite().animation = "standing up" + actor.getAnimatedSprite().speed_scale = 1 + var velocity = Vector2(0.0, 0.0) + actor.position += velocity.normalized() * delta + actor.position.x = clamp(actor.position.x, 0, actor.get_viewport_rect().size.x) + actor.position.y = clamp(actor.position.y, 0, actor.get_viewport_rect().size.y) + actor.getAnimatedSprite().flip_h = actor.last_process_velocity.x < 0 + +func spriteFinished(actor): + + actor.state = actor.PlayerState.NORMAL + actor.getAnimatedSprite().flip_h = false diff --git a/player.gd b/player.gd index f31cf08..feb566a 100644 --- a/player.gd +++ b/player.gd @@ -1,94 +1,29 @@ -extends Area2D +extends Actor -enum PlayerState { NORMAL, DASHING, STANDING }; -enum PlayerDirection { RIGHT, LEFT, DOWN, UP }; +enum PlayerState { NORMAL = 0, # < default from Actor + DASHING = 1, + STANDING = 2, + ATTACKING = 3 }; -export var speed = 200 # How fast the player will move (pixels/sec). var screen_size # Size of the game window. -var state = PlayerState.NORMAL; -var direction = PlayerDirection.RIGHT; var last_process_velocity = Vector2() func start(pos): position = pos + state_map = {PlayerState.NORMAL: PlayerNormal.new(), + PlayerState.DASHING: PlayerDash.new(), + PlayerState.STANDING: PlayerStanding.new(), + PlayerState.ATTACKING: PlayerAttack.new()} show() -func _ready(): - screen_size = get_viewport_rect().size - -func processNormal(delta): - var velocity = Vector2() # The player's movement vector. - if Input.is_key_pressed(KEY_SHIFT): - state = PlayerState.DASHING - return - - if Input.is_action_pressed("ui_right"): - velocity.x += 1 - direction = PlayerDirection.RIGHT; - if Input.is_action_pressed("ui_left"): - velocity.x -= 1 - direction = PlayerDirection.LEFT; - if Input.is_action_pressed("ui_down"): - velocity.y += 1 - direction = PlayerDirection.DOWN; - if Input.is_action_pressed("ui_up"): - velocity.y -= 1 - direction = PlayerDirection.UP; - if velocity.length() > 0: - velocity = velocity.normalized() * speed - $AnimatedSprite.play() - - position += velocity * delta - position.x = clamp(position.x, 0, screen_size.x) - position.y = clamp(position.y, 0, screen_size.y) - - if velocity.x > 0 or velocity.y != 0: - $AnimatedSprite.animation = "forward" - direction = PlayerDirection.RIGHT; - elif velocity.x < 0: - $AnimatedSprite.animation = "backward" - direction = PlayerDirection.LEFT; - else: - $AnimatedSprite.animation = "idle" - - last_process_velocity = velocity - -func processDash(delta): - $AnimatedSprite.animation = "dash" - $AnimatedSprite.speed_scale = 2.5 - var velocity = last_process_velocity - velocity = velocity.normalized() * speed - if velocity.length() > 0: - velocity = velocity.normalized() * speed - $AnimatedSprite.play() - position += velocity * delta * 1.8 - position.x = clamp(position.x, 0, screen_size.x) - position.y = clamp(position.y, 0, screen_size.y) - $AnimatedSprite.flip_h = velocity.x < 0 - -func processStanding(delta): - $AnimatedSprite.animation = "standing up" - $AnimatedSprite.speed_scale = 1 - var velocity = Vector2(0.0, 0.0) - position += velocity.normalized() * delta - position.x = clamp(position.x, 0, screen_size.x) - position.y = clamp(position.y, 0, screen_size.y) - $AnimatedSprite.flip_h = last_process_velocity.x < 0 - func _process(delta): - if state == PlayerState.NORMAL: - processNormal(delta) - elif state == PlayerState.DASHING: - processDash(delta) - else: - processStanding(delta) - + state_map[state].run(self, delta) +func _ready(): + screen_size = get_viewport_rect().size func _on_AnimatedSprite_animation_finished(): - if $AnimatedSprite.animation == "dash": # Replace with function body. - state = PlayerState.STANDING - $AnimatedSprite.speed_scale = 1 - elif $AnimatedSprite.animation == "standing up": - state = PlayerState.NORMAL - $AnimatedSprite.flip_h = false + state_map[state].spriteFinished(self) + +func getAnimatedSprite(): + return $AnimatedSprite diff --git a/project.godot b/project.godot index 28bf348..b30fff9 100644 --- a/project.godot +++ b/project.godot @@ -8,9 +8,44 @@ config_version=4 -_global_script_classes=[ ] +_global_script_classes=[ { +"base": "Node", +"class": "Action", +"language": "GDScript", +"path": "res://Action.gd" +}, { +"base": "Area2D", +"class": "Actor", +"language": "GDScript", +"path": "res://Actor.gd" +}, { +"base": "Node", +"class": "PlayerAttack", +"language": "GDScript", +"path": "res://PlayerAttack.gd" +}, { +"base": "Node", +"class": "PlayerDash", +"language": "GDScript", +"path": "res://PlayerDash.gd" +}, { +"base": "Node", +"class": "PlayerNormal", +"language": "GDScript", +"path": "res://PlayerNormal.gd" +}, { +"base": "Node", +"class": "PlayerStanding", +"language": "GDScript", +"path": "res://PlayerStanding.gd" +} ] _global_script_class_icons={ - +"Action": "", +"Actor": "", +"PlayerAttack": "", +"PlayerDash": "", +"PlayerNormal": "", +"PlayerStanding": "" } [application] diff --git a/test-scene.tscn b/test-scene.tscn index 1862005..861dd48 100644 --- a/test-scene.tscn +++ b/test-scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=25 format=2] +[gd_scene load_steps=33 format=2] [ext_resource path="res://assets/art/forward-sheet.png" type="Texture" id=1] [ext_resource path="res://assets/art/backwards-sheet.png" type="Texture" id=2] @@ -13,65 +13,78 @@ [ext_resource path="res://assets/art/dash/dash-07.png" type="Texture" id=11] [ext_resource path="res://assets/art/dash/dash-03.png" type="Texture" id=12] [ext_resource path="res://assets/art/dash/dash-08.png" type="Texture" id=13] +[ext_resource path="res://assets/art/slash/slash-02.png" type="Texture" id=14] +[ext_resource path="res://assets/art/slash/slash-03.png" type="Texture" id=15] +[ext_resource path="res://assets/art/slash/slash-01.png" type="Texture" id=16] +[ext_resource path="res://PlayerNormal.gd" type="Script" id=17] +[ext_resource path="res://assets/art/slash/slash-04.png" type="Texture" id=18] +[ext_resource path="res://PlayerDash.gd" type="Script" id=19] +[ext_resource path="res://PlayerStanding.gd" type="Script" id=20] +[ext_resource path="res://PlayerAttack.gd" type="Script" id=21] -[sub_resource type="AtlasTexture" id=9] +[sub_resource type="AtlasTexture" id=1] flags = 4 atlas = ExtResource( 3 ) region = Rect2( 0, 0, 45, 47 ) -[sub_resource type="AtlasTexture" id=10] +[sub_resource type="AtlasTexture" id=2] flags = 4 atlas = ExtResource( 3 ) region = Rect2( 45, 0, 45, 47 ) -[sub_resource type="AtlasTexture" id=11] +[sub_resource type="AtlasTexture" id=3] flags = 4 atlas = ExtResource( 3 ) region = Rect2( 90, 0, 45, 47 ) -[sub_resource type="AtlasTexture" id=12] +[sub_resource type="AtlasTexture" id=4] flags = 4 atlas = ExtResource( 3 ) region = Rect2( 135, 0, 45, 47 ) -[sub_resource type="AtlasTexture" id=13] +[sub_resource type="AtlasTexture" id=5] flags = 4 atlas = ExtResource( 1 ) region = Rect2( 0, 0, 45, 47 ) -[sub_resource type="AtlasTexture" id=14] +[sub_resource type="AtlasTexture" id=6] flags = 4 atlas = ExtResource( 1 ) region = Rect2( 45, 0, 45, 47 ) -[sub_resource type="AtlasTexture" id=15] +[sub_resource type="AtlasTexture" id=7] flags = 4 atlas = ExtResource( 1 ) region = Rect2( 90, 0, 45, 47 ) -[sub_resource type="AtlasTexture" id=5] +[sub_resource type="AtlasTexture" id=8] flags = 4 atlas = ExtResource( 2 ) region = Rect2( 0, 0, 44, 47 ) -[sub_resource type="AtlasTexture" id=6] +[sub_resource type="AtlasTexture" id=9] flags = 4 atlas = ExtResource( 2 ) region = Rect2( 44, 0, 44, 47 ) -[sub_resource type="AtlasTexture" id=7] +[sub_resource type="AtlasTexture" id=10] flags = 4 atlas = ExtResource( 2 ) region = Rect2( 88, 0, 44, 47 ) -[sub_resource type="SpriteFrames" id=8] +[sub_resource type="SpriteFrames" id=11] animations = [ { -"frames": [ SubResource( 9 ), SubResource( 10 ), SubResource( 11 ), SubResource( 12 ) ], +"frames": [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ), SubResource( 4 ) ], "loop": true, "name": "idle", "speed": 5.0 }, { -"frames": [ SubResource( 13 ), SubResource( 14 ), SubResource( 15 ) ], +"frames": [ ExtResource( 16 ), ExtResource( 14 ), ExtResource( 15 ), ExtResource( 18 ) ], +"loop": true, +"name": "slash", +"speed": 5.0 +}, { +"frames": [ SubResource( 5 ), SubResource( 6 ), SubResource( 7 ) ], "loop": true, "name": "forward", "speed": 5.0 @@ -81,7 +94,7 @@ animations = [ { "name": "dash", "speed": 5.0 }, { -"frames": [ SubResource( 5 ), SubResource( 6 ), SubResource( 7 ) ], +"frames": [ SubResource( 8 ), SubResource( 9 ), SubResource( 10 ) ], "loop": true, "name": "backward", "speed": 5.0 @@ -99,9 +112,21 @@ __meta__ = { } [node name="AnimatedSprite" type="AnimatedSprite" parent="."] -frames = SubResource( 8 ) -animation = "standing up" -frame = 1 +frames = SubResource( 11 ) +animation = "slash" +frame = 2 playing = true + +[node name="PlayerNormal" type="Node" parent="."] +script = ExtResource( 17 ) + +[node name="PlayerDash" type="Node" parent="."] +script = ExtResource( 19 ) + +[node name="PlayerStanding" type="Node" parent="."] +script = ExtResource( 20 ) + +[node name="PlayerAttack" type="Node" parent="."] +script = ExtResource( 21 ) [connection signal="body_entered" from="." to="." method="_on_Player_body_entered"] [connection signal="animation_finished" from="AnimatedSprite" to="." method="_on_AnimatedSprite_animation_finished"]