diff --git a/assets/Mega.png b/assets/Mega.png index 31b1659..cdce15d 100644 Binary files a/assets/Mega.png and b/assets/Mega.png differ diff --git a/src/playerD/Player.tscn b/src/playerD/Player.tscn index 0ebb669..f86f2c6 100644 --- a/src/playerD/Player.tscn +++ b/src/playerD/Player.tscn @@ -169,179 +169,179 @@ region = Rect2( 1200, 1600, 240, 160 ) [sub_resource type="AtlasTexture" id=128] atlas = SubResource( 90 ) -region = Rect2( 2400, 0, 240, 160 ) +region = Rect2( 240, 160, 240, 160 ) [sub_resource type="AtlasTexture" id=129] atlas = SubResource( 90 ) -region = Rect2( 0, 160, 240, 160 ) +region = Rect2( 1680, 160, 240, 160 ) [sub_resource type="AtlasTexture" id=130] atlas = SubResource( 90 ) -region = Rect2( 240, 160, 240, 160 ) +region = Rect2( 1920, 160, 240, 160 ) [sub_resource type="AtlasTexture" id=131] atlas = SubResource( 90 ) -region = Rect2( 1680, 160, 240, 160 ) +region = Rect2( 2160, 160, 240, 160 ) [sub_resource type="AtlasTexture" id=132] atlas = SubResource( 90 ) -region = Rect2( 1920, 160, 240, 160 ) +region = Rect2( 2400, 160, 240, 160 ) [sub_resource type="AtlasTexture" id=133] atlas = SubResource( 90 ) -region = Rect2( 2160, 160, 240, 160 ) +region = Rect2( 0, 320, 240, 160 ) [sub_resource type="AtlasTexture" id=134] atlas = SubResource( 90 ) -region = Rect2( 2400, 160, 240, 160 ) +region = Rect2( 240, 320, 240, 160 ) [sub_resource type="AtlasTexture" id=135] atlas = SubResource( 90 ) -region = Rect2( 0, 320, 240, 160 ) +region = Rect2( 480, 320, 240, 160 ) [sub_resource type="AtlasTexture" id=136] atlas = SubResource( 90 ) -region = Rect2( 240, 320, 240, 160 ) +region = Rect2( 720, 320, 240, 160 ) [sub_resource type="AtlasTexture" id=137] atlas = SubResource( 90 ) -region = Rect2( 480, 320, 240, 160 ) +region = Rect2( 960, 320, 240, 160 ) [sub_resource type="AtlasTexture" id=138] atlas = SubResource( 90 ) -region = Rect2( 960, 320, 240, 160 ) +region = Rect2( 1200, 320, 240, 160 ) [sub_resource type="AtlasTexture" id=139] atlas = SubResource( 90 ) -region = Rect2( 1200, 320, 240, 160 ) +region = Rect2( 1680, 640, 240, 160 ) [sub_resource type="AtlasTexture" id=140] atlas = SubResource( 90 ) -region = Rect2( 1440, 320, 240, 160 ) +region = Rect2( 1920, 640, 240, 160 ) [sub_resource type="AtlasTexture" id=141] atlas = SubResource( 90 ) -region = Rect2( 1680, 640, 240, 160 ) +region = Rect2( 2160, 640, 240, 160 ) [sub_resource type="AtlasTexture" id=142] atlas = SubResource( 90 ) -region = Rect2( 1920, 640, 240, 160 ) +region = Rect2( 2400, 640, 240, 160 ) [sub_resource type="AtlasTexture" id=143] atlas = SubResource( 90 ) -region = Rect2( 2160, 640, 240, 160 ) +region = Rect2( 0, 800, 240, 160 ) [sub_resource type="AtlasTexture" id=144] atlas = SubResource( 90 ) -region = Rect2( 2400, 640, 240, 160 ) +region = Rect2( 240, 800, 240, 160 ) [sub_resource type="AtlasTexture" id=145] atlas = SubResource( 90 ) -region = Rect2( 0, 800, 240, 160 ) +region = Rect2( 480, 800, 240, 160 ) [sub_resource type="AtlasTexture" id=146] atlas = SubResource( 90 ) -region = Rect2( 240, 800, 240, 160 ) +region = Rect2( 720, 800, 240, 160 ) [sub_resource type="AtlasTexture" id=147] atlas = SubResource( 90 ) -region = Rect2( 480, 800, 240, 160 ) +region = Rect2( 960, 800, 240, 160 ) [sub_resource type="AtlasTexture" id=148] atlas = SubResource( 90 ) -region = Rect2( 720, 800, 240, 160 ) +region = Rect2( 1200, 800, 240, 160 ) [sub_resource type="AtlasTexture" id=149] atlas = SubResource( 90 ) -region = Rect2( 960, 800, 240, 160 ) +region = Rect2( 1440, 800, 240, 160 ) [sub_resource type="AtlasTexture" id=150] atlas = SubResource( 90 ) -region = Rect2( 1200, 800, 240, 160 ) +region = Rect2( 1920, 320, 240, 160 ) [sub_resource type="AtlasTexture" id=151] atlas = SubResource( 90 ) -region = Rect2( 1440, 800, 240, 160 ) +region = Rect2( 2160, 320, 240, 160 ) [sub_resource type="AtlasTexture" id=152] atlas = SubResource( 90 ) -region = Rect2( 1920, 320, 240, 160 ) +region = Rect2( 2400, 320, 240, 160 ) [sub_resource type="AtlasTexture" id=153] atlas = SubResource( 90 ) -region = Rect2( 2160, 320, 240, 160 ) +region = Rect2( 0, 480, 240, 160 ) [sub_resource type="AtlasTexture" id=154] atlas = SubResource( 90 ) -region = Rect2( 2400, 320, 240, 160 ) +region = Rect2( 240, 480, 240, 160 ) [sub_resource type="AtlasTexture" id=155] atlas = SubResource( 90 ) -region = Rect2( 0, 480, 240, 160 ) +region = Rect2( 480, 480, 240, 160 ) [sub_resource type="AtlasTexture" id=156] atlas = SubResource( 90 ) -region = Rect2( 240, 480, 240, 160 ) +region = Rect2( 720, 480, 240, 160 ) [sub_resource type="AtlasTexture" id=157] atlas = SubResource( 90 ) -region = Rect2( 480, 480, 240, 160 ) +region = Rect2( 960, 480, 240, 160 ) [sub_resource type="AtlasTexture" id=158] atlas = SubResource( 90 ) -region = Rect2( 720, 480, 240, 160 ) +region = Rect2( 1200, 480, 240, 160 ) [sub_resource type="AtlasTexture" id=159] atlas = SubResource( 90 ) -region = Rect2( 960, 480, 240, 160 ) +region = Rect2( 1440, 480, 240, 160 ) [sub_resource type="AtlasTexture" id=160] atlas = SubResource( 90 ) -region = Rect2( 1200, 480, 240, 160 ) +region = Rect2( 1920, 480, 240, 160 ) [sub_resource type="AtlasTexture" id=161] atlas = SubResource( 90 ) -region = Rect2( 1440, 480, 240, 160 ) +region = Rect2( 2160, 480, 240, 160 ) [sub_resource type="AtlasTexture" id=162] atlas = SubResource( 90 ) -region = Rect2( 1920, 480, 240, 160 ) +region = Rect2( 2400, 480, 240, 160 ) [sub_resource type="AtlasTexture" id=163] atlas = SubResource( 90 ) -region = Rect2( 2160, 480, 240, 160 ) +region = Rect2( 0, 640, 240, 160 ) [sub_resource type="AtlasTexture" id=164] atlas = SubResource( 90 ) -region = Rect2( 2400, 480, 240, 160 ) +region = Rect2( 240, 640, 240, 160 ) [sub_resource type="AtlasTexture" id=165] atlas = SubResource( 90 ) -region = Rect2( 0, 640, 240, 160 ) +region = Rect2( 480, 640, 240, 160 ) [sub_resource type="AtlasTexture" id=166] atlas = SubResource( 90 ) -region = Rect2( 240, 640, 240, 160 ) +region = Rect2( 720, 640, 240, 160 ) [sub_resource type="AtlasTexture" id=167] atlas = SubResource( 90 ) -region = Rect2( 480, 640, 240, 160 ) +region = Rect2( 960, 640, 240, 160 ) [sub_resource type="AtlasTexture" id=168] atlas = SubResource( 90 ) -region = Rect2( 720, 640, 240, 160 ) +region = Rect2( 1200, 640, 240, 160 ) [sub_resource type="AtlasTexture" id=169] atlas = SubResource( 90 ) -region = Rect2( 960, 640, 240, 160 ) +region = Rect2( 1440, 640, 240, 160 ) [sub_resource type="AtlasTexture" id=170] atlas = SubResource( 90 ) -region = Rect2( 1200, 640, 240, 160 ) +region = Rect2( 2400, 0, 240, 160 ) [sub_resource type="AtlasTexture" id=171] atlas = SubResource( 90 ) -region = Rect2( 1440, 640, 240, 160 ) +region = Rect2( 0, 160, 240, 160 ) [sub_resource type="AtlasTexture" id=172] atlas = SubResource( 90 ) @@ -479,36 +479,41 @@ animations = [ { "name": "idle_shield", "speed": 10.0 }, { -"frames": [ SubResource( 128 ), SubResource( 129 ), SubResource( 130 ) ], +"frames": [ SubResource( 128 ) ], "loop": false, "name": "idle_shoot", "speed": 10.0 }, { -"frames": [ SubResource( 131 ), SubResource( 132 ), SubResource( 133 ), SubResource( 134 ), SubResource( 132 ), SubResource( 135 ), SubResource( 136 ), SubResource( 137 ) ], +"frames": [ SubResource( 129 ), SubResource( 130 ), SubResource( 131 ), SubResource( 132 ), SubResource( 130 ), SubResource( 133 ), SubResource( 134 ), SubResource( 135 ) ], "loop": false, "name": "jump", "speed": 10.0 }, { -"frames": [ SubResource( 138 ), SubResource( 138 ), SubResource( 138 ), SubResource( 138 ), SubResource( 138 ), SubResource( 138 ), SubResource( 139 ), SubResource( 140 ) ], +"frames": [ SubResource( 136 ), SubResource( 136 ), SubResource( 136 ), SubResource( 136 ), SubResource( 136 ), SubResource( 136 ), SubResource( 137 ), SubResource( 138 ) ], "loop": false, "name": "jump_shoot", "speed": 10.0 }, { -"frames": [ SubResource( 141 ), SubResource( 142 ), SubResource( 143 ), SubResource( 144 ), SubResource( 145 ), SubResource( 146 ), SubResource( 147 ), SubResource( 148 ), SubResource( 149 ), SubResource( 150 ), SubResource( 151 ) ], +"frames": [ SubResource( 139 ), SubResource( 140 ), SubResource( 141 ), SubResource( 142 ), SubResource( 143 ), SubResource( 144 ), SubResource( 145 ), SubResource( 146 ), SubResource( 147 ), SubResource( 148 ), SubResource( 149 ) ], "loop": false, "name": "roll", "speed": 10.0 }, { -"frames": [ SubResource( 152 ), SubResource( 153 ), SubResource( 154 ), SubResource( 155 ), SubResource( 156 ), SubResource( 157 ), SubResource( 158 ), SubResource( 159 ), SubResource( 160 ), SubResource( 161 ) ], +"frames": [ SubResource( 150 ), SubResource( 151 ), SubResource( 152 ), SubResource( 153 ), SubResource( 154 ), SubResource( 155 ), SubResource( 156 ), SubResource( 157 ), SubResource( 158 ), SubResource( 159 ) ], "loop": true, "name": "run", "speed": 10.0 }, { -"frames": [ SubResource( 162 ), SubResource( 163 ), SubResource( 164 ), SubResource( 165 ), SubResource( 166 ), SubResource( 167 ), SubResource( 168 ), SubResource( 169 ), SubResource( 170 ), SubResource( 171 ) ], +"frames": [ SubResource( 160 ), SubResource( 161 ), SubResource( 162 ), SubResource( 163 ), SubResource( 164 ), SubResource( 165 ), SubResource( 166 ), SubResource( 167 ), SubResource( 168 ), SubResource( 169 ) ], "loop": true, "name": "run_shoot", "speed": 10.0 }, { +"frames": [ SubResource( 170 ), SubResource( 171 ), SubResource( 128 ) ], +"loop": false, +"name": "shoot", +"speed": 10.0 +}, { "frames": [ SubResource( 172 ), SubResource( 173 ), SubResource( 174 ), SubResource( 174 ), SubResource( 175 ), SubResource( 176 ), SubResource( 177 ), SubResource( 178 ), SubResource( 178 ), SubResource( 179 ), SubResource( 180 ), SubResource( 181 ), SubResource( 182 ), SubResource( 183 ), SubResource( 184 ), SubResource( 185 ), SubResource( 186 ), SubResource( 187 ), SubResource( 188 ), SubResource( 189 ), SubResource( 190 ), SubResource( 191 ) ], "loop": true, "name": "slash", @@ -542,7 +547,7 @@ player_number = 1 position = Vector2( -1, -51 ) frames = SubResource( 198 ) animation = "idle_shoot" -frame = 2 +frame = 0 flip_h = false __meta__ = { "_aseprite_wizard_config_": { @@ -562,12 +567,8 @@ script = ExtResource( 2 ) player_number = 1 interactable_node = NodePath("../Interactable_Receiver") -[node name="movement_state_machine" parent="." index="3"] -debug_state_machine = true - [node name="idle" parent="movement_state_machine" index="0"] script = ExtResource( 4 ) -debug_state = true move_speed = 1.0 animation_sequence = [ "idle" ] jump_node = NodePath("../jump") @@ -601,6 +602,9 @@ jump_force = 250.0 [node name="attack" type="Node" parent="movement_state_machine" index="4"] script = ExtResource( 10 ) +debug_state = true +timeout_seconds = 1.5 +animation_sequence = [ "shoot" ] jump_node = NodePath("../jump") idle_node = NodePath("../idle") fall_node = NodePath("../fall") diff --git a/src/playerD/states/attack.gd b/src/playerD/states/attack.gd index 9d66e49..252d741 100644 --- a/src/playerD/states/attack.gd +++ b/src/playerD/states/attack.gd @@ -18,24 +18,36 @@ signal do_attack() var draw_weapon_modifier: StateModifier +func _ready(): + state_timeout.connect("timeout", self, "disable_cooldown") + + +func disable_cooldown(): + print("It's butt kicking time!") + state_ready = true + func enter() -> void: - #.enter() + if modifier: + if modifier.get_instance_id() == draw_weapon_modifier.get_instance_id(): + print ("They the same cannot apply modifier: ", draw_weapon_modifier.get_instance_id()) + modifier = null + .enter() ##TODO: Turn this to clear only the animation modifiers. # modifier_stack_ref.clear() - mod_animation_sequence.clear() - #mod_animation_sequence = animation_sequence.duplicate(true) - mod_animation_sequence.append_array(animation_sequence) - # Reset animation suffix in case there isn't one - animation_suffix = '_shoot' - animation_index = 0 - current_animation_sequence = 0 - #var enter_animation = '' - var enter_frame = 0 - - if debug_state: - print(parent.name, " entering State: ", self.name) - move_component.current_movement_state = self.name - emit_signal("state_entered") +# mod_animation_sequence.clear() +# #mod_animation_sequence = animation_sequence.duplicate(true) +# mod_animation_sequence.append_array(animation_sequence) +# # Reset animation suffix in case there isn't one +# animation_suffix = '_shoot' +# animation_index = 0 +# current_animation_sequence = 0 +# #var enter_animation = '' +# var enter_frame = 0 +# +# if debug_state: +# print(parent.name, " entering State: ", self.name) +# move_component.current_movement_state = self.name +# emit_signal("state_entered") can_fire = true # if modifier_stack_ref.has($"../draw_weapon") == false: @@ -46,7 +58,9 @@ func enter() -> void: previous_state_frame_number, " ", previous_state_name) match previous_animation_name: "idle": - animations.play("idle_shoot") + #animations.play("idle_shoot") + if debug_state: + print("no need to change idle animation") "run": animations.play("run_shoot") animations.frame = previous_state_frame_number @@ -65,6 +79,8 @@ func enter() -> void: # An example where the current node subscribes #mod_timer.connect("timeout", self, "_on_Timer_timeout") + state_timeout.start() + state_ready = false animation_finished = false func _on_Timer_timeout(): @@ -73,11 +89,9 @@ func _on_Timer_timeout(): func process_frame(delta: float) -> State: if animation_finished: - print("WTF!?!! Finish already!") draw_weapon_modifier.state_timeout.start() modifier = draw_weapon_modifier return idle_state - .process_frame(delta) # if animations.frame == 2: # animations.stop() # if state_timeout.time_left == 0 and animations.animation == "shoot": @@ -117,11 +131,3 @@ func process_physics(delta: float) -> State: return null -func exit() -> void: - # force timer reset -# weapon_state_modifier.state_timeout.start() -# push_animation_state_modifier(weapon_state_modifier) - #$"../draw_weapon".state_timeout.start() - - return - diff --git a/src/state.gd b/src/state.gd index 1c26a4e..640d7c1 100644 --- a/src/state.gd +++ b/src/state.gd @@ -10,6 +10,7 @@ signal state_exited() # Declare member variables here. Examples: #var modifier_stack_ref: Array # Well this didn't work var state_timeout: Timer +var state_ready: bool = true # Called when the node enters the scene tree for the first time. func _ready(): diff --git a/src/state_animated_actor.gd b/src/state_animated_actor.gd index db3d9fb..ad05ece 100644 --- a/src/state_animated_actor.gd +++ b/src/state_animated_actor.gd @@ -31,7 +31,6 @@ var frame_signal_emitted: bool = false var animation_finished: bool = false -var transition_state: StateAnimatedActor # this just wouldn't work well. Maybe I can try a resource # export(Array, NodePath) var transition_state_nodes @@ -123,6 +122,24 @@ func update_animation(enter_frame := 0, index := 0, suffix := ''): mod_animation_sequence.push_back(modifier.animation_name) enter_frame = modifier.starting_frame + # Some safety checks with supplied update parameters + if animation_index != 0: + if mod_animation_sequence.size() < animation_index + 1: + if debug_state: + print("Warning!: attempting to set to non-existant index ") + animation_index = 0 + current_animation_sequence = animation_index + + if animations.frames.has_animation(mod_animation_sequence[animation_index] + animation_suffix) == false: + if debug_state: + print("Warning!: Animation doesn't exist! ") + + if enter_frame != 0: + if animations.frames.get_frame_count(animations.animation) != animations.frames.get_frame_count(mod_animation_sequence[animation_index] + animation_suffix): + if debug_state: + print("Warning!: attempting to set a mismatched frame ") + enter_frame = 0 + if mod_animation_sequence.size() > 0: if debug_state: print("Starting Animation: " , mod_animation_sequence[animation_index] + animation_suffix) @@ -135,55 +152,57 @@ func update_animation(enter_frame := 0, index := 0, suffix := ''): func enter() -> void: - mod_animation_sequence.clear() - #mod_animation_sequence = animation_sequence.duplicate(true) - mod_animation_sequence.append_array(animation_sequence) - # Reset animation suffix in case there isn't one - animation_suffix = '' - animation_index = 0 - current_animation_sequence = 0 - #var enter_animation = '' - var enter_frame = 0 +# mod_animation_sequence.clear() +# #mod_animation_sequence = animation_sequence.duplicate(true) +# mod_animation_sequence.append_array(animation_sequence) +# # Reset animation suffix in case there isn't one +# animation_suffix = '' +# animation_index = 0 +# current_animation_sequence = 0 +# #var enter_animation = '' +# var enter_frame = 0 if debug_state: print(parent.name, " entering State: ", self.name) move_component.current_movement_state = self.name emit_signal("state_entered") #modifier_stack_ref = state_modifiers + update_animation() - if modifier != null: -# if modifier.modifier_type == modifier.TYPE.EXIT_ANIMATION: -# #print("OHHH Modifier Applies! ", modifier.animation_name) -# mod_animation_sequence.push_front(modifier.animation_name) -# enter_frame = modifier.starting_frame - match modifier.modifier_type: - modifier.TYPE.EXIT_ANIMATION: - mod_animation_sequence.push_front(modifier.animation_name) - enter_frame = modifier.starting_frame - - modifier.TYPE.ANIMATION_SUFFIX: - if animations.frames.has_animation(mod_animation_sequence[animation_index] + modifier.animation_name): - animation_suffix = modifier.animation_name - else: - print("Warning!: Modifier attempting to apply suffix that doesn't exist ", - mod_animation_sequence[animation_index] + modifier.animation_name) - - modifier.TYPE.REPLACE_ANIMATION: - #animations.play(modifier_stack_ref[i].animation_name) - #animations.frame = modifier_stack_ref[i].starting_frame - mod_animation_sequence.clear() - mod_animation_sequence.push_back(modifier.animation_name) - enter_frame = modifier.starting_frame - - if mod_animation_sequence.size() > 0: - if debug_state: - print("Starting Animation: " , mod_animation_sequence[animation_index] + animation_suffix) - animations.play(mod_animation_sequence[animation_index] + animation_suffix) - #TODO: maybe check current animatio has this frame - animations.frame = enter_frame - else: - print("Error! Resolved to empty animation sequence!?") - return +# if modifier != null: +## if modifier.modifier_type == modifier.TYPE.EXIT_ANIMATION: +## #print("OHHH Modifier Applies! ", modifier.animation_name) +## mod_animation_sequence.push_front(modifier.animation_name) +## enter_frame = modifier.starting_frame +# match modifier.modifier_type: +# modifier.TYPE.EXIT_ANIMATION: +# mod_animation_sequence.push_front(modifier.animation_name) +# enter_frame = modifier.starting_frame +# +# modifier.TYPE.ANIMATION_SUFFIX: +# if animations.frames.has_animation(mod_animation_sequence[animation_index] + modifier.animation_name): +# animation_suffix = modifier.animation_name +# else: +# print("Warning!: Modifier attempting to apply suffix that doesn't exist ", +# mod_animation_sequence[animation_index] + modifier.animation_name) +# +# modifier.TYPE.REPLACE_ANIMATION: +# #animations.play(modifier_stack_ref[i].animation_name) +# #animations.frame = modifier_stack_ref[i].starting_frame +# mod_animation_sequence.clear() +# mod_animation_sequence.push_back(modifier.animation_name) +# enter_frame = modifier.starting_frame +# +# if mod_animation_sequence.size() > 0: +# if debug_state: +# print("Starting Animation: " , mod_animation_sequence[animation_index] + animation_suffix , +# " frame count ", animations.frames.get_frame_count(mod_animation_sequence[animation_index] + animation_suffix)) +# animations.play(mod_animation_sequence[animation_index] + animation_suffix) +# #TODO: maybe check current animatio has this frame +# animations.frame = enter_frame +# else: +# print("Error! Resolved to empty animation sequence!?") +# return # A new attempt at animation modifiers @@ -237,14 +256,14 @@ func enter() -> void: # animations.frame = modifier_stack_ref[-1].starting_frame # return - if mod_animation_sequence.size() > 0: - if debug_state: - print("Starting Animation: " , mod_animation_sequence[animation_index] + animation_suffix) - animations.play(mod_animation_sequence[animation_index] + animation_suffix) - #TODO: maybe check current animatio has this frame - animations.frame = enter_frame - else: - print("Error! Resolved to empty animation sequence!?") +# if mod_animation_sequence.size() > 0: +# if debug_state: +# print("Starting Animation: " , mod_animation_sequence[animation_index] + animation_suffix) +# animations.play(mod_animation_sequence[animation_index] + animation_suffix) +# #TODO: maybe check current animatio has this frame +# animations.frame = enter_frame +# else: +# print("Error! Resolved to empty animation sequence!?") return func exit() -> void: @@ -267,17 +286,38 @@ func transfer_modifiers(exiting_state_modifier : StateModifier): func process_input(_event: InputEvent) -> State: return null -func process_frame(_delta: float) -> State: +func process_animations(): if modifier != null: if modifier.state_timeout and modifier.state_timeout.time_left == 0: print("Expired Modifier, updating animation.") - modifier = null - update_animation() + #modifier = null + match modifier.modifier_type: + + modifier.TYPE.ANIMATION_SUFFIX: + # Attempt to seemlessly transition animations. + modifier = null + update_animation(animations.frame,animation_index) + + modifier.TYPE.REPLACE_ANIMATION: + if debug_state: + print("I don't have anything for replacements yet.") + modifier = null + update_animation() + _: + modifier = null + return - #if animation_sequence.size() > 0 and current_animation_sequence != animation_index: - if mod_animation_sequence.size() > animation_index and current_animation_sequence != animation_index: + # We have no more sequence animations and the current one doesn't loop + # we do this to prevent the default idle animation from playing. + ##TODO: between this and the signal based iterator I get some really strange behavior + if animation_index >= mod_animation_sequence.size() and animations.frames.get_animation_loop( + animations.animation) == false: + #print(animations.animation, " Animation Stopped") + animations.stop() + #animation_finished = true + elif mod_animation_sequence.size() > animation_index and current_animation_sequence != animation_index: #TODO: why was I doing this # if animation_index >= mod_animation_sequence.size(): # animation_index = 0 @@ -288,12 +328,7 @@ func process_frame(_delta: float) -> State: animations.animation , " (", animation_index, ")") current_animation_sequence = animation_index - # We have no more sequence animations and the current one doesn't loop - # we do this to prevent the default idle animation from playing. - if animation_index >= mod_animation_sequence.size() and animations.frames.get_animation_loop( - animations.animation) == false: - animations.stop() - animation_finished = true + ##TODO: Could probably add some more checks here. # Singal based frame call. if emitter_frame_subscriptions.has(animations.frame): @@ -305,6 +340,7 @@ func process_frame(_delta: float) -> State: else: frame_signal_emitted = false +func process_frame(_delta: float) -> State: return null func process_physics(_delta: float) -> State: diff --git a/src/state_machine_animated_actor.gd b/src/state_machine_animated_actor.gd index 3eded61..f5daac8 100644 --- a/src/state_machine_animated_actor.gd +++ b/src/state_machine_animated_actor.gd @@ -1,6 +1,9 @@ class_name StateMachineAnimatedActor extends StateMachine func change_state(new_state: State) -> void: + if new_state.state_ready == false: + # Don't transition to unready state + return if current_state: current_state.exit() # Set parameters for information @@ -79,15 +82,16 @@ func process_frame(delta: float) -> void: # if debug_state_machine: # print("Pop State Modifier: ", state_modifiers[i].name) # state_modifiers.pop_at(i) - + if current_state is StateAnimatedActor: + current_state.process_animations() var new_state = current_state.process_frame(delta) if new_state: change_state(new_state) func _on_AnimatedSprite_animation_finished(): - if debug_state_machine: - print("Stop!!!!!") +# if debug_state_machine: +# print("Stop!!!!!") ##TODO: # It's hard to pop an exit animation off when it's stacked with another kind of animation. # for i in state_modifiers.size(): @@ -100,13 +104,17 @@ func _on_AnimatedSprite_animation_finished(): # current_state.animation_index += 1 # break - if current_state is StateAnimatedActor: - current_state.animation_finished = true +# if current_state is StateAnimatedActor: +# current_state.animation_finished = true if current_state.animations.frames.get_animation_loop( current_state.animations.animation) == false: + print("Stop!!!!!", current_state.animation_sequence.size(), " - ", current_state.animation_index) if current_state.animation_sequence.size() > 0: print("<-- next anim.") current_state.animation_index += 1 + if current_state.animation_index >= current_state.animation_sequence.size(): + print("Stop!!!!!") + current_state.animation_finished = true