layer.py 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. # coding: utf-8
  2. import typing
  3. from pyglet.window import key
  4. import cocos
  5. from synergine2.config import Config
  6. from synergine2.log import get_logger
  7. from synergine2_cocos2d.middleware import MapMiddleware
  8. if False:
  9. from synergine2_cocos2d.actor import Actor
  10. from synergine2_cocos2d.gui import GridManager
  11. from synergine2_cocos2d.gui import Gui
  12. from synergine2_cocos2d.interaction import InteractionManager
  13. class ScrollingManager(cocos.layer.ScrollingManager):
  14. def world_to_screen_positions(
  15. self,
  16. positions: typing.List[typing.Tuple[int, int]],
  17. ) -> typing.List[typing.Tuple[int, int]]:
  18. screen_positions = []
  19. for position in positions:
  20. scx, scy = self.world_to_screen(
  21. position[0],
  22. position[1],
  23. )
  24. screen_positions.append((scx, scy))
  25. return screen_positions
  26. def screen_to_world_positions(
  27. self,
  28. positions: typing.List[typing.Tuple[int, int]],
  29. ) -> typing.List[typing.Tuple[int, int]]:
  30. world_positions = []
  31. for position in positions:
  32. wx, wy = self.screen_to_world(
  33. position[0],
  34. position[1],
  35. )
  36. world_positions.append((wx, wy))
  37. return world_positions
  38. class SubjectLayer(cocos.layer.ScrollableLayer):
  39. def __init__(self, parallax: int=1):
  40. super().__init__(parallax)
  41. self.subjects_index = {} # type: typing.Dict[int, Actor]
  42. def add_subject(self, actor: 'Actor') -> None:
  43. self.add(actor)
  44. self.subjects_index[actor.subject.id] = actor
  45. class MainScene(cocos.scene.Scene):
  46. pass
  47. class LayerManager(object):
  48. edit_layer_class = None # type: typing.Type['EditLayer']
  49. def __init__(
  50. self,
  51. config: Config,
  52. middleware: MapMiddleware,
  53. interaction_manager: 'InteractionManager',
  54. gui: 'Gui',
  55. ) -> None:
  56. self.config = config
  57. self.logger = get_logger('LayerManager', config)
  58. self.middleware = middleware
  59. self.interaction_manager = interaction_manager
  60. self.gui = gui
  61. self.grid_manager = None # type: GridManager
  62. self.scrolling_manager = None # type: ScrollingManager
  63. self.main_scene = None # type: cocos.scene.Scene
  64. self.main_layer = None # type: cocos.layer.Layer
  65. self.edit_layer = None # TODO type
  66. self.subject_layer = None # type: SubjectLayer
  67. from synergine2_cocos2d.gui import EditLayer
  68. self.edit_layer_class = self.edit_layer_class or EditLayer
  69. self.debug = self.config.resolve('global.debug', False)
  70. def init(self) -> None:
  71. # TODO: cyclic import
  72. from synergine2_cocos2d.gui import MainLayer
  73. from synergine2_cocos2d.gui import GridManager
  74. self.middleware.init()
  75. self.grid_manager = GridManager(
  76. self.middleware.get_cell_width(),
  77. self.middleware.get_cell_height(),
  78. self.middleware.get_world_width(),
  79. self.middleware.get_world_height(),
  80. )
  81. self.main_scene = MainScene()
  82. self.scrolling_manager = ScrollingManager()
  83. self.main_layer = MainLayer(
  84. self,
  85. self.grid_manager,
  86. # TODO: Hardcoded values
  87. **{
  88. 'width': 1200, # Note: world size
  89. 'height': 1000, # Note: world size
  90. }
  91. )
  92. self.edit_layer = self.edit_layer_class(
  93. self.config,
  94. self,
  95. self.grid_manager,
  96. self.main_layer,
  97. **{
  98. 'bindings': {
  99. key.LEFT: 'left',
  100. key.RIGHT: 'right',
  101. key.UP: 'up',
  102. key.DOWN: 'down',
  103. key.NUM_ADD: 'zoomin',
  104. key.NUM_SUBTRACT: 'zoomout'
  105. },
  106. 'mod_modify_selection': key.MOD_SHIFT,
  107. 'mod_restricted_mov': key.MOD_ACCEL,
  108. 'fastness': 160.0,
  109. 'autoscroll_border': 20.0, # in pixels, float; None disables autoscroll
  110. 'autoscroll_fastness': 320.0,
  111. 'wheel_multiplier': 2.5,
  112. 'zoom_min': 0.1,
  113. 'zoom_max': 2.0,
  114. 'zoom_fastness': 1.0
  115. }
  116. )
  117. self.main_scene.add(self.scrolling_manager)
  118. self.scrolling_manager.add(self.main_layer, z=0)
  119. self.main_scene.add(self.edit_layer)
  120. self.subject_layer = SubjectLayer()
  121. def connect_layers(self) -> None:
  122. self.main_layer.add(self.subject_layer)
  123. def center(self) -> None:
  124. self.subject_layer.position = 0, 0
  125. def add_subject(self, subject: 'Actor') -> None:
  126. self.subject_layer.add_subject(subject)
  127. def remove_subject(self, subject: 'Actor') -> None:
  128. self.subject_layer.remove(subject)
  129. def set_selectable(self, subject: 'Actor') -> None:
  130. self.edit_layer.set_selectable(subject)
  131. def unset_selectable(self, subject: 'Actor') -> None:
  132. self.edit_layer.unset_selectable(subject)