gui.py 3.8KB

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