def __init__(self, verts, color=(1, 1, 1), draw=True, friction=None): self.indexes = earcut(verts) if draw: size = len(verts) // 2 self.dl = self.batch.add_indexed( size, gl.GL_TRIANGLES, self.group, self.indexes, ('v2f/static', np.array(verts) / SPACE_SCALE), ('t2f/static', np.array(verts) / (512 * SPACE_SCALE * 2)), ('c3f/static', [c for _ in range(size) for c in color]), ) else: self.dl = None self.shapes = [] verts = np.array(verts) tris = verts.reshape(-1, 2)[self.indexes].reshape(-1, 3, 2) for tri in tris: shp = Poly(space.static_body, tri) shp.friction = friction or self.FRICTION shp.elasticity = self.ELASTICITY space.add(shp) self.shapes.append(shp)
def init_space(): sp = Space() # Cria quadrado L = 5 player = Body(mass=1, moment=100) shape = Poly(player, [(-L, -L), (L, -L), (L, L), (-L, L)]) player.position = (50, 40) player.velocity = (-25, 25) shape.elasticity = 1.0 shape.color = pyxel.COLOR_RED # Cria margens line = Body(body_type=Body.STATIC) lines = [ Segment(line, (-30, -30), (270, -30), 2), Segment(line, (-30, 210), (270, 210), 2), Segment(line, (-30, -30), (-30, 210), 2), Segment(line, (270, -30), (270, 210), 2), ] for line in lines: line.elasticity = 1.0 # Adiciona elementos ao espaço sp.add(player, shape, *lines) sp.player = player return sp
def init_space(): sp = Space() sp.gravity = (0, 50) chain = make_pivot_chain(sp, (0, 0), (240, 30), 30) sp.add(constraint.PivotJoint(chain[0], sp.static_body, chain[0].position)) # Cria quadrado L = 25 player = Body(mass=1, moment=100) shape = Poly(player, [(-L, -L), (L, -L), (L, L), (-L, L)]) player.position = (90, 60) player.velocity = (-25, 25) shape.elasticity = 1.0 shape.color = pyxel.COLOR_RED shape.collision_type = 42 ball = Body(mass=1, moment=200) ball_shape = Circle(ball, 20) ball.position = (player.position.x, 130) ball_shape.elasticity = 1.0 shape.color = pyxel.COLOR_NAVY ball_shape.collision_type = 42 joint1 = constraint.DampedSpring(player, ball, (0, 0), (20, 0), 20, 3, 0.5) joint2 = constraint.PivotJoint(sp.static_body, player, (65, 35)) joint1.collide_bodies = False sp.add(joint1, joint2) body2 = Body(1, 100) sp.add(body2) sp.add(Poly(body2, [(-3, 3), (3, 3), (3, -3), (-3, -3)])) body2.position = 220, 50 sp.add(constraint.DampedRotarySpring(body2, ball, 0, 2, 1)) sp.body2 = body2 # Cria margens line = Body(body_type=Body.STATIC) e = 0 lines = [ Segment(line, (-e, -e), (240 + e, -e), 2), Segment(line, (-e, 180 + e), (240 + e, 180 + e), 2), Segment(line, (-e, -e), (-e, 180 + e), 2), Segment(line, (240 + e, -e), (240 + e, 180 + e), 2), ] for line in lines: line.elasticity = 1.0 lines = [] # Adiciona elementos ao espaço sp.add(player, shape, ball, ball_shape, *lines) sp.player = player #handler = sp.add_collision_handler(42, 42) #handler.begin = lambda *args: False return sp
def __createPolyShape(info: 'Dict[str, Any]') -> 'Poly': points = tuple( (point.get('x', 0), point.get('y', 0)) for point in info['Point']) shape = Poly(None, points) shape.mass = info['mass'] shape.elasticity = info.get('elasticity', 0.5) shape.friction = info.get('friction', 0.5) return shape
def init_space(): sp = Space() h = 20 * sqrt(2) player = Body(mass=1, moment=400) shape = Poly(player, [(-20, -h / 3), (20, -h / 3), (0, 2 / 3 * h)]) player.position = (90, 90) shape.elasticity = 1.0 shape.color = pyxel.COLOR_YELLOW line = Body(body_type=Body.STATIC) lines = [ Segment(line, (0, 1), (240, 1), 2), Segment(line, (0, 179), (240, 179), 2), Segment(line, (1, 0), (1, 180), 2), Segment(line, (239, 0), (239, 180), 2), ] for line in lines: line.elasticity = 1.0 line.color = pyxel.COLOR_PEACH sp.add(player, shape, *lines) sp.player = player return sp
def create_shape(self): shape = Poly(self.body, self.item.geometry.verts, (0, 0)) shape.elasticity = 1.0 shape.friction = 0.0 return shape
def get_shape(self, body): shape = Poly(body, self.verts, (0, 0)) shape.elasticity = 0.5 shape.friction = 10.0 return shape