gui.py 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import cocos
  2. from cocos.actions import ScaleBy, Repeat, Reverse, RotateBy
  3. from cocos.director import director
  4. from cocos.layer import ScrollableLayer, Layer
  5. from cocos.sprite import Sprite
  6. from pyglet.window import key as wkey
  7. from random import randint
  8. from sandbox.life_game.simulation import CellDieEvent, Cell
  9. from sandbox.life_game.simulation import CellBornEvent
  10. from synergine2.gui import Gui
  11. from synergine2.terminals import TerminalPackage
  12. from synergine2.terminals import Terminal
  13. cell_scale = ScaleBy(1.1, duration=0.25)
  14. cell_rotate = RotateBy(360, duration=30)
  15. class Cells(Layer):
  16. def __init__(self):
  17. super().__init__()
  18. self.cells = {}
  19. def born(self, grid_position):
  20. cell = Sprite('resources/cells_l.png')
  21. cell.position = grid_position[0] * 30, grid_position[1] * 30
  22. cell.scale = 0.50
  23. cell.do(Repeat(cell_scale + Reverse(cell_scale)))
  24. cell.do(Repeat(cell_rotate + Reverse(cell_rotate)))
  25. self.cells[grid_position] = cell
  26. self.add(cell)
  27. def die(self, grid_position):
  28. self.remove(self.cells[grid_position])
  29. del self.cells[grid_position]
  30. class MainLayer(ScrollableLayer):
  31. is_event_handler = True
  32. def __init__(self):
  33. super().__init__()
  34. self.scroll_step = 20
  35. self.background = Sprite('resources/banner-1711735_640.jpg')
  36. self.background.position = 0, 0
  37. self.background.opacity = 70
  38. self.background.scale = 5
  39. self.add(self.background, z=1)
  40. self.cells = Cells()
  41. self.add(self.cells)
  42. self.cross = Sprite('resources/cross31x31.png')
  43. self.cross.position = 0, 0
  44. self.cross.opacity = 50
  45. self.add(self.cross)
  46. # Set scene center on center of screen
  47. window_size = director.get_window_size()
  48. self.position = window_size[0] // 2, window_size[1] // 2
  49. def on_key_press(self, key, modifiers):
  50. if key == wkey.LEFT:
  51. self.position = (self.position[0] + self.scroll_step, self.position[1])
  52. if key == wkey.RIGHT:
  53. self.position = (self.position[0] - self.scroll_step, self.position[1])
  54. if key == wkey.UP:
  55. self.position = (self.position[0], self.position[1] - self.scroll_step)
  56. if key == wkey.DOWN:
  57. self.position = (self.position[0], self.position[1] + self.scroll_step)
  58. class LifeGameGui(Gui):
  59. def __init__(
  60. self,
  61. terminal: Terminal,
  62. read_queue_interval: float = 1 / 60.0,
  63. ):
  64. super().__init__(terminal, read_queue_interval)
  65. self.main_layer = MainLayer()
  66. self.main_scene = cocos.scene.Scene(self.main_layer)
  67. self.positions = {}
  68. self.terminal.register_event_handler(CellDieEvent, self.on_cell_die)
  69. self.terminal.register_event_handler(CellBornEvent, self.on_cell_born)
  70. def get_main_scene(self):
  71. return self.main_scene
  72. def before_received(self, package: TerminalPackage):
  73. if package.subjects: # It's thirst package
  74. for subject in package.subjects:
  75. if isinstance(subject, Cell):
  76. self.positions[subject.id] = subject.position
  77. self.main_layer.cells.born(subject.position)
  78. def on_cell_die(self, event: CellDieEvent):
  79. self.main_layer.cells.die(self.positions[event.subject_id])
  80. def on_cell_born(self, event: CellBornEvent):
  81. # TODO: La position peut evoluer dans un autre programme
  82. # resoudre cette problematique de données subjects qui évolue
  83. subject = self.terminal.subjects.get(event.subject_id)
  84. self.positions[event.subject_id] = subject.position
  85. self.main_layer.cells.born(subject.position)