diff --git a/src/enemyB/Enemy2.tscn b/src/enemyB/Enemy2.tscn index e225280..0e25d2d 100644 --- a/src/enemyB/Enemy2.tscn +++ b/src/enemyB/Enemy2.tscn @@ -131,6 +131,7 @@ script = ExtResource( 1 ) position = Vector2( 8, -8 ) frames = SubResource( 168 ) animation = "idle" +frame = 2 playing = true flip_h = true __meta__ = { diff --git a/src/enemyC/EnemyC.tscn b/src/enemyC/EnemyC.tscn index 255729c..3739a91 100644 --- a/src/enemyC/EnemyC.tscn +++ b/src/enemyC/EnemyC.tscn @@ -1,6 +1,9 @@ -[gd_scene load_steps=22 format=2] +[gd_scene load_steps=26 format=2] [ext_resource path="res://src/templates/Actor/ActorTemplate.tscn" type="PackedScene" id=1] +[ext_resource path="res://src/state_animated_actor.gd" type="Script" id=3] +[ext_resource path="res://src/enemyC/states/idle.gd" type="Script" id=4] +[ext_resource path="res://src/enemyC/states/wander.gd" type="Script" id=5] [sub_resource type="StreamTexture" id=1] load_path = "res://.import/botEnemy.png-46efd539a38730ff15fb4ddb087329c6.stex" @@ -105,13 +108,16 @@ animations = [ { "speed": 10.0 } ] +[sub_resource type="RectangleShape2D" id=21] +extents = Vector2( 9, 3.5 ) + [node name="EnemyC" instance=ExtResource( 1 )] [node name="AnimatedSprite" parent="." index="0"] position = Vector2( 11, -7 ) frames = SubResource( 20 ) animation = "idle" -frame = 1 +frame = 2 __meta__ = { "_aseprite_wizard_config_": { "layer": "", @@ -129,7 +135,34 @@ __meta__ = { position = Vector2( -0.5, -2 ) [node name="idle" parent="movement_state_machine" index="0"] +script = ExtResource( 4 ) +timeout_seconds = 2.0 animation_sequence = [ "idle" ] +wander_node = NodePath("../wander") +attack_node = NodePath("../attack") [node name="fall" parent="movement_state_machine" index="1"] animation_sequence = [ "idle" ] + +[node name="wander" type="Node" parent="movement_state_machine" index="2"] +script = ExtResource( 5 ) +timeout_seconds = 2.0 +animation_sequence = [ "walk" ] +idle_node = NodePath("../idle") +attack_node = NodePath("../attack") +fall_node = NodePath("../fall") + +[node name="attack" type="Node" parent="movement_state_machine" index="3"] +script = ExtResource( 3 ) +timeout_seconds = 3.0 +animation_sequence = [ "attack" ] + +[node name="PlayerDetection" type="RayCast2D" parent="." index="6"] +cast_to = Vector2( 21, 0 ) + +[node name="Hitbox_Component" type="Area2D" parent="." index="7"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox_Component" index="0"] +modulate = Color( 1, 0.596078, 0.121569, 1 ) +position = Vector2( 18, -8.5 ) +shape = SubResource( 21 ) diff --git a/src/enemyC/idle.gd b/src/enemyC/states/idle.gd similarity index 58% rename from src/enemyC/idle.gd rename to src/enemyC/states/idle.gd index 312df46..ecb3b8e 100644 --- a/src/enemyC/idle.gd +++ b/src/enemyC/states/idle.gd @@ -3,31 +3,24 @@ extends "res://src/templates/Actor/states/idle.gd" var debugTimeTracker := 0.0 -export (NodePath) var jump_node -export (NodePath) var move_node -export (NodePath) var fire_node +export (NodePath) var wander_node +export (NodePath) var attack_node -onready var jump_state: State = get_node(jump_node) -onready var move_state: State = get_node(move_node) -onready var fire_state: State = get_node(fire_node) +onready var wander_state: State = get_node(wander_node) +onready var attack_state: State = get_node(attack_node) func enter() -> void: .enter() parent.set_hurtbox(true) parent.velocity.x = 0 + state_timeout.start() -func process_input(_event: InputEvent) -> State: -# if get_jump() and parent.is_on_floor(): +func process_frame(_delta: float) -> State:# if get_jump() and parent.is_on_floor(): # return jump_state - if move_component.wants_jump() and parent.is_on_floor(): - return jump_state + if state_timeout.time_left == 0: + return wander_state -# if move_component.get_movement_direction() != 0.0: -# return move_state - if move_component.wants_shoot(): - return fire_state - # move_component.wants_jump() move_component.get_movement_direction() @@ -46,8 +39,6 @@ func process_physics(delta: float) -> State: parent.velocity.x = move_component.desired_movement_vector.x * move_speed parent.velocity = parent.move_and_slide(parent.velocity, Vector2(0, -1)) - if parent.velocity.x != 0.0: - return move_state if !parent.is_on_floor(): return fall_state diff --git a/src/enemyC/states/wander.gd b/src/enemyC/states/wander.gd new file mode 100644 index 0000000..efa29a8 --- /dev/null +++ b/src/enemyC/states/wander.gd @@ -0,0 +1,58 @@ +extends StateAnimatedActor + +export (NodePath) var idle_node +export (NodePath) var attack_node +export (NodePath) var fall_node + +onready var idle_state: State = get_node(idle_node) +onready var attack_state: State = get_node(attack_node) +onready var fall_state: State = get_node(fall_node) + +var flip_flop = false + +func enter(state_modifiers: Array = []) -> void: + .enter() + parent.set_hurtbox(true) + state_timeout.start() + if flip_flop: + flip_flop = false + move_component.desired_movement_vector.x = 1.0 + else: + flip_flop = true + move_component.desired_movement_vector.x = -1.0 + +func process_frame(_delta: float) -> State: + +# if parent.player_detection.is_colliding(): +# return attack_state + + if state_timeout.time_left == 0: + return idle_state + +# if move_component.wants_jump() and parent.is_on_floor(): +# return jump_state +# +# move_component.get_movement_direction() + return null + + +func process_physics(delta: float) -> State: + + parent.velocity.y += gravity * delta + + parent.velocity.x = move_component.desired_movement_vector.x * move_speed + parent.velocity = parent.move_and_slide(parent.velocity, Vector2(0, -1)) + + if parent.velocity.x == 0.0: + return idle_state + else: + if parent.velocity.x > 0: + parent.direction.x = 1 + elif parent.velocity.x < 0: + parent.direction.x = -1 + + parent.transform.x.x = parent.direction.x + + if !parent.is_on_floor(): + return fall_state + return null diff --git a/src/movement_component.gd b/src/movement_component.gd index 3600bd3..7270311 100644 --- a/src/movement_component.gd +++ b/src/movement_component.gd @@ -2,17 +2,23 @@ class_name MovementComponent extends Node onready var desired_movement_vector: Vector2 = Vector2(0,0) +var current_movement_state:String + +enum directions {UP, DOWN, LEFT, RIGHT} + +func process(delta): + pass # Return the desired direction of movement for the character # in the range [-1, 1], where positive values indicate a desire # to move to the right and negative values to the left. func get_movement_direction() -> float: - return 0.0 + return desired_movement_vector.x # Return a boolean indicating if the character wants to jump func wants_jump() -> bool: return false -# Return a boolean indicating if the character wants to jump +# Return a boolean indicating if the character wants to attack func wants_shoot() -> bool: return false diff --git a/src/state.gd b/src/state.gd index 46f2039..5cbb5e7 100644 --- a/src/state.gd +++ b/src/state.gd @@ -1,6 +1,7 @@ class_name State extends Node +export var debug_state: bool = false export var timeout_seconds: float = 0.0 # Declare member variables here. Examples: diff --git a/src/state_animated_actor.gd b/src/state_animated_actor.gd index 4d297f8..a001c6a 100644 --- a/src/state_animated_actor.gd +++ b/src/state_animated_actor.gd @@ -40,6 +40,7 @@ var parent: KinematicBody2D func _ready(): + ##TODO: this bit me in the butt. Should add a safety or something. # Only add timout node if timer value was specified. if(timeout_seconds > 0.0): state_timeout = Timer.new() @@ -53,7 +54,9 @@ func enter() -> void: # animations.connect("animation_finished", self, "_on_AnimatedSprite_animation_finished") # Reset animation suffix in case there isn't one animation_suffix = '' - print(parent.name, " entering State: ", self.name) + if debug_state: + print(parent.name, " entering State: ", self.name) + move_component.current_movement_state = self.name #modifier_stack_ref = state_modifiers if modifier_stack_ref.empty() == false: if modifier_stack_ref[-1].animation_name != '': @@ -92,8 +95,16 @@ func process_frame(_delta: float) -> State: return null func process_physics(_delta: float) -> State: + move_actor_as_desired(_delta) return null #func _on_AnimatedSprite_animation_finished(): # if animations.frames.get_animation_loop(animations.animation) == false: # animation_index += 1 + +func move_actor_as_desired(delta: float): + parent.velocity.y += gravity * delta + #parent.velocity = parent.move_and_slide(parent.velocity, Vector2(0, -1)) + parent.velocity.x = move_component.desired_movement_vector.x * move_speed + parent.velocity = parent.move_and_slide(parent.velocity, Vector2(0, -1)) + diff --git a/src/templates/Actor/ActorTemplate.gd b/src/templates/Actor/ActorTemplate.gd index a1c40bb..9feccaf 100644 --- a/src/templates/Actor/ActorTemplate.gd +++ b/src/templates/Actor/ActorTemplate.gd @@ -44,6 +44,7 @@ func _physics_process(delta: float) -> void: #self.scale.x = -1 func _process(delta: float) -> void: + movement_component.process(delta) movement_state_machine.process_frame(delta) play_sound_frame(movement_animations.animation , movement_animations.frame) diff --git a/src/templates/Actor/ActorTemplate.tscn b/src/templates/Actor/ActorTemplate.tscn index 49301ce..ef97d5d 100644 --- a/src/templates/Actor/ActorTemplate.tscn +++ b/src/templates/Actor/ActorTemplate.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=16 format=2] +[gd_scene load_steps=17 format=2] [ext_resource path="res://src/components/Hurtbox_Component.tscn" type="PackedScene" id=1] [ext_resource path="res://src/state_machine_animated_actor.gd" type="Script" id=2] @@ -6,6 +6,7 @@ [ext_resource path="res://src/templates/Actor/states/idle.gd" type="Script" id=4] [ext_resource path="res://src/movement_component.gd" type="Script" id=5] [ext_resource path="res://src/templates/Actor/resources/Smiley.png" type="Texture" id=6] +[ext_resource path="res://src/templates/Actor/states/move.gd" type="Script" id=7] [ext_resource path="res://src/templates/Actor/ActorTemplate.gd" type="Script" id=12] [sub_resource type="AtlasTexture" id=76] @@ -49,7 +50,7 @@ script = ExtResource( 12 ) [node name="AnimatedSprite" type="AnimatedSprite" parent="."] frames = SubResource( 75 ) -frame = 2 +frame = 4 playing = true flip_h = true __meta__ = { @@ -86,6 +87,12 @@ script = ExtResource( 3 ) animation_sequence = [ "default" ] idle_node = NodePath("../idle") +[node name="move" type="Node" parent="movement_state_machine"] +script = ExtResource( 7 ) +animation_sequence = [ "default" ] +fall_node = NodePath("../fall") +idle_node = NodePath("../idle") + [node name="Hurtbox_Component" parent="." instance=ExtResource( 1 )] [node name="SE_Player" type="AudioStreamPlayer" parent="."] diff --git a/src/templates/Actor/states/move.gd b/src/templates/Actor/states/move.gd new file mode 100644 index 0000000..ecc6a77 --- /dev/null +++ b/src/templates/Actor/states/move.gd @@ -0,0 +1,25 @@ +extends StateAnimatedActor + +export (NodePath) var fall_node +export (NodePath) var idle_node + +onready var fall_state: State = get_node(fall_node) +onready var idle_state: State = get_node(idle_node) + +func process_physics(delta: float) -> State: + + move_actor_as_desired(delta) + + if parent.velocity.x == 0.0: + return idle_state + else: + if parent.velocity.x > 0: + parent.direction.x = 1 + elif parent.velocity.x < 0: + parent.direction.x = -1 + + parent.transform.x.x = parent.direction.x + + if !parent.is_on_floor(): + return fall_state + return null