Bastien Sevajol пре 7 година
родитељ
комит
65a00d9858

+ 1 - 1
sandbox/tile/config.yaml Прегледај датотеку

6
 game:
6
 game:
7
     move:
7
     move:
8
         walk_ref_time: 3
8
         walk_ref_time: 3
9
-        run_ref_time: 1.5
9
+        run_ref_time: 1

+ 2 - 0
sandbox/tile/gui/base.py Прегледај датотеку

1
 # coding: utf-8
1
 # coding: utf-8
2
 from synergine2_cocos2d.gui import TMXGui
2
 from synergine2_cocos2d.gui import TMXGui
3
 from synergine2_cocos2d.interaction import MoveActorInteraction
3
 from synergine2_cocos2d.interaction import MoveActorInteraction
4
+from synergine2_cocos2d.interaction import MoveFastActorInteraction
4
 
5
 
5
 
6
 
6
 class Game(TMXGui):
7
 class Game(TMXGui):
7
     def before_run(self) -> None:
8
     def before_run(self) -> None:
8
         self.layer_manager.interaction_manager.register(MoveActorInteraction, self.layer_manager)
9
         self.layer_manager.interaction_manager.register(MoveActorInteraction, self.layer_manager)
10
+        self.layer_manager.interaction_manager.register(MoveFastActorInteraction, self.layer_manager)
9
 
11
 
10
         # Test
12
         # Test
11
         # from sandbox.tile.gui.actor import Man
13
         # from sandbox.tile.gui.actor import Man

+ 5 - 0
synergine2_cocos2d/actor.py Прегледај датотеку

43
         self.current_image = image
43
         self.current_image = image
44
         self.need_update_cshape = False
44
         self.need_update_cshape = False
45
 
45
 
46
+    def stop_actions(self, action_types: typing.Tuple[typing.Type[cocos.actions.Action], ...]) -> None:
47
+        for action in self.actions:
48
+            if isinstance(action, action_types):
49
+                self.remove_action(action)
50
+
46
     def update_cshape(self) -> None:
51
     def update_cshape(self) -> None:
47
         self.cshape = collision_model.AARectShape(
52
         self.cshape = collision_model.AARectShape(
48
             euclid.Vector2(self.position[0], self.position[1]),
53
             euclid.Vector2(self.position[0], self.position[1]),

+ 18 - 2
synergine2_cocos2d/gui.py Прегледај датотеку

11
 from cocos import collision_model
11
 from cocos import collision_model
12
 from cocos import euclid
12
 from cocos import euclid
13
 from cocos.layer import ScrollableLayer
13
 from cocos.layer import ScrollableLayer
14
+from cocos.actions import MoveTo as BaseMoveTo
14
 from synergine2.config import Config
15
 from synergine2.config import Config
15
 from synergine2.log import SynergineLogger
16
 from synergine2.log import SynergineLogger
16
 from synergine2.terminals import Terminal
17
 from synergine2.terminals import Terminal
397
         if self.selection:
398
         if self.selection:
398
             if k == key.M:
399
             if k == key.M:
399
                 self.user_action_pending = UserAction.ORDER_MOVE
400
                 self.user_action_pending = UserAction.ORDER_MOVE
401
+            if k == key.R:
402
+                self.user_action_pending = UserAction.ORDER_MOVE_FAST
400
 
403
 
401
         if k in binds:
404
         if k in binds:
402
             self.buttons[binds[k]] = 1
405
             self.buttons[binds[k]] = 1
757
 
760
 
758
         # configs
761
         # configs
759
         self.move_duration_ref = float(self.config.resolve('game.move.walk_ref_time'))
762
         self.move_duration_ref = float(self.config.resolve('game.move.walk_ref_time'))
763
+        self.move_fast_duration_ref = float(self.config.resolve('game.move.run_ref_time'))
760
 
764
 
761
     def get_layer_middleware(self) -> MapMiddleware:
765
     def get_layer_middleware(self) -> MapMiddleware:
762
         return TMXMiddleware(
766
         return TMXMiddleware(
782
         actor = self.layer_manager.subject_layer.subjects_index[event.subject_id]
786
         actor = self.layer_manager.subject_layer.subjects_index[event.subject_id]
783
         new_world_position = self.layer_manager.grid_manager.get_pixel_position_of_grid_position(event.to_position)
787
         new_world_position = self.layer_manager.grid_manager.get_pixel_position_of_grid_position(event.to_position)
784
 
788
 
789
+        actor.stop_actions((BaseMoveTo,))
785
         actor.set_position(*new_world_position)
790
         actor.set_position(*new_world_position)
786
 
791
 
787
     def start_move_subject(self, event: StartMoveEvent):
792
     def start_move_subject(self, event: StartMoveEvent):
788
         actor = self.layer_manager.subject_layer.subjects_index[event.subject_id]
793
         actor = self.layer_manager.subject_layer.subjects_index[event.subject_id]
789
         new_world_position = self.layer_manager.grid_manager.get_pixel_position_of_grid_position(event.to_position)
794
         new_world_position = self.layer_manager.grid_manager.get_pixel_position_of_grid_position(event.to_position)
790
 
795
 
791
-        move_action = MoveTo(new_world_position, self.move_duration_ref)
796
+        if event.gui_action == UserAction.ORDER_MOVE:
797
+            animation = ANIMATION_WALK
798
+            cycle_duration = 2
799
+            move_duration = self.move_duration_ref
800
+        elif event.gui_action == UserAction.ORDER_MOVE_FAST:
801
+            animation = ANIMATION_WALK
802
+            cycle_duration = 0.5
803
+            move_duration = self.move_fast_duration_ref
804
+        else:
805
+            raise NotImplementedError()
806
+
807
+        move_action = MoveTo(new_world_position, move_duration)
792
         actor.do(move_action)
808
         actor.do(move_action)
793
-        actor.do(Animate(ANIMATION_WALK, duration=self.move_duration_ref, cycle_duration=2))
809
+        actor.do(Animate(animation, duration=move_duration, cycle_duration=cycle_duration))
794
         actor.rotation = get_angle(event.from_position, event.to_position)
810
         actor.rotation = get_angle(event.from_position, event.to_position)

+ 15 - 3
synergine2_cocos2d/interaction.py Прегледај датотеку

70
         raise NotImplementedError()
70
         raise NotImplementedError()
71
 
71
 
72
 
72
 
73
-class MoveActorInteraction(Interaction):
74
-    gui_action = UserAction.ORDER_MOVE
73
+class BaseMoveActorInteraction(Interaction):
74
+    gui_action = None
75
+    color = None
75
     request_move_behaviour_class = RequestMoveBehaviour
76
     request_move_behaviour_class = RequestMoveBehaviour
76
 
77
 
77
     def draw_pending(self) -> None:
78
     def draw_pending(self) -> None:
82
                 draw_line(
83
                 draw_line(
83
                     self.layer_manager.scrolling_manager.world_to_screen(*pixel_position),
84
                     self.layer_manager.scrolling_manager.world_to_screen(*pixel_position),
84
                     self.layer_manager.edit_layer.screen_mouse,
85
                     self.layer_manager.edit_layer.screen_mouse,
85
-                    (0, 0, 255),
86
+                    self.color,
86
                 )
87
                 )
87
 
88
 
88
     def get_package_for_terminal(self) -> TerminalPackage:
89
     def get_package_for_terminal(self) -> TerminalPackage:
99
                 self.request_move_behaviour_class, {
100
                 self.request_move_behaviour_class, {
100
                     'subject_id': actor.subject.id,
101
                     'subject_id': actor.subject.id,
101
                     'move_to': mouse_grid_position,
102
                     'move_to': mouse_grid_position,
103
+                    'gui_action': self.gui_action,
102
                 }
104
                 }
103
             ))
105
             ))
104
 
106
 
105
         return TerminalPackage(
107
         return TerminalPackage(
106
             simulation_actions=actions,
108
             simulation_actions=actions,
107
         )
109
         )
110
+
111
+
112
+class MoveActorInteraction(BaseMoveActorInteraction):
113
+    gui_action = UserAction.ORDER_MOVE
114
+    color = (0, 0, 255)
115
+
116
+
117
+class MoveFastActorInteraction(BaseMoveActorInteraction):
118
+    gui_action = UserAction.ORDER_MOVE_FAST
119
+    color = (72, 244, 66)

+ 1 - 0
synergine2_cocos2d/user_action.py Прегледај датотеку

4
 
4
 
5
 class UserAction(Enum):
5
 class UserAction(Enum):
6
     ORDER_MOVE = 'ORDER_MOVE'
6
     ORDER_MOVE = 'ORDER_MOVE'
7
+    ORDER_MOVE_FAST = 'ORDER_MOVE_FAST'

+ 32 - 5
synergine2_xyz/move.py Прегледај датотеку

11
 from synergine2.simulation import Intention
11
 from synergine2.simulation import Intention
12
 from synergine2.simulation import Simulation
12
 from synergine2.simulation import Simulation
13
 from synergine2.simulation import Event
13
 from synergine2.simulation import Event
14
+from synergine2_cocos2d.user_action import UserAction
14
 from synergine2_xyz.simulation import XYZSimulation
15
 from synergine2_xyz.simulation import XYZSimulation
15
 
16
 
16
 
17
 
19
         self,
20
         self,
20
         move_to: typing.Tuple[int, int],
21
         move_to: typing.Tuple[int, int],
21
         start_time: float,
22
         start_time: float,
23
+        gui_action: typing.Any,
22
     ) -> None:
24
     ) -> None:
23
         self.move_to = move_to
25
         self.move_to = move_to
24
         self.path = []  # type: typing.List[typing.Tuple[int, int]]
26
         self.path = []  # type: typing.List[typing.Tuple[int, int]]
26
         self.last_intention_time = start_time
28
         self.last_intention_time = start_time
27
         self.just_reach = False
29
         self.just_reach = False
28
         self.initial = True
30
         self.initial = True
31
+        self.gui_action = gui_action
29
 
32
 
30
 
33
 
31
 class RequestMoveBehaviour(SimulationBehaviour):
34
 class RequestMoveBehaviour(SimulationBehaviour):
54
 
57
 
55
         try:
58
         try:
56
             subject = self.simulation.subjects.index[subject_id]
59
             subject = self.simulation.subjects.index[subject_id]
57
-            subject.intentions.set(self.move_intention_class(move_to, start_time=time.time()))
60
+            subject.intentions.set(self.move_intention_class(
61
+                move_to,
62
+                start_time=time.time(),
63
+                gui_action=data['gui_action'],
64
+            ))
58
         except KeyError:
65
         except KeyError:
59
             # TODO: log error here
66
             # TODO: log error here
60
             pass
67
             pass
102
                 'last_intention_time': move.last_intention_time,
109
                 'last_intention_time': move.last_intention_time,
103
                 'just_reach': move.just_reach,
110
                 'just_reach': move.just_reach,
104
                 'initial': move.initial,
111
                 'initial': move.initial,
112
+                'gui_action': move.gui_action,
105
             }
113
             }
106
 
114
 
107
         except IndexError:  # TODO: Specialize ? No movement left
115
         except IndexError:  # TODO: Specialize ? No movement left
116
         subject_id: int,
124
         subject_id: int,
117
         from_position: typing.Tuple[int, int],
125
         from_position: typing.Tuple[int, int],
118
         to_position: typing.Tuple[int, int],
126
         to_position: typing.Tuple[int, int],
127
+        gui_action: typing.Any,
119
         *args,
128
         *args,
120
         **kwargs
129
         **kwargs
121
     ):
130
     ):
123
         self.subject_id = subject_id
132
         self.subject_id = subject_id
124
         self.from_position = from_position
133
         self.from_position = from_position
125
         self.to_position = to_position
134
         self.to_position = to_position
135
+        self.gui_action = gui_action
126
 
136
 
127
     def repr_debug(self) -> str:
137
     def repr_debug(self) -> str:
128
         return '{}: subject_id:{}, from_position:{} to_position: {}'.format(
138
         return '{}: subject_id:{}, from_position:{} to_position: {}'.format(
139
         subject_id: int,
149
         subject_id: int,
140
         from_position: typing.Tuple[int, int],
150
         from_position: typing.Tuple[int, int],
141
         to_position: typing.Tuple[int, int],
151
         to_position: typing.Tuple[int, int],
152
+        gui_action: typing.Any,
142
         *args,
153
         *args,
143
         **kwargs
154
         **kwargs
144
     ):
155
     ):
146
         self.subject_id = subject_id
157
         self.subject_id = subject_id
147
         self.from_position = from_position
158
         self.from_position = from_position
148
         self.to_position = to_position
159
         self.to_position = to_position
160
+        self.gui_action = gui_action
149
 
161
 
150
     def repr_debug(self) -> str:
162
     def repr_debug(self) -> str:
151
         return '{}: subject_id:{}, from_position:{} to_position: {}'.format(
163
         return '{}: subject_id:{}, from_position:{} to_position: {}'.format(
167
         subject: Subject,
179
         subject: Subject,
168
     ) -> None:
180
     ) -> None:
169
         super().__init__(config, simulation, subject)
181
         super().__init__(config, simulation, subject)
170
-        self._duration = float(self.config.resolve('game.move.walk_ref_time'))
182
+        self._walk_duration = float(self.config.resolve('game.move.walk_ref_time'))
183
+        self._run_duration = float(self.config.resolve('game.move.run_ref_time'))
171
 
184
 
172
     def run(self, data):
185
     def run(self, data):
173
         move_to_data = data[self.move_to_mechanism]
186
         move_to_data = data[self.move_to_mechanism]
184
         return False
197
         return False
185
 
198
 
186
     def _can_move_to_next_step(self, move_to_data: dict) -> bool:
199
     def _can_move_to_next_step(self, move_to_data: dict) -> bool:
187
-        return time.time() - move_to_data['last_intention_time'] >= self._duration
200
+        # TODO: Relation vers cocos ! Deplacer UserAction ?
201
+        if move_to_data['gui_action'] == UserAction.ORDER_MOVE:
202
+            return time.time() - move_to_data['last_intention_time'] >= self._walk_duration
203
+        if move_to_data['gui_action'] == UserAction.ORDER_MOVE_FAST:
204
+            return time.time() - move_to_data['last_intention_time'] >= self._run_duration
188
 
205
 
189
     def _is_fresh_new_step(self, move_to_data: dict) -> bool:
206
     def _is_fresh_new_step(self, move_to_data: dict) -> bool:
190
         return move_to_data['just_reach'] or move_to_data['initial']
207
         return move_to_data['just_reach'] or move_to_data['initial']
208
             self.subject.position = new_position
225
             self.subject.position = new_position
209
             move.last_intention_time = time.time()
226
             move.last_intention_time = time.time()
210
             move.just_reach = True
227
             move.just_reach = True
211
-            event = FinishMoveEvent(self.subject.id, previous_position, new_position)
228
+            event = FinishMoveEvent(
229
+                self.subject.id,
230
+                previous_position,
231
+                new_position,
232
+                gui_action=move.gui_action,
233
+            )
212
         else:
234
         else:
213
             move.just_reach = False
235
             move.just_reach = False
214
-            event = StartMoveEvent(self.subject.id, previous_position, new_position)
236
+            event = StartMoveEvent(
237
+                self.subject.id,
238
+                previous_position,
239
+                new_position,
240
+                gui_action=move.gui_action,
241
+            )
215
 
242
 
216
         move.initial = False
243
         move.initial = False
217
         # Note: Need to explicitly set to update shared data
244
         # Note: Need to explicitly set to update shared data