Browse Source

some refact and engulf bases

Bastien Sevajol 7 years ago
parent
commit
bdf4e35fa9

+ 0 - 0
sandbox/engulf/behaviour.py View File


+ 48 - 0
sandbox/engulf/gui.py View File

@@ -0,0 +1,48 @@
1
+from random import randint
2
+
3
+import cocos
4
+from cocos.sprite import Sprite
5
+from sandbox.engulf.subject import Cell
6
+from synergine2.terminals import TerminalPackage
7
+from synergine2_cocos2d.gui import Gui, GridLayerMixin
8
+from synergine2_cocos2d.gui import MainLayer as BaseMainLayer
9
+
10
+
11
+class CellsLayer(GridLayerMixin, BaseMainLayer):
12
+    def __init__(self, *args, **kwargs):
13
+        super().__init__(*args, **kwargs)
14
+        self.cells = {}
15
+
16
+    def born(self, grid_position):
17
+        cell = Sprite('resources/cell.png')
18
+        cell.rotation = randint(0, 360)
19
+        self.grid_manager.scale_sprite(cell)
20
+        self.grid_manager.position_sprite(cell, grid_position)
21
+        self.cells[grid_position] = cell
22
+        self.add(cell)
23
+
24
+
25
+class MainLayer(GridLayerMixin, BaseMainLayer):
26
+    def __init__(self, *args, **kwargs):
27
+        super().__init__(*args, **kwargs)
28
+        self.cells = CellsLayer(terminal=kwargs.pop('terminal'))
29
+        self.add(self.cells)
30
+
31
+
32
+class Game(Gui):
33
+    def __init__(self, *args, **kwargs):
34
+        super().__init__(*args, **kwargs)
35
+
36
+        self.main_layer = MainLayer(terminal=self.terminal)
37
+        self.main_scene = cocos.scene.Scene(self.main_layer)
38
+        self.positions = {}
39
+
40
+    def get_main_scene(self):
41
+        return self.main_scene
42
+
43
+    def before_received(self, package: TerminalPackage):
44
+        if package.subjects:  # It's thirst package
45
+            for subject in package.subjects:
46
+                if isinstance(subject, Cell):
47
+                    self.positions[subject.id] = subject.position
48
+                    self.main_layer.cells.born(subject.position)

BIN
sandbox/engulf/resources/cell.png View File


+ 80 - 1
sandbox/engulf/run.py View File

@@ -17,4 +17,83 @@ Engulf is simulation containing:
17 17
       * eat: - eat background stuff, + eat subjects
18 18
       * alone/not alone: - be alone + not alone
19 19
 
20
-"""
20
+"""
21
+from random import randint
22
+
23
+from sandbox.engulf.subject import Cell
24
+from synergine2.core import Core
25
+from synergine2.cycle import CycleManager
26
+from synergine2.terminals import TerminalManager, Terminal, TerminalPackage
27
+from synergine2.xyz import Simulation
28
+from synergine2.xyz import XYZSubjects
29
+
30
+
31
+class Engulf(Simulation):
32
+    pass
33
+
34
+
35
+class GameTerminal(Terminal):
36
+    subscribed_events = []
37
+
38
+    def __init__(self):
39
+        super().__init__()
40
+        self.gui = None
41
+
42
+    def receive(self, package: TerminalPackage):
43
+        self.gui.before_received(package)
44
+        super().receive(package)
45
+        self.gui.after_received(package)
46
+
47
+    def run(self):
48
+        from sandbox.engulf import gui
49
+        self.gui = gui.Game(self)
50
+        self.gui.run()
51
+
52
+
53
+def get_random_subjects(
54
+        simulation: Simulation,
55
+        count: int,
56
+        x_min: int,
57
+        y_min: int,
58
+        x_max: int,
59
+        y_max: int,
60
+) -> [Cell]:
61
+    cells = XYZSubjects(simulation=simulation)
62
+
63
+    while len(cells) < count:
64
+        position = (
65
+            randint(x_min, x_max+1),
66
+            randint(y_min, y_max+1),
67
+            0
68
+        )
69
+        if position not in cells.xyz:
70
+            cells.append(Cell(
71
+                simulation=simulation,
72
+                position=position,
73
+            ))
74
+
75
+    return cells
76
+
77
+
78
+def main():
79
+    simulation = Engulf()
80
+    subjects = get_random_subjects(
81
+        simulation,
82
+        30,
83
+        -34,
84
+        -34,
85
+        34,
86
+        34,
87
+    )
88
+    simulation.subjects = subjects
89
+
90
+    core = Core(
91
+        simulation=simulation,
92
+        cycle_manager=CycleManager(simulation=simulation),
93
+        terminal_manager=TerminalManager([GameTerminal()]),
94
+    )
95
+    core.run()
96
+
97
+
98
+if __name__ == '__main__':
99
+    main()

+ 12 - 0
sandbox/engulf/subject.py View File

@@ -0,0 +1,12 @@
1
+from synergine2.simulation import Subject
2
+from synergine2.xyz import XYZSubjectMixin
3
+
4
+COLLECTION_CELL = 'CELL'
5
+COLLECTION_ALIVE = 'ALIVE'
6
+
7
+
8
+class Cell(XYZSubjectMixin, Subject):
9
+    collections = [
10
+        COLLECTION_CELL,
11
+        COLLECTION_ALIVE,
12
+    ]

+ 7 - 79
sandbox/life_game/gui.py View File

@@ -5,13 +5,12 @@ from cocos.layer import ScrollableLayer, Layer
5 5
 from cocos.sprite import Sprite
6 6
 from pyglet.window import key as wkey
7 7
 from random import randint
8
-
8
+from sandbox.life_game.simulation import CellBornEvent
9 9
 from sandbox.life_game.simulation import CellDieEvent, Cell, InvertCellStateBehaviour, \
10 10
     EmptyPositionWithLotOfCellAroundEvent
11
-from sandbox.life_game.simulation import CellBornEvent
12
-from synergine2.gui import Gui
13
-from synergine2.terminals import TerminalPackage
14 11
 from synergine2.terminals import Terminal
12
+from synergine2.terminals import TerminalPackage
13
+from synergine2_cocos2d.gui import Gui, GridLayerMixin, MainLayer as BaseMainLayer
15 14
 
16 15
 cell_scale = ScaleBy(1.1, duration=0.25)
17 16
 cell_rotate = RotateBy(360, duration=30)
@@ -19,57 +18,11 @@ flash_flash = ScaleBy(8, duration=0.5)
19 18
 flash_rotate = RotateBy(360, duration=6)
20 19
 
21 20
 
22
-class GridManager(object):
23
-    def __init__(
24
-        self,
25
-        layer: Layer,
26
-        square_width: int,
27
-        border: int=0,
28
-    ):
29
-        self.layer = layer
30
-        self.square_width = square_width
31
-        self.border = border
32
-
33
-    @property
34
-    def final_width(self):
35
-        return self.square_width + self.border
36
-
37
-    def scale_sprite(self, sprite: Sprite):
38
-        sprite.scale_x = self.final_width / sprite.image.width
39
-        sprite.scale_y = self.final_width / sprite.image.height
40
-
41
-    def position_sprite(self, sprite: Sprite, grid_position):
42
-        grid_x = grid_position[0]
43
-        grid_y = grid_position[1]
44
-        sprite.position = grid_x * self.final_width, grid_y * self.final_width
45
-
46
-    def get_window_position(self, grid_position_x, grid_position_y):
47
-        grid_x = grid_position_x
48
-        grid_y = grid_position_y
49
-        return grid_x * self.final_width, grid_y * self.final_width
50
-
51
-    def get_grid_position(self, window_x, window_y, z=0) -> tuple:
52
-        window_size = director.get_window_size()
53
-
54
-        window_center_x = window_size[0] // 2
55
-        window_center_y = window_size[1] // 2
56
-
57
-        window_relative_x = window_x - window_center_x
58
-        window_relative_y = window_y - window_center_y
59
-
60
-        real_width = self.final_width * self.layer.scale
61
-
62
-        return int(window_relative_x // real_width),\
63
-               int(window_relative_y // real_width),\
64
-               z
65
-
66
-
67
-class Cells(Layer):
21
+class Cells(GridLayerMixin, Layer):
68 22
     def __init__(self):
69 23
         super().__init__()
70 24
         self.cells = {}
71 25
         self.flashs = []
72
-        self.grid_manager = GridManager(self, 32, border=2)
73 26
 
74 27
     def born(self, grid_position):
75 28
         if grid_position in self.cells:
@@ -103,15 +56,11 @@ class Cells(Layer):
103 56
         self.add(flash)
104 57
 
105 58
 
106
-class MainLayer(ScrollableLayer):
59
+class MainLayer(GridLayerMixin, BaseMainLayer):
107 60
     is_event_handler = True
108 61
 
109
-    def __init__(self, terminal: Terminal):
110
-        super().__init__()
111
-
112
-        self.terminal = terminal
113
-        self.scroll_step = 100
114
-        self.grid_manager = GridManager(self, 32, border=2)
62
+    def __init__(self, *args, **kwargs):
63
+        super().__init__(*args, **kwargs)
115 64
 
116 65
         self.background = Sprite('resources/banner-1711735_640.jpg')
117 66
         self.background.position = 0, 0
@@ -131,27 +80,6 @@ class MainLayer(ScrollableLayer):
131 80
         window_size = director.get_window_size()
132 81
         self.position = window_size[0] // 2, window_size[1] // 2
133 82
 
134
-    def on_key_press(self, key, modifiers):
135
-        if key == wkey.LEFT:
136
-            self.position = (self.position[0] + self.scroll_step, self.position[1])
137
-
138
-        if key == wkey.RIGHT:
139
-            self.position = (self.position[0] - self.scroll_step, self.position[1])
140
-
141
-        if key == wkey.UP:
142
-            self.position = (self.position[0], self.position[1] - self.scroll_step)
143
-
144
-        if key == wkey.DOWN:
145
-            self.position = (self.position[0], self.position[1] + self.scroll_step)
146
-
147
-        if key == wkey.A:
148
-            if self.scale >= 0.3:
149
-                self.scale -= 0.2
150
-
151
-        if key == wkey.Z:
152
-            if self.scale <= 4:
153
-                self.scale += 0.2
154
-
155 83
     def on_mouse_press(self, x, y, buttons, modifiers):
156 84
         x, y = director.get_virtual_coordinates(x, y)
157 85
         grid_position = self.grid_manager.get_grid_position(x, y)

+ 0 - 32
synergine2/gui.py View File

@@ -1,32 +0,0 @@
1
-import cocos
2
-import pyglet
3
-
4
-from synergine2.terminals import Terminal
5
-from synergine2.terminals import TerminalPackage
6
-
7
-
8
-class Gui(object):
9
-    def __init__(
10
-            self,
11
-            terminal: Terminal,
12
-            read_queue_interval: float= 1/60.0,
13
-    ):
14
-        self._read_queue_interval = read_queue_interval
15
-        self.terminal = terminal
16
-        cocos.director.director.init()
17
-
18
-    def run(self):
19
-        pyglet.clock.schedule_interval(
20
-            lambda *_, **__: self.terminal.read(),
21
-            self._read_queue_interval,
22
-        )
23
-        cocos.director.director.run(self.get_main_scene())
24
-
25
-    def get_main_scene(self) -> cocos.cocosnode.CocosNode:
26
-        raise NotImplementedError()
27
-
28
-    def before_received(self, package: TerminalPackage):
29
-        pass
30
-
31
-    def after_received(self, package: TerminalPackage):
32
-        pass

+ 0 - 0
synergine2_cocos2d/__init__.py View File


+ 129 - 0
synergine2_cocos2d/gui.py View File

@@ -0,0 +1,129 @@
1
+import cocos
2
+import pyglet
3
+from pyglet.window import key as wkey
4
+from cocos.director import director
5
+from cocos.layer import ScrollableLayer, Layer
6
+from cocos.sprite import Sprite
7
+
8
+from synergine2.terminals import Terminal
9
+from synergine2.terminals import TerminalPackage
10
+
11
+
12
+class GridManager(object):
13
+    def __init__(
14
+        self,
15
+        layer: Layer,
16
+        square_width: int,
17
+        border: int=0,
18
+    ):
19
+        self.layer = layer
20
+        self.square_width = square_width
21
+        self.border = border
22
+
23
+    @property
24
+    def final_width(self):
25
+        return self.square_width + self.border
26
+
27
+    def scale_sprite(self, sprite: Sprite):
28
+        sprite.scale_x = self.final_width / sprite.image.width
29
+        sprite.scale_y = self.final_width / sprite.image.height
30
+
31
+    def position_sprite(self, sprite: Sprite, grid_position):
32
+        grid_x = grid_position[0]
33
+        grid_y = grid_position[1]
34
+        sprite.position = grid_x * self.final_width, grid_y * self.final_width
35
+
36
+    def get_window_position(self, grid_position_x, grid_position_y):
37
+        grid_x = grid_position_x
38
+        grid_y = grid_position_y
39
+        return grid_x * self.final_width, grid_y * self.final_width
40
+
41
+    def get_grid_position(self, window_x, window_y, z=0) -> tuple:
42
+        window_size = director.get_window_size()
43
+
44
+        window_center_x = window_size[0] // 2
45
+        window_center_y = window_size[1] // 2
46
+
47
+        window_relative_x = window_x - window_center_x
48
+        window_relative_y = window_y - window_center_y
49
+
50
+        real_width = self.final_width * self.layer.scale
51
+
52
+        return int(window_relative_x // real_width),\
53
+               int(window_relative_y // real_width),\
54
+               z
55
+
56
+
57
+class GridLayerMixin(object):
58
+    def __init__(self, *args, **kwargs):
59
+        square_width = kwargs.pop('square_width', 32)
60
+        square_border = kwargs.pop('square_border', 2)
61
+        self.grid_manager = GridManager(
62
+            self,
63
+            square_width=square_width,
64
+            border=square_border,
65
+        )
66
+        super().__init__(*args, **kwargs)
67
+
68
+
69
+class MainLayer(ScrollableLayer):
70
+    is_event_handler = True
71
+
72
+    def __init__(self, terminal: Terminal, scroll_step: int=100):
73
+        super().__init__()
74
+
75
+        self.terminal = terminal
76
+        self.scroll_step = scroll_step
77
+        self.grid_manager = GridManager(self, 32, border=2)
78
+
79
+        # Set scene center on center of screen
80
+        window_size = director.get_window_size()
81
+        self.position = window_size[0] // 2, window_size[1] // 2
82
+
83
+    def on_key_press(self, key, modifiers):
84
+        if key == wkey.LEFT:
85
+            self.position = (self.position[0] + self.scroll_step, self.position[1])
86
+
87
+        if key == wkey.RIGHT:
88
+            self.position = (self.position[0] - self.scroll_step, self.position[1])
89
+
90
+        if key == wkey.UP:
91
+            self.position = (self.position[0], self.position[1] - self.scroll_step)
92
+
93
+        if key == wkey.DOWN:
94
+            self.position = (self.position[0], self.position[1] + self.scroll_step)
95
+
96
+        if key == wkey.A:
97
+            if self.scale >= 0.3:
98
+                self.scale -= 0.2
99
+
100
+        if key == wkey.Z:
101
+            if self.scale <= 4:
102
+                self.scale += 0.2
103
+
104
+
105
+class Gui(object):
106
+    def __init__(
107
+            self,
108
+            terminal: Terminal,
109
+            read_queue_interval: float= 1/60.0,
110
+    ):
111
+        self._read_queue_interval = read_queue_interval
112
+        self.terminal = terminal
113
+        cocos.director.director.init()
114
+
115
+    def run(self):
116
+        pyglet.clock.schedule_interval(
117
+            lambda *_, **__: self.terminal.read(),
118
+            self._read_queue_interval,
119
+        )
120
+        cocos.director.director.run(self.get_main_scene())
121
+
122
+    def get_main_scene(self) -> cocos.cocosnode.CocosNode:
123
+        raise NotImplementedError()
124
+
125
+    def before_received(self, package: TerminalPackage):
126
+        pass
127
+
128
+    def after_received(self, package: TerminalPackage):
129
+        pass