gui.py 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import cocos
  2. import pyglet
  3. from pyglet.window import key as wkey
  4. from cocos.director import director
  5. from cocos.layer import ScrollableLayer, Layer
  6. from cocos.sprite import Sprite
  7. from synergine2.terminals import Terminal
  8. from synergine2.terminals import TerminalPackage
  9. class GridManager(object):
  10. def __init__(
  11. self,
  12. layer: Layer,
  13. square_width: int,
  14. border: int=0,
  15. ):
  16. self.layer = layer
  17. self.square_width = square_width
  18. self.border = border
  19. @property
  20. def final_width(self):
  21. return self.square_width + self.border
  22. def scale_sprite(self, sprite: Sprite):
  23. sprite.scale_x = self.final_width / sprite.image.width
  24. sprite.scale_y = self.final_width / sprite.image.height
  25. def position_sprite(self, sprite: Sprite, grid_position):
  26. grid_x = grid_position[0]
  27. grid_y = grid_position[1]
  28. sprite.position = grid_x * self.final_width, grid_y * self.final_width
  29. def get_window_position(self, grid_position_x, grid_position_y):
  30. grid_x = grid_position_x
  31. grid_y = grid_position_y
  32. return grid_x * self.final_width, grid_y * self.final_width
  33. def get_grid_position(self, window_x, window_y, z=0) -> tuple:
  34. window_size = director.get_window_size()
  35. window_center_x = window_size[0] // 2
  36. window_center_y = window_size[1] // 2
  37. window_relative_x = window_x - window_center_x
  38. window_relative_y = window_y - window_center_y
  39. real_width = self.final_width * self.layer.scale
  40. return int(window_relative_x // real_width),\
  41. int(window_relative_y // real_width),\
  42. z
  43. class GridLayerMixin(object):
  44. def __init__(self, *args, **kwargs):
  45. square_width = kwargs.pop('square_width', 32)
  46. square_border = kwargs.pop('square_border', 2)
  47. self.grid_manager = GridManager(
  48. self,
  49. square_width=square_width,
  50. border=square_border,
  51. )
  52. super().__init__(*args, **kwargs)
  53. class MainLayer(ScrollableLayer):
  54. is_event_handler = True
  55. def __init__(self, terminal: Terminal, scroll_step: int=100):
  56. super().__init__()
  57. self.terminal = terminal
  58. self.scroll_step = scroll_step
  59. self.grid_manager = GridManager(self, 32, border=2)
  60. # Set scene center on center of screen
  61. window_size = director.get_window_size()
  62. self.position = window_size[0] // 2, window_size[1] // 2
  63. def on_key_press(self, key, modifiers):
  64. if key == wkey.LEFT:
  65. self.position = (self.position[0] + self.scroll_step, self.position[1])
  66. if key == wkey.RIGHT:
  67. self.position = (self.position[0] - self.scroll_step, self.position[1])
  68. if key == wkey.UP:
  69. self.position = (self.position[0], self.position[1] - self.scroll_step)
  70. if key == wkey.DOWN:
  71. self.position = (self.position[0], self.position[1] + self.scroll_step)
  72. if key == wkey.A:
  73. if self.scale >= 0.3:
  74. self.scale -= 0.2
  75. if key == wkey.Z:
  76. if self.scale <= 4:
  77. self.scale += 0.2
  78. class Gui(object):
  79. def __init__(
  80. self,
  81. terminal: Terminal,
  82. read_queue_interval: float= 1/60.0,
  83. ):
  84. self._read_queue_interval = read_queue_interval
  85. self.terminal = terminal
  86. cocos.director.director.init()
  87. def run(self):
  88. pyglet.clock.schedule_interval(
  89. lambda *_, **__: self.terminal.read(),
  90. self._read_queue_interval,
  91. )
  92. cocos.director.director.run(self.get_main_scene())
  93. def get_main_scene(self) -> cocos.cocosnode.CocosNode:
  94. raise NotImplementedError()
  95. def before_received(self, package: TerminalPackage):
  96. pass
  97. def after_received(self, package: TerminalPackage):
  98. pass