|
@@ -5,6 +5,7 @@ from math import floor
|
5
|
5
|
|
6
|
6
|
import pyglet
|
7
|
7
|
from pyglet.window import mouse
|
|
8
|
+from pyglet.window import key
|
8
|
9
|
|
9
|
10
|
import cocos
|
10
|
11
|
from cocos import collision_model
|
|
@@ -17,10 +18,14 @@ from synergine2.terminals import TerminalPackage
|
17
|
18
|
from synergine2.xyz import XYZSubjectMixin
|
18
|
19
|
from synergine2_cocos2d.actor import Actor
|
19
|
20
|
from synergine2_cocos2d.exception import OuterWorldPosition
|
|
21
|
+from synergine2_cocos2d.exception import InteractionNotFound
|
20
|
22
|
from synergine2_cocos2d.gl import rectangle_positions_type
|
21
|
23
|
from synergine2_cocos2d.gl import draw_rectangle
|
|
24
|
+from synergine2_cocos2d.interaction import InteractionManager
|
22
|
25
|
from synergine2_cocos2d.layer import LayerManager
|
23
|
26
|
from synergine2_cocos2d.middleware import TMXMiddleware
|
|
27
|
+from synergine2_cocos2d.middleware import TMXMiddlewareMapMiddleware
|
|
28
|
+from synergine2_cocos2d.user_action import UserAction
|
24
|
29
|
|
25
|
30
|
|
26
|
31
|
class GridManager(object):
|
|
@@ -176,6 +181,7 @@ class EditLayer(cocos.layer.Layer):
|
176
|
181
|
self.sright = None
|
177
|
182
|
self.sbottom = None
|
178
|
183
|
self.s_top = None
|
|
184
|
+ self.user_action_pending = None # UserAction
|
179
|
185
|
|
180
|
186
|
# opers that change cshape must ensure it goes to False,
|
181
|
187
|
# selection opers must ensure it goes to True
|
|
@@ -204,6 +210,11 @@ class EditLayer(cocos.layer.Layer):
|
204
|
210
|
self.collision_manager.remove_tricky(actor)
|
205
|
211
|
|
206
|
212
|
def draw(self, *args, **kwargs) -> None:
|
|
213
|
+ self.draw_update_cshapes()
|
|
214
|
+ self.draw_selection()
|
|
215
|
+ self.draw_interactions()
|
|
216
|
+
|
|
217
|
+ def draw_update_cshapes(self) -> None:
|
207
|
218
|
for actor in self.selectable_actors:
|
208
|
219
|
if actor.need_update_cshape:
|
209
|
220
|
if self.collision_manager.knows(actor):
|
|
@@ -211,6 +222,7 @@ class EditLayer(cocos.layer.Layer):
|
211
|
222
|
actor.update_cshape()
|
212
|
223
|
self.collision_manager.add(actor)
|
213
|
224
|
|
|
225
|
+ def draw_selection(self) -> None:
|
214
|
226
|
for actor, cshape in self.selection.items():
|
215
|
227
|
grid_position = self.grid_manager.get_grid_position(actor.position)
|
216
|
228
|
rect_positions = self.grid_manager.get_rectangle_positions(grid_position)
|
|
@@ -220,6 +232,14 @@ class EditLayer(cocos.layer.Layer):
|
220
|
232
|
(0, 81, 211),
|
221
|
233
|
)
|
222
|
234
|
|
|
235
|
+ def draw_interactions(self) -> None:
|
|
236
|
+ if self.user_action_pending:
|
|
237
|
+ try:
|
|
238
|
+ interaction = self.layer_manager.interaction_manager.get_for_user_action(self.user_action_pending)
|
|
239
|
+ interaction.draw_pending()
|
|
240
|
+ except InteractionNotFound:
|
|
241
|
+ pass
|
|
242
|
+
|
223
|
243
|
def on_enter(self):
|
224
|
244
|
super(EditLayer, self).on_enter()
|
225
|
245
|
scene = self.get_ancestor(cocos.scene.Scene)
|
|
@@ -365,6 +385,13 @@ class EditLayer(cocos.layer.Layer):
|
365
|
385
|
|
366
|
386
|
def on_key_press(self, k, m):
|
367
|
387
|
binds = self.bindings
|
|
388
|
+
|
|
389
|
+ # TODO: Clarify code
|
|
390
|
+ # Actions available if actor selected
|
|
391
|
+ if self.selection:
|
|
392
|
+ if k == key.M:
|
|
393
|
+ self.user_action_pending = UserAction.ORDER_MOVE
|
|
394
|
+
|
368
|
395
|
if k in binds:
|
369
|
396
|
self.buttons[binds[k]] = 1
|
370
|
397
|
self.modifiers[binds[k]] = 1
|
|
@@ -391,9 +418,24 @@ class EditLayer(cocos.layer.Layer):
|
391
|
418
|
'GUI click: x: {}, y: {}, rx: {}, ry: {} ({}|{})'.format(x, y, rx, ry, buttons, modifiers)
|
392
|
419
|
)
|
393
|
420
|
|
394
|
|
- actor = self.single_actor_from_mouse()
|
395
|
|
- if actor:
|
396
|
|
- self.selection_add(actor)
|
|
421
|
+ if mouse.LEFT:
|
|
422
|
+ # Non action pending case
|
|
423
|
+ if not self.user_action_pending:
|
|
424
|
+ actor = self.single_actor_from_mouse()
|
|
425
|
+ if actor:
|
|
426
|
+ self.selection.clear()
|
|
427
|
+ self.selection_add(actor)
|
|
428
|
+ # Action pending case
|
|
429
|
+ else:
|
|
430
|
+ try:
|
|
431
|
+ interaction = self.layer_manager.interaction_manager.get_for_user_action(self.user_action_pending)
|
|
432
|
+ interaction.execute()
|
|
433
|
+ except InteractionNotFound:
|
|
434
|
+ pass
|
|
435
|
+
|
|
436
|
+ if mouse.RIGHT:
|
|
437
|
+ if self.user_action_pending:
|
|
438
|
+ self.user_action_pending = None
|
397
|
439
|
|
398
|
440
|
def on_mouse_release(self, sx, sy, button, modifiers):
|
399
|
441
|
# should we handle here mod_restricted_mov ?
|
|
@@ -423,6 +465,7 @@ class EditLayer(cocos.layer.Layer):
|
423
|
465
|
else:
|
424
|
466
|
# new_selected becomes the current selected
|
425
|
467
|
self.selection.clear()
|
|
468
|
+ self.user_action_pending = None
|
426
|
469
|
if under_mouse_unique is not None:
|
427
|
470
|
self.selection_add(under_mouse_unique)
|
428
|
471
|
|
|
@@ -581,11 +624,10 @@ class SubjectMapper(object):
|
581
|
624
|
subject: XYZSubjectMixin,
|
582
|
625
|
layer_manager: LayerManager,
|
583
|
626
|
) -> None:
|
584
|
|
- actor = self.actor_class()
|
585
|
|
- pixel_position = layer_manager.grid_manager.get_pixel_position_of_grid_position((
|
586
|
|
- subject.position[0],
|
587
|
|
- subject.position[1],
|
588
|
|
- ))
|
|
627
|
+ actor = self.actor_class(subject)
|
|
628
|
+ pixel_position = layer_manager.grid_manager.get_pixel_position_of_grid_position(
|
|
629
|
+ (subject.position[0], subject.position[1]),
|
|
630
|
+ )
|
589
|
631
|
actor.update_position(euclid.Vector2(*pixel_position))
|
590
|
632
|
|
591
|
633
|
# TODO: Selectable nature must be configurable
|
|
@@ -631,6 +673,20 @@ class Gui(object):
|
631
|
673
|
resizable=True,
|
632
|
674
|
)
|
633
|
675
|
|
|
676
|
+ self.interaction_manager = InteractionManager(
|
|
677
|
+ config=self.config,
|
|
678
|
+ logger=self.logger,
|
|
679
|
+ terminal=self.terminal,
|
|
680
|
+ )
|
|
681
|
+ self.layer_manager = LayerManager(
|
|
682
|
+ self.config,
|
|
683
|
+ self.logger,
|
|
684
|
+ middleware=self.get_layer_middleware(),
|
|
685
|
+ interaction_manager=self.interaction_manager,
|
|
686
|
+ )
|
|
687
|
+ self.layer_manager.init()
|
|
688
|
+ self.layer_manager.center()
|
|
689
|
+
|
634
|
690
|
# Enable blending
|
635
|
691
|
pyglet.gl.glEnable(pyglet.gl.GL_BLEND)
|
636
|
692
|
pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA, pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)
|
|
@@ -641,6 +697,9 @@ class Gui(object):
|
641
|
697
|
|
642
|
698
|
self.subject_mapper_factory = SubjectMapperFactory()
|
643
|
699
|
|
|
700
|
+ def get_layer_middleware(self) -> MapMiddleware:
|
|
701
|
+ raise NotImplementedError()
|
|
702
|
+
|
644
|
703
|
def run(self):
|
645
|
704
|
self.before_run()
|
646
|
705
|
pyglet.clock.schedule_interval(
|
|
@@ -672,24 +731,20 @@ class TMXGui(Gui):
|
672
|
731
|
map_dir_path: str=None,
|
673
|
732
|
):
|
674
|
733
|
assert map_dir_path
|
|
734
|
+ self.map_dir_path = map_dir_path
|
675
|
735
|
super(TMXGui, self).__init__(
|
676
|
736
|
config,
|
677
|
737
|
logger,
|
678
|
738
|
terminal,
|
679
|
739
|
read_queue_interval,
|
680
|
740
|
)
|
681
|
|
- self.map_dir_path = map_dir_path
|
682
|
|
- self.layer_manager = LayerManager(
|
|
741
|
+
|
|
742
|
+ def get_layer_middleware(self) -> MapMiddleware:
|
|
743
|
+ return TMXMiddleware(
|
683
|
744
|
self.config,
|
684
|
745
|
self.logger,
|
685
|
|
- middleware=TMXMiddleware(
|
686
|
|
- self.config,
|
687
|
|
- self.logger,
|
688
|
|
- self.map_dir_path,
|
689
|
|
- ),
|
|
746
|
+ self.map_dir_path,
|
690
|
747
|
)
|
691
|
|
- self.layer_manager.init()
|
692
|
|
- self.layer_manager.center()
|
693
|
748
|
|
694
|
749
|
def get_main_scene(self) -> cocos.cocosnode.CocosNode:
|
695
|
750
|
return self.layer_manager.main_scene
|