Exemplo n.º 1
0
def main():
    #pylint: disable=no-member
    pygame.init()
    screen = pygame.display.set_mode((600, 600))
    pygame.display.set_caption("Fall")
    clock = pygame.time.Clock()

    space = pymunk.Space()
    space.gravity = (0.0, 0.0)

    draw_options = pymunk.pygame_util.DrawOptions(screen)

    manager = condep.CDManager.CDManager(screen, space)

    star = CDUtilities.create_star(manager, 100, 100)
    particle = CDUtilities.create_particle(manager, 600, 600)

    balls = star.parts
    balls.append(particle.parts[0])

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                sys.exit(0)
            elif event.type == KEYDOWN and event.key == K_ESCAPE:
                sys.exit(0)

        balls_to_remove = []
        for ball in balls:
            grav_force = pymunk.Vec2d()
            for other_ball in balls:
                grav_force = grav_force + utilities.calc_gravitational_force(
                    other_ball.body, ball.body)

            ball.body.apply_force_at_local_point(grav_force, (0, 0))

        for ball in balls_to_remove:
            space.remove(ball, ball.body)  # 3
            balls.remove(ball)  # 4

        steps_per_frame = 50  #larger value increases accuracy of simulation, but decreases speed
        frames_per_tick = 1

        for x in range(steps_per_frame):
            space.step(1 / (frames_per_tick * steps_per_frame))

        screen.fill((255, 255, 255))

        space.debug_draw(draw_options)

        manager.tick()  #processes changes in CDobjects

        pygame.display.flip()
        clock.tick(
            50)  # argument is max framerate, which we'll probably never reach!
Exemplo n.º 2
0
def _spawn_entity(manager: CDManager, kind: str, offset: int=0, collision: CollisionTypes=None):
    '''Adds an entity of the specified kind to the space, with the optional 
    ability to set position and collision type'''

    x = 200 + offset
    y = 200 + offset

    kind = kind.lower()

    factory_dict = {
        'star': lambda manager: CDUtilities.create_big_particle(manager, x, y),
        'particle': lambda manager: CDUtilities.create_particle(manager, x, y, collision_type=collision),
        'radiation': lambda manager: CDUtilities.create_particle(manager, x, y, collision_type=collision),
    }

    try:
        return factory_dict[kind](manager)
    except KeyError:
        print(f'No definition for {kind}, using generic object for simulation')
        return CDUtilities.create_particle(manager, x, y, collision_type=collision)
Exemplo n.º 3
0
    def test_recognises_absorb_for_simple_entity(self):
        # arrange
        entity = CDUtilities.create_big_particle(self.manager, 0, 0)
        particle = CDUtilities.create_particle(self.manager, 1, 1)
        self.manager.distance_matrices = [[[None, 20], [20, None]]]

        # act
        events = entity._check_for_injest_or_emit(self.manager, Vec2d(0, 0))

        # assert
        self.assertEqual(len(events), 1, 'Should return a single event')
        event = events[0]
        self.assertEqual(event.affected_attribute,
                         EntityAttributes.inside_subject)
        self.assertEqual(event.attribute_outcome,
                         EntityAttributeOutcomes.inside)