base.py 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. # coding: utf-8
  2. from pyglet.window import key
  3. from cocos.actions import MoveTo as BaseMoveTo
  4. from sandbox.tile.simulation.physics import TilePhysics
  5. from sandbox.tile.user_action import UserAction
  6. from synergine2.config import Config
  7. from synergine2.log import SynergineLogger
  8. from synergine2.terminals import Terminal
  9. from synergine2_cocos2d.actions import MoveTo
  10. # TODO NOW: MOVE
  11. from synergine2_cocos2d.animation import ANIMATION_CRAWL
  12. from synergine2_cocos2d.animation import ANIMATION_WALK
  13. from synergine2_cocos2d.animation import Animate
  14. from synergine2_cocos2d.gui import EditLayer as BaseEditLayer
  15. from synergine2_cocos2d.gui import TMXGui
  16. from synergine2_cocos2d.layer import LayerManager
  17. from synergine2_xyz.move.simulation import FinishMoveEvent
  18. from synergine2_xyz.move.simulation import StartMoveEvent
  19. from synergine2_xyz.physics import Matrixes
  20. from synergine2_xyz.utils import get_angle
  21. class EditLayer(BaseEditLayer):
  22. def __init__(self, *args, **kwargs) -> None:
  23. super().__init__(*args, **kwargs)
  24. self.matrixes = Matrixes()
  25. self.physics = TilePhysics(
  26. self.config,
  27. map_file_path='sandbox/tile/maps/003/003.tmx', # FIXME: HARDCODED
  28. )
  29. def _on_key_press(self, k, m):
  30. if self.selection:
  31. if k == key.M:
  32. self.user_action_pending = UserAction.ORDER_MOVE
  33. if k == key.R:
  34. self.user_action_pending = UserAction.ORDER_MOVE_FAST
  35. if k == key.C:
  36. self.user_action_pending = UserAction.ORDER_MOVE_CRAWL
  37. if k == key.F:
  38. self.user_action_pending = UserAction.ORDER_FIRE
  39. class TileLayerManager(LayerManager):
  40. edit_layer_class = EditLayer
  41. class Game(TMXGui):
  42. layer_manager_class = TileLayerManager
  43. def __init__(
  44. self,
  45. config: Config,
  46. logger: SynergineLogger,
  47. terminal: Terminal,
  48. read_queue_interval: float = 1 / 60.0,
  49. map_dir_path: str=None,
  50. ):
  51. super().__init__(
  52. config,
  53. logger,
  54. terminal,
  55. read_queue_interval,
  56. map_dir_path,
  57. )
  58. self.terminal.register_event_handler(
  59. FinishMoveEvent,
  60. self.set_subject_position,
  61. )
  62. self.terminal.register_event_handler(
  63. StartMoveEvent,
  64. self.start_move_subject,
  65. )
  66. # configs
  67. self.move_duration_ref = float(self.config.resolve('game.move.walk_ref_time'))
  68. self.move_fast_duration_ref = float(self.config.resolve('game.move.run_ref_time'))
  69. self.move_crawl_duration_ref = float(self.config.resolve('game.move.crawl_ref_time'))
  70. def before_run(self) -> None:
  71. from sandbox.tile.gui.move import MoveActorInteraction
  72. from sandbox.tile.gui.move import MoveFastActorInteraction
  73. from sandbox.tile.gui.move import MoveCrawlActorInteraction
  74. from sandbox.tile.gui.fire import FireActorInteraction
  75. self.layer_manager.interaction_manager.register(MoveActorInteraction, self.layer_manager)
  76. self.layer_manager.interaction_manager.register(MoveFastActorInteraction, self.layer_manager)
  77. self.layer_manager.interaction_manager.register(MoveCrawlActorInteraction, self.layer_manager)
  78. self.layer_manager.interaction_manager.register(FireActorInteraction, self.layer_manager)
  79. def set_subject_position(self, event: FinishMoveEvent):
  80. actor = self.layer_manager.subject_layer.subjects_index[event.subject_id]
  81. new_world_position = self.layer_manager.grid_manager.get_pixel_position_of_grid_position(event.to_position)
  82. actor.stop_actions((BaseMoveTo,))
  83. actor.set_position(*new_world_position)
  84. def start_move_subject(self, event: StartMoveEvent):
  85. actor = self.layer_manager.subject_layer.subjects_index[event.subject_id]
  86. new_world_position = self.layer_manager.grid_manager.get_pixel_position_of_grid_position(event.to_position)
  87. if event.gui_action == UserAction.ORDER_MOVE:
  88. animation = ANIMATION_WALK
  89. cycle_duration = 2
  90. move_duration = self.move_duration_ref
  91. elif event.gui_action == UserAction.ORDER_MOVE_FAST:
  92. animation = ANIMATION_WALK
  93. cycle_duration = 0.5
  94. move_duration = self.move_fast_duration_ref
  95. elif event.gui_action == UserAction.ORDER_MOVE_CRAWL:
  96. animation = ANIMATION_CRAWL
  97. cycle_duration = 2
  98. move_duration = self.move_crawl_duration_ref
  99. else:
  100. raise NotImplementedError()
  101. move_action = MoveTo(new_world_position, move_duration)
  102. actor.do(move_action)
  103. actor.do(Animate(animation, duration=move_duration, cycle_duration=cycle_duration))
  104. actor.rotation = get_angle(event.from_position, event.to_position)