McRogueFace/tests/unit/test_entity_fix.py

124 lines
3.6 KiB
Python

#!/usr/bin/env python3
"""
Test Entity Animation Fix
=========================
This test demonstrates the issue and proposes a fix.
The problem: UIEntity::setProperty updates sprite position incorrectly.
"""
import mcrfpy
import sys
print("Entity Animation Fix Test")
print("========================")
print()
print("ISSUE: When animating entity x/y properties, the sprite position")
print("is being set to grid coordinates instead of pixel coordinates.")
print()
print("In UIEntity::setProperty (lines 562 & 568):")
print(" sprite.setPosition(sf::Vector2f(position.x, position.y));")
print()
print("This should be removed because UIGrid::render() calculates")
print("the correct pixel position based on grid coordinates, zoom, etc.")
print()
print("FIX: Comment out or remove the sprite.setPosition calls in")
print("UIEntity::setProperty for 'x' and 'y' properties.")
print()
# Create scene to demonstrate
mcrfpy.createScene("fix_demo")
# Create grid
grid = mcrfpy.Grid(grid_x=15, grid_y=10)
grid.fill_color = mcrfpy.Color(20, 20, 30)
# Make floor
for y in range(10):
for x in range(15):
cell = grid.at(x, y)
cell.walkable = True
cell.transparent = True
cell.color = mcrfpy.Color(100, 100, 120)
# Create entity
entity = mcrfpy.Entity(2, 2, grid=grid)
entity.sprite_index = 64 # @
# UI
ui = mcrfpy.sceneUI("fix_demo")
ui.append(grid)
grid.position = (100, 150)
grid.size = (450, 300)
# Info displays
title = mcrfpy.Caption("Entity Animation Issue Demo", 250, 20)
title.fill_color = mcrfpy.Color(255, 255, 255)
ui.append(title)
pos_info = mcrfpy.Caption("", 100, 50)
pos_info.fill_color = mcrfpy.Color(255, 255, 100)
ui.append(pos_info)
sprite_info = mcrfpy.Caption("", 100, 70)
sprite_info.fill_color = mcrfpy.Color(255, 100, 100)
ui.append(sprite_info)
status = mcrfpy.Caption("Press SPACE to animate entity", 100, 100)
status.fill_color = mcrfpy.Color(200, 200, 200)
ui.append(status)
# Update display
def update_display(dt):
pos_info.text = f"Entity Grid Position: ({entity.x:.2f}, {entity.y:.2f})"
# We can't access sprite position from Python, but in C++ it would show
# the issue: sprite position would be (2, 2) instead of pixel coords
sprite_info.text = "Sprite position is incorrectly set to grid coords (see C++ code)"
# Test animation
def test_animation():
"""Animate entity to show the issue"""
print("\nAnimating entity from (2,2) to (10,5)")
# This animation will cause the sprite to appear at wrong position
# because setProperty sets sprite.position to (10, 5) instead of
# letting the grid calculate pixel position
anim_x = mcrfpy.Animation("x", 10.0, 2.0, "easeInOut")
anim_y = mcrfpy.Animation("y", 5.0, 2.0, "easeInOut")
anim_x.start(entity)
anim_y.start(entity)
status.text = "Animating... Entity may appear at wrong position!"
# Input handler
def handle_input(key, state):
if state != "start":
return
key = key.lower()
if key == "q":
sys.exit(0)
elif key == "space":
test_animation()
elif key == "r":
entity.x = 2
entity.y = 2
status.text = "Reset entity to (2,2)"
# Setup
mcrfpy.setScene("fix_demo")
mcrfpy.keypressScene(handle_input)
mcrfpy.setTimer("update", update_display, 100)
print("Ready to demonstrate the issue.")
print()
print("The fix is to remove these lines from UIEntity::setProperty:")
print(" Line 562: sprite.setPosition(sf::Vector2f(position.x, position.y));")
print(" Line 568: sprite.setPosition(sf::Vector2f(position.x, position.y));")
print()
print("Controls:")
print(" SPACE - Animate entity (will show incorrect behavior)")
print(" R - Reset position")
print(" Q - Quit")