def __init__(self, **kwargs): self.is_moving = False self.is_frozen = False self.current_lane = 2 self.soap_fuel = self.soap_fuel_max = 30000 super().__init__( body_type=BodyNodeType.kinematic, position=LANE_HERO_SLOTS[self.current_lane], scale=Vector.xy(0.7), **kwargs, ) self.hitbox = self.add_child( HitboxNode( trigger_id=CollisionTrigger.soap, shape=Polygon.from_box(Vector(138, 330)), # color=Color(1., 0., 0., 0.5), z_index=100, )) self.transitions_manager.set( 'animation', NodeSpriteTransition(self.SPRITE_FRAMES, loops=0, duration=len(self.SPRITE_FRAMES) * self.FRAME_DURATION), )
def update_position(node, dt): # reimplements default position function node.position += (node.velocity + node._velocity_bias) * dt node.rotation += (node.angular_velocity + node._angular_velocity_bias) * dt node._velocity_bias = Vector.xy(0) node._angular_velocity_bias = 0
def __init__(self): self.camera.position = Vector(0., 0.) snake_image = Sprite(PYTHON_IMAGE_PATH) minimap_view = self.views[1] minimap_view.origin = Vector(600, 0) minimap_view.dimensions = Vector(200, 600) minimap_view.camera.position = Vector.xy(0) minimap_view.camera.scale = Vector.xy(200 / 800) minimap_view.clear_color = Color(0.5, 0.5, 0.5, 1) for _ in range(100): x = random.randrange(-400, 400) y = random.randrange(-1200, 1200) self.root.add_child( Node(sprite=snake_image, views={0, 1}, position=Vector(x, y))) self.viewport = Node(color=Color(1, 0, 0, 0.1), views={1}, shape=Polygon.from_box(Vector(800, 600))) self.root.add_child(self.viewport)
def __init__(self): program = Program.from_files( 'demos/assets/shaders/vs_default.sc', 'demos/assets/shaders/fs_default.sc', ) uniforms = {'u_blur': Uniform(UniformType.vec4)} self.blur_quality = 20. self.material = Material(program, uniforms) self.material.set_uniform_value('u_blur', (self.blur_quality, 0, 0, 0)) self.node = self.root.add_child( Node(sprite=Sprite(PYTHON_IMAGE_PATH), position=Vector(400, 300), scale=Vector.xy(2), material=self.material))
def update_velocity(node, gravity, damping, dt): # reimplements default velocity function if node.body_type == BodyNodeType.kinematic: return assert node.mass > 0 and node.moment > 0 f = node.force v = node.velocity m_inv = node.mass_inverse node.velocity = (v * damping) + ((gravity + (f * m_inv)) * dt) t = node.torque w = node.angular_velocity node.angular_velocity = (w * damping) + (t * m_inv * dt) node.force = Vector.xy(0) node.torque = 0
def __init__(self, position): super().__init__( position=position, velocity=Vector(random.uniform(-20, 20), 0.), rotation_degrees=random.uniform(0, 360), scale=Vector(0.2, 0.2) + Vector.xy(math.fabs(random.gauss(0.0, 1.0)), ), lifetime=60000., # 60 seconds ) self.hitbox = self.add_child( HitboxNode(shape=random.choice(PIECE_SHAPES), )) if random.randint(0, 1): self.hitbox.color = Color(0.0, 1.0, 0.0, 1.) self.hitbox.mask = QueryMask.clickable else: self.hitbox.color = Color(1.0, 1.0, 0.0, 1.) self.hitbox.mask = QueryMask.not_clickable
def test_vector(): v1 = Vector.xy(1.) assert v1.x == 1. and v1.y == 1. v2 = Vector(2., 2.) assert v2.x == 2. and v2.y == 2. assert v1 == Vector(1., 1.) assert v2 == Vector(2., 2.) zero = Vector(0, 0) assert not zero assert zero.is_zero() assert v1 + v2 == Vector.xy(3) assert Vector.xy(3.) - v2 == v1 assert v1 * 10 == Vector.xy(10.) assert Vector.xy(10.) / 10 == v1 assert -v1 == Vector.xy(-1.) rotated_vector = Vector(1, 0).rotate_angle_degrees(90) assert pytest.approx(rotated_vector.x) == 0 assert pytest.approx(rotated_vector.y) == 1. v = Vector.from_angle_degrees(90) assert pytest.approx(rotated_vector.x) == 0 assert pytest.approx(rotated_vector.y) == 1. assert v.to_angle_degrees() == 90 assert Vector(1., 0).angle_between_degrees(Vector(0, 1.)) == 90 assert Vector(1., 0).normalize().dot(Vector(1, 1.).normalize()) > 0 assert Vector(1., 0).normalize().dot(Vector(0, 1.).normalize()) == 0 assert Vector(1., 0).normalize().dot(Vector(-1, 1.).normalize()) < 0 assert Vector(0, 0).distance(Vector(10., 0)) == 10. v = Vector(10., 10.) assert v.normalize() == v / v.length() assert v.length() == math.sqrt(v.x**2 + v.y**2)
def test_engine(): with Engine(Vector.xy(1)) as engine: yield engine
def kill(self): self.soap.transition = NodeTransitionsParallel([ NodeTransition(Node.scale, Vector.xy(0.0), duration=1500), NodeTransition(Node.color, Color(1., 0., 0., 0.), duration=1500), ]) self.soap.lifetime = 1500