Bastien Sevajol 6 vuotta sitten
vanhempi
commit
5798e168dd

+ 2 - 2
synergine2_cocos2d/actor.py Näytä tiedosto

@@ -7,7 +7,6 @@ import cocos
7 7
 from cocos import collision_model
8 8
 from cocos import euclid
9 9
 from synergine2_cocos2d.animation import AnimatedInterface
10
-from synergine2_cocos2d.layer import LayerManager
11 10
 
12 11
 
13 12
 class Actor(AnimatedInterface, cocos.sprite.Sprite):
@@ -47,10 +46,11 @@ class Actor(AnimatedInterface, cocos.sprite.Sprite):
47 46
             self.width // 2,
48 47
             self.height // 2,
49 48
         )
49
+        self.need_update_cshape = False
50 50
 
51 51
     def update_position(self, new_position: euclid.Vector2) -> None:
52 52
         self.position = new_position
53
-        self.cshape.center = new_position
53
+        self.cshape.center = new_position  # Note: if remove: strange behaviour: drag change actor position with anomaly
54 54
 
55 55
     def build_animation_images(self) -> None:
56 56
         """

+ 13 - 0
synergine2_cocos2d/exception.py Näytä tiedosto

@@ -0,0 +1,13 @@
1
+# coding: utf-8
2
+
3
+
4
+class WorldException(Exception):
5
+    pass
6
+
7
+
8
+class PositionException(WorldException):
9
+    pass
10
+
11
+
12
+class OuterWorldPosition(PositionException):
13
+    pass

+ 90 - 50
synergine2_cocos2d/gui.py Näytä tiedosto

@@ -1,5 +1,7 @@
1 1
 # coding: utf-8
2
+import typing
2 3
 import weakref
4
+from math import floor
3 5
 
4 6
 import pyglet
5 7
 from pyglet.window import mouse
@@ -16,65 +18,98 @@ from synergine2.log import SynergineLogger
16 18
 from synergine2.terminals import Terminal
17 19
 from synergine2.terminals import TerminalPackage
18 20
 from synergine2_cocos2d.actor import Actor
21
+from synergine2_cocos2d.exception import OuterWorldPosition
19 22
 from synergine2_cocos2d.layer import LayerManager
20 23
 from synergine2_cocos2d.middleware import TMXMiddleware
21 24
 
22 25
 
26
+# class GridManager(object):
27
+#     def __init__(
28
+#         self,
29
+#         layer: Layer,
30
+#         square_width: int,
31
+#         border: int=0,
32
+#     ):
33
+#         self.layer = layer
34
+#         self.square_width = square_width
35
+#         self.border = border
36
+#
37
+#     @property
38
+#     def final_width(self):
39
+#         return self.square_width + self.border
40
+#
41
+#     def scale_sprite(self, sprite: Sprite):
42
+#         sprite.scale_x = self.final_width / sprite.image.width
43
+#         sprite.scale_y = self.final_width / sprite.image.height
44
+#
45
+#     def position_sprite(self, sprite: Sprite, grid_position):
46
+#         grid_x = grid_position[0]
47
+#         grid_y = grid_position[1]
48
+#         sprite.position = grid_x * self.final_width, grid_y * self.final_width
49
+#
50
+#     def get_window_position(self, grid_position_x, grid_position_y):
51
+#         grid_x = grid_position_x
52
+#         grid_y = grid_position_y
53
+#         return grid_x * self.final_width, grid_y * self.final_width
54
+#
55
+#     def get_grid_position(self, window_x, window_y, z=0) -> tuple:
56
+#         window_size = director.get_window_size()
57
+#
58
+#         window_center_x = window_size[0] // 2
59
+#         window_center_y = window_size[1] // 2
60
+#
61
+#         window_relative_x = window_x - window_center_x
62
+#         window_relative_y = window_y - window_center_y
63
+#
64
+#         real_width = self.final_width * self.layer.scale
65
+#
66
+#         return int(window_relative_x // real_width),\
67
+#                int(window_relative_y // real_width),\
68
+#                z
69
+#
70
+#
71
+# class GridLayerMixin(object):
72
+#     def __init__(self, *args, **kwargs):
73
+#         square_width = kwargs.pop('square_width', 32)
74
+#         square_border = kwargs.pop('square_border', 2)
75
+#         self.grid_manager = GridManager(
76
+#             self,
77
+#             square_width=square_width,
78
+#             border=square_border,
79
+#         )
80
+#         super().__init__(*args, **kwargs)
81
+
82
+
23 83
 class GridManager(object):
24 84
     def __init__(
25 85
         self,
26
-        layer: Layer,
27
-        square_width: int,
28
-        border: int=0,
29
-    ):
30
-        self.layer = layer
31
-        self.square_width = square_width
32
-        self.border = border
33
-
34
-    @property
35
-    def final_width(self):
36
-        return self.square_width + self.border
37
-
38
-    def scale_sprite(self, sprite: Sprite):
39
-        sprite.scale_x = self.final_width / sprite.image.width
40
-        sprite.scale_y = self.final_width / sprite.image.height
41
-
42
-    def position_sprite(self, sprite: Sprite, grid_position):
43
-        grid_x = grid_position[0]
44
-        grid_y = grid_position[1]
45
-        sprite.position = grid_x * self.final_width, grid_y * self.final_width
46
-
47
-    def get_window_position(self, grid_position_x, grid_position_y):
48
-        grid_x = grid_position_x
49
-        grid_y = grid_position_y
50
-        return grid_x * self.final_width, grid_y * self.final_width
51
-
52
-    def get_grid_position(self, window_x, window_y, z=0) -> tuple:
53
-        window_size = director.get_window_size()
54
-
55
-        window_center_x = window_size[0] // 2
56
-        window_center_y = window_size[1] // 2
86
+        cell_width: int,
87
+        cell_height: int,
88
+        world_width: int,
89
+        world_height: int,
90
+    ) -> None:
91
+        self.cell_width = cell_width
92
+        self.cell_height = cell_height
93
+        self.world_width = world_width
94
+        self.world_height = world_height
57 95
 
58
-        window_relative_x = window_x - window_center_x
59
-        window_relative_y = window_y - window_center_y
96
+    def get_grid_position(self, pixel_position: typing.Tuple[int, int]) -> typing.Tuple[int, int]:
97
+        pixel_x, pixel_y = pixel_position
60 98
 
61
-        real_width = self.final_width * self.layer.scale
99
+        cell_x = int(floor(pixel_x / self.cell_width))
100
+        cell_y = int(floor(pixel_y / self.cell_height))
62 101
 
63
-        return int(window_relative_x // real_width),\
64
-               int(window_relative_y // real_width),\
65
-               z
102
+        if cell_x > self.world_width or cell_y > self.world_height or cell_x < 0 or cell_y < 0:
103
+            raise OuterWorldPosition('Position "{}" is outer world ({}x{})'.format(
104
+                (cell_x, cell_y),
105
+                self.world_width,
106
+                self.world_height,
107
+            ))
66 108
 
109
+        return cell_x, cell_y
67 110
 
68
-class GridLayerMixin(object):
69
-    def __init__(self, *args, **kwargs):
70
-        square_width = kwargs.pop('square_width', 32)
71
-        square_border = kwargs.pop('square_border', 2)
72
-        self.grid_manager = GridManager(
73
-            self,
74
-            square_width=square_width,
75
-            border=square_border,
76
-        )
77
-        super().__init__(*args, **kwargs)
111
+    def get_pixel_position_of_grid_position(self, grid_position: typing.Tuple[int, int]) -> typing.Tuple[int, int]:
112
+        return grid_position[0] * self.cell_width, grid_position[1] * self.cell_height
78 113
 
79 114
 
80 115
 class MinMaxRect(cocos.cocosnode.CocosNode):
@@ -123,6 +158,7 @@ class EditLayer(cocos.layer.Layer):
123 158
         config: Config,
124 159
         logger: SynergineLogger,
125 160
         layer_manager: LayerManager,
161
+        grid_manager: GridManager,
126 162
         worldview,
127 163
         bindings=None,
128 164
         fastness=None,
@@ -135,11 +171,13 @@ class EditLayer(cocos.layer.Layer):
135 171
         mod_modify_selection=None,
136 172
         mod_restricted_mov=None,
137 173
     ):
174
+        # TODO: Clean init params
138 175
         super(EditLayer, self).__init__()
139 176
 
140 177
         self.config = config
141 178
         self.logger = logger
142 179
         self.layer_manager = layer_manager
180
+        self.grid_manager = grid_manager
143 181
 
144 182
         self.bindings = bindings
145 183
         buttons = {}
@@ -217,7 +255,6 @@ class EditLayer(cocos.layer.Layer):
217 255
                     self.collision_manager.remove_tricky(actor)
218 256
                     actor.update_cshape()
219 257
                     self.collision_manager.add(actor)
220
-                    actor.need_update_cshape = False
221 258
 
222 259
     def on_enter(self):
223 260
         super(EditLayer, self).on_enter()
@@ -265,8 +302,10 @@ class EditLayer(cocos.layer.Layer):
265 302
             for actor in self.selection:
266 303
                 old_pos = self.selection[actor].center
267 304
                 new_pos = old_pos + dpos
305
+                grid_pos = self.grid_manager.get_grid_position(new_pos)
306
+                grid_pixel_pos = self.grid_manager.get_pixel_position_of_grid_position(grid_pos)
268 307
                 # TODO: clamp new_pos so actor into world boundaries ?
269
-                actor.update_position(new_pos)
308
+                actor.update_position(grid_pixel_pos)
270 309
 
271 310
         scroller = self.weak_scroller()
272 311
 
@@ -541,6 +580,7 @@ class MainLayer(ScrollableLayer):
541 580
     def __init__(
542 581
         self,
543 582
         layer_manager: LayerManager,
583
+        grid_manager: GridManager,
544 584
         width: int,
545 585
         height: int,
546 586
         scroll_step: int=100,
@@ -548,7 +588,7 @@ class MainLayer(ScrollableLayer):
548 588
         super().__init__()
549 589
         self.layer_manager = layer_manager
550 590
         self.scroll_step = scroll_step
551
-        self.grid_manager = GridManager(self, 32, border=2)
591
+        self.grid_manager = grid_manager
552 592
 
553 593
         self.width = width
554 594
         self.height = height

+ 14 - 1
synergine2_cocos2d/layer.py Näytä tiedosto

@@ -9,6 +9,7 @@ from synergine2_cocos2d.middleware import MapMiddleware
9 9
 
10 10
 if False:
11 11
     from synergine2_cocos2d.actor import Actor
12
+    from synergine2_cocos2d.gui import GridManager
12 13
 
13 14
 
14 15
 class LayerManager(object):
@@ -22,6 +23,7 @@ class LayerManager(object):
22 23
         self.logger = logger
23 24
         self.middleware = middleware
24 25
 
26
+        self.grid_manager = None  # type: GridManager
25 27
         self.scrolling_manager = None  # type: cocos.layer.ScrollingManager
26 28
         self.main_scene = None  # type: cocos.scene.Scene
27 29
         self.main_layer = None  # type: cocos.layer.Layer
@@ -33,9 +35,18 @@ class LayerManager(object):
33 35
         self.top_layer = None  # type: cocos.tiles.RectMapLayer
34 36
 
35 37
     def init(self) -> None:
38
+        # TODO: cyclic import
36 39
         from synergine2_cocos2d.gui import MainLayer
37 40
         from synergine2_cocos2d.gui import EditLayer
38
-
41
+        from synergine2_cocos2d.gui import GridManager
42
+
43
+        # TODO: Values from tmx map
44
+        self.grid_manager = GridManager(
45
+            8,
46
+            8,
47
+            100,
48
+            100,
49
+        )
39 50
         self.middleware.init()
40 51
 
41 52
         self.main_scene = cocos.scene.Scene()
@@ -43,6 +54,7 @@ class LayerManager(object):
43 54
 
44 55
         self.main_layer = MainLayer(
45 56
             self,
57
+            self.grid_manager,
46 58
             **{
47 59
                 'width': 1200,  # Note: world size
48 60
                 'height': 1000,  # Note: world size
@@ -52,6 +64,7 @@ class LayerManager(object):
52 64
             self.config,
53 65
             self.logger,
54 66
             self,
67
+            self.grid_manager,
55 68
             self.main_layer,
56 69
             **{
57 70
                 'bindings': {