gui.py 3.1KB

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