gui.py 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. # coding: utf-8
  2. import cocos
  3. import pyglet
  4. from pyglet.window import key as wkey
  5. from cocos.director import director
  6. from cocos.layer import ScrollableLayer, Layer
  7. from cocos.sprite import Sprite
  8. from synergine2.config import Config
  9. from synergine2.log import SynergineLogger
  10. from synergine2.terminals import Terminal
  11. from synergine2.terminals import TerminalPackage
  12. from synergine2_cocos2d.layer import LayerManager
  13. from synergine2_cocos2d.middleware import TMXMiddleware
  14. class GridManager(object):
  15. def __init__(
  16. self,
  17. layer: Layer,
  18. square_width: int,
  19. border: int=0,
  20. ):
  21. self.layer = layer
  22. self.square_width = square_width
  23. self.border = border
  24. @property
  25. def final_width(self):
  26. return self.square_width + self.border
  27. def scale_sprite(self, sprite: Sprite):
  28. sprite.scale_x = self.final_width / sprite.image.width
  29. sprite.scale_y = self.final_width / sprite.image.height
  30. def position_sprite(self, sprite: Sprite, grid_position):
  31. grid_x = grid_position[0]
  32. grid_y = grid_position[1]
  33. sprite.position = grid_x * self.final_width, grid_y * self.final_width
  34. def get_window_position(self, grid_position_x, grid_position_y):
  35. grid_x = grid_position_x
  36. grid_y = grid_position_y
  37. return grid_x * self.final_width, grid_y * self.final_width
  38. def get_grid_position(self, window_x, window_y, z=0) -> tuple:
  39. window_size = director.get_window_size()
  40. window_center_x = window_size[0] // 2
  41. window_center_y = window_size[1] // 2
  42. window_relative_x = window_x - window_center_x
  43. window_relative_y = window_y - window_center_y
  44. real_width = self.final_width * self.layer.scale
  45. return int(window_relative_x // real_width),\
  46. int(window_relative_y // real_width),\
  47. z
  48. class GridLayerMixin(object):
  49. def __init__(self, *args, **kwargs):
  50. square_width = kwargs.pop('square_width', 32)
  51. square_border = kwargs.pop('square_border', 2)
  52. self.grid_manager = GridManager(
  53. self,
  54. square_width=square_width,
  55. border=square_border,
  56. )
  57. super().__init__(*args, **kwargs)
  58. class MainLayer(ScrollableLayer):
  59. is_event_handler = True
  60. def __init__(self, scroll_step: int=100):
  61. super().__init__()
  62. self.scroll_step = scroll_step
  63. self.grid_manager = GridManager(self, 32, border=2)
  64. # Set scene center on center of screen
  65. window_size = director.get_window_size()
  66. self.position = window_size[0] // 2, window_size[1] // 2
  67. def on_key_press(self, key, modifiers):
  68. if key == wkey.LEFT:
  69. self.position = (self.position[0] + self.scroll_step, self.position[1])
  70. if key == wkey.RIGHT:
  71. self.position = (self.position[0] - self.scroll_step, self.position[1])
  72. if key == wkey.UP:
  73. self.position = (self.position[0], self.position[1] - self.scroll_step)
  74. if key == wkey.DOWN:
  75. self.position = (self.position[0], self.position[1] + self.scroll_step)
  76. if key == wkey.A:
  77. if self.scale >= 0.3:
  78. self.scale -= 0.2
  79. if key == wkey.Z:
  80. if self.scale <= 4:
  81. self.scale += 0.2
  82. class Gui(object):
  83. def __init__(
  84. self,
  85. config: Config,
  86. logger: SynergineLogger,
  87. terminal: Terminal,
  88. read_queue_interval: float= 1/60.0,
  89. ):
  90. self.config = config
  91. self.logger = logger
  92. self._read_queue_interval = read_queue_interval
  93. self.terminal = terminal
  94. self.cycle_duration = self.config.core.cycle_duration
  95. cocos.director.director.init()
  96. def run(self):
  97. self.before_run()
  98. pyglet.clock.schedule_interval(
  99. lambda *_, **__: self.terminal.read(),
  100. self._read_queue_interval,
  101. )
  102. cocos.director.director.run(self.get_main_scene())
  103. def before_run(self) -> None:
  104. pass
  105. def get_main_scene(self) -> cocos.cocosnode.CocosNode:
  106. raise NotImplementedError()
  107. def before_received(self, package: TerminalPackage):
  108. pass
  109. def after_received(self, package: TerminalPackage):
  110. pass
  111. class TMXGui(Gui):
  112. def __init__(
  113. self,
  114. config: Config,
  115. logger: SynergineLogger,
  116. terminal: Terminal,
  117. read_queue_interval: float = 1 / 60.0,
  118. map_dir_path: str=None,
  119. ):
  120. assert map_dir_path
  121. super(TMXGui, self).__init__(
  122. config,
  123. logger,
  124. terminal,
  125. read_queue_interval,
  126. )
  127. self.map_dir_path = map_dir_path
  128. self.layer_manager = LayerManager(
  129. self.config,
  130. self.logger,
  131. middleware=TMXMiddleware(
  132. self.config,
  133. self.logger,
  134. self.map_dir_path,
  135. ),
  136. )
  137. self.layer_manager.init()
  138. self.layer_manager.center()
  139. def get_main_scene(self) -> cocos.cocosnode.CocosNode:
  140. return self.layer_manager.main_scene