65 lines
No EOL
2 KiB
Python
65 lines
No EOL
2 KiB
Python
"""McRogueFace - Path Animation (Multi-Step Movement) (effects_path_animation)
|
|
|
|
Documentation: https://mcrogueface.github.io/cookbook/effects_path_animation
|
|
Repository: https://github.com/jmccardle/McRogueFace/blob/master/docs/cookbook/effects/effects_path_animation.py
|
|
|
|
This code is extracted from the McRogueFace documentation and can be
|
|
run directly with: ./mcrogueface path/to/this/file.py
|
|
"""
|
|
|
|
import mcrfpy
|
|
|
|
class CameraFollowingPath:
|
|
"""Path animator that also moves the camera."""
|
|
|
|
def __init__(self, entity, grid, path, step_duration=0.2):
|
|
self.entity = entity
|
|
self.grid = grid
|
|
self.path = path
|
|
self.step_duration = step_duration
|
|
self.index = 0
|
|
self.on_complete = None
|
|
|
|
def start(self):
|
|
self.index = 0
|
|
self._next()
|
|
|
|
def _next(self):
|
|
if self.index >= len(self.path):
|
|
if self.on_complete:
|
|
self.on_complete(self)
|
|
return
|
|
|
|
x, y = self.path[self.index]
|
|
|
|
def done(anim, target):
|
|
self.index += 1
|
|
self._next()
|
|
|
|
# Animate entity
|
|
if self.entity.x != x:
|
|
anim = mcrfpy.Animation("x", float(x), self.step_duration,
|
|
"easeInOut", callback=done)
|
|
anim.start(self.entity)
|
|
elif self.entity.y != y:
|
|
anim = mcrfpy.Animation("y", float(y), self.step_duration,
|
|
"easeInOut", callback=done)
|
|
anim.start(self.entity)
|
|
else:
|
|
done(None, None)
|
|
return
|
|
|
|
# Animate camera to follow
|
|
cam_x = mcrfpy.Animation("center_x", (x + 0.5) * 16,
|
|
self.step_duration, "easeInOut")
|
|
cam_y = mcrfpy.Animation("center_y", (y + 0.5) * 16,
|
|
self.step_duration, "easeInOut")
|
|
cam_x.start(self.grid)
|
|
cam_y.start(self.grid)
|
|
|
|
|
|
# Usage
|
|
path = [(5, 5), (5, 10), (10, 10)]
|
|
mover = CameraFollowingPath(player, grid, path)
|
|
mover.on_complete = lambda m: print("Journey complete!")
|
|
mover.start() |