81 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
#!/usr/bin/env python3
 | 
						|
"""
 | 
						|
Demonstration of animation callbacks solving race conditions.
 | 
						|
Shows how callbacks enable direct causality for game state changes.
 | 
						|
"""
 | 
						|
 | 
						|
import mcrfpy
 | 
						|
 | 
						|
# Game state
 | 
						|
player_moving = False
 | 
						|
move_queue = []
 | 
						|
 | 
						|
def movement_complete(anim, target):
 | 
						|
    """Called when player movement animation completes"""
 | 
						|
    global player_moving, move_queue
 | 
						|
    
 | 
						|
    print("Movement animation completed!")
 | 
						|
    player_moving = False
 | 
						|
    
 | 
						|
    # Process next move if queued
 | 
						|
    if move_queue:
 | 
						|
        next_pos = move_queue.pop(0)
 | 
						|
        move_player_to(next_pos)
 | 
						|
    else:
 | 
						|
        print("Player is now idle and ready for input")
 | 
						|
 | 
						|
def move_player_to(new_pos):
 | 
						|
    """Move player with animation and proper state management"""
 | 
						|
    global player_moving
 | 
						|
    
 | 
						|
    if player_moving:
 | 
						|
        print(f"Queueing move to {new_pos}")
 | 
						|
        move_queue.append(new_pos)
 | 
						|
        return
 | 
						|
    
 | 
						|
    player_moving = True
 | 
						|
    print(f"Moving player to {new_pos}")
 | 
						|
    
 | 
						|
    # Get player entity (placeholder for demo)
 | 
						|
    ui = mcrfpy.sceneUI("game")
 | 
						|
    player = ui[0]  # Assume first element is player
 | 
						|
    
 | 
						|
    # Animate movement with callback
 | 
						|
    x, y = new_pos
 | 
						|
    anim_x = mcrfpy.Animation("x", float(x), 0.5, "easeInOutQuad", callback=movement_complete)
 | 
						|
    anim_y = mcrfpy.Animation("y", float(y), 0.5, "easeInOutQuad")
 | 
						|
    
 | 
						|
    anim_x.start(player)
 | 
						|
    anim_y.start(player)
 | 
						|
 | 
						|
def setup_demo():
 | 
						|
    """Set up the demo scene"""
 | 
						|
    # Create scene
 | 
						|
    mcrfpy.createScene("game")
 | 
						|
    mcrfpy.setScene("game")
 | 
						|
    
 | 
						|
    # Create player sprite
 | 
						|
    player = mcrfpy.Frame((100, 100), (32, 32), fill_color=(0, 255, 0))
 | 
						|
    ui = mcrfpy.sceneUI("game")
 | 
						|
    ui.append(player)
 | 
						|
    
 | 
						|
    print("Demo: Animation callbacks for movement queue")
 | 
						|
    print("=" * 40)
 | 
						|
    
 | 
						|
    # Simulate rapid movement commands
 | 
						|
    mcrfpy.setTimer("move1", lambda r: move_player_to((200, 100)), 100)
 | 
						|
    mcrfpy.setTimer("move2", lambda r: move_player_to((200, 200)), 200)  # Will be queued
 | 
						|
    mcrfpy.setTimer("move3", lambda r: move_player_to((100, 200)), 300)  # Will be queued
 | 
						|
    
 | 
						|
    # Exit after demo
 | 
						|
    mcrfpy.setTimer("exit", lambda r: exit_demo(), 3000)
 | 
						|
 | 
						|
def exit_demo():
 | 
						|
    """Exit the demo"""
 | 
						|
    print("\nDemo completed successfully!")
 | 
						|
    print("Callbacks ensure proper movement sequencing without race conditions")
 | 
						|
    import sys
 | 
						|
    sys.exit(0)
 | 
						|
 | 
						|
# Run the demo
 | 
						|
setup_demo() |