/
movable_object.py
76 lines (62 loc) · 2.67 KB
/
movable_object.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
__author__ = 'Ecialo'
from cocos.sprite import Sprite
from cocos import euclid as eu
import Box2D as b2
from registry.metric import pixels_to_tiles
from registry.metric import tiles_to_pixels
#TODO: move fixture adding to more specific classes
class Movable_Object(Sprite):
tilemap = None
world = None
def __init__(self, img, cshape=None, position=(0, 0), vertical_speed=0.0, horizontal_speed=0.0):
super(Movable_Object, self).__init__(img, position)
self.image = img
self.cshape = cshape
if cshape:
self.cshape.center = eu.Vector2(*position)
self.b2body = None
self.setup_b2body()
self.b2body.linearVelocity = pixels_to_tiles((horizontal_speed, vertical_speed))
self.b2body.position = position
self.ground_count = 0
self.on_ground = False
def setup_b2body(self):
self.b2body = self.world.CreateDynamicBody(fixedRotation=True, userData=self, allowSleep=False)
def set_position(self, pos):
val = tiles_to_pixels(pos)
self.position = val
self.cshape.center = val
def transfer(self):
to_transfer = {'fixedRotation': 'fixedRotation',
'userData': 'userData',
'sleepingAllowed': 'allowSleep'}
transfer_dict = {}
for old_name, new_name in to_transfer.items():
transfer_dict[new_name] = eval('self.b2body.'+old_name)
new_b2body = self.world.CreateDynamicBody(**transfer_dict)
for fixture in self.b2body.fixtures:
to_transfer = {'filterData': 'filter',
'friction': 'friction',
'sensor': 'isSensor',
'userData': 'userData',
'shape': 'shape'}
transfer_dict = {}
for old_name, new_name in to_transfer.items():
transfer_dict[new_name] = eval('fixture.'+old_name)
def_fix = b2.b2FixtureDef(**transfer_dict)
new_fixture = new_b2body.CreateFixture(def_fix)
handlers = self.b2body.cool_world.true_listener.getHandlers(fixture)
if handlers:
self.b2body.cool_world.true_listener.removeEventHandler(fixture)
self.world.addEventHandler(new_fixture, *handlers)
self.b2body.cool_world.destroy_body(self.b2body)
self.b2body = new_b2body
def onGroundBegin(self, fixture):
self.ground_count += 1
self.on_ground = True
def onGroundEnd(self, fixture):
self.ground_count -= 1
if self.ground_count == 0:
self.on_ground = False
def update(self, dt):
self.set_position(self.b2body.position)