animation loop parameter
This commit is contained in:
parent
550201d365
commit
29fe135161
12 changed files with 563 additions and 54 deletions
103
tests/unit/entity_framelist_test.py
Normal file
103
tests/unit/entity_framelist_test.py
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
"""Test Entity.animate() with list of int frame indices.
|
||||
|
||||
Verifies that Entity supports sprite frame list animation,
|
||||
including with loop=True.
|
||||
"""
|
||||
import mcrfpy
|
||||
import sys
|
||||
|
||||
PASS = True
|
||||
def check(name, condition):
|
||||
global PASS
|
||||
if not condition:
|
||||
print(f"FAIL: {name}")
|
||||
PASS = False
|
||||
else:
|
||||
print(f" ok: {name}")
|
||||
|
||||
|
||||
# --- Setup ---
|
||||
scene = mcrfpy.Scene("test")
|
||||
mcrfpy.current_scene = scene
|
||||
|
||||
# Create a grid with an entity
|
||||
tex = mcrfpy.Texture("assets/kenney_tinydungeon.png", 16, 16)
|
||||
grid = mcrfpy.Grid(grid_size=(10, 10), texture=tex, pos=(0, 0), size=(320, 320))
|
||||
scene.children.append(grid)
|
||||
|
||||
entity = mcrfpy.Entity(grid_pos=(1, 1), texture=tex, sprite_index=0)
|
||||
grid.entities.append(entity)
|
||||
|
||||
|
||||
# --- Test 1: Entity.animate with list target ---
|
||||
anim = entity.animate("sprite_index", [0, 1, 2, 3], 0.4)
|
||||
check("entity animate with list returns Animation", anim is not None)
|
||||
check("entity frame list anim has valid target", anim.hasValidTarget() == True)
|
||||
|
||||
# Step to complete
|
||||
for _ in range(10):
|
||||
mcrfpy.step(0.1)
|
||||
|
||||
check("entity frame list anim completes", anim.is_complete == True)
|
||||
|
||||
|
||||
# --- Test 2: Entity.animate with list + loop=True ---
|
||||
entity2 = mcrfpy.Entity(grid_pos=(2, 2), texture=tex, sprite_index=0)
|
||||
grid.entities.append(entity2)
|
||||
|
||||
anim2 = entity2.animate("sprite_index", [10, 11, 12, 13], 0.4, loop=True)
|
||||
check("entity loop frame list is_looping", anim2.is_looping == True)
|
||||
|
||||
# Step well past duration
|
||||
for _ in range(20):
|
||||
mcrfpy.step(0.1)
|
||||
|
||||
check("entity loop frame list doesn't complete", anim2.is_complete == False)
|
||||
|
||||
# The sprite_index should be one of the frame values
|
||||
idx = entity2.sprite_index
|
||||
check(f"entity sprite_index is valid frame ({idx})", idx in [10, 11, 12, 13])
|
||||
|
||||
|
||||
# --- Test 3: Invalid list items raise TypeError ---
|
||||
try:
|
||||
entity.animate("sprite_index", [1, 2, "bad", 4], 0.5)
|
||||
check("invalid list item raises TypeError", False)
|
||||
except TypeError:
|
||||
check("invalid list item raises TypeError", True)
|
||||
|
||||
|
||||
# --- Test 4: Entity.animate with int still works (no regression) ---
|
||||
entity3 = mcrfpy.Entity(grid_pos=(3, 3), texture=tex, sprite_index=0)
|
||||
grid.entities.append(entity3)
|
||||
|
||||
anim3 = entity3.animate("sprite_index", 5, 0.2)
|
||||
check("entity animate with int still works", anim3 is not None)
|
||||
|
||||
for _ in range(5):
|
||||
mcrfpy.step(0.1)
|
||||
|
||||
check("entity int anim completes", anim3.is_complete == True)
|
||||
check("entity sprite_index set to target", entity3.sprite_index == 5)
|
||||
|
||||
|
||||
# --- Test 5: Entity.animate with float still works (no regression) ---
|
||||
entity4 = mcrfpy.Entity(grid_pos=(4, 4), texture=tex, sprite_index=0)
|
||||
grid.entities.append(entity4)
|
||||
|
||||
anim4 = entity4.animate("draw_x", 5.0, 0.3)
|
||||
check("entity animate with float still works", anim4 is not None)
|
||||
|
||||
for _ in range(10):
|
||||
mcrfpy.step(0.1)
|
||||
|
||||
check("entity float anim completes", anim4.is_complete == True)
|
||||
|
||||
|
||||
# --- Summary ---
|
||||
if PASS:
|
||||
print("PASS")
|
||||
sys.exit(0)
|
||||
else:
|
||||
print("FAIL")
|
||||
sys.exit(1)
|
||||
Loading…
Add table
Add a link
Reference in a new issue