124 lines
3.6 KiB
Python
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") |