Exemplo n.º 1
0
class AbstractTestBallPhysicsComponent(object):

    OBJECT_POS = (50, 50)
    PLAY_RECT = Rect(0, 0, 100, 100)

    def setup(self):
        self.game_object = StubGameObject(self.OBJECT_POS[0], self.OBJECT_POS[1])
        self.pack = StubGameObject(70, 70)
        self.move_comp = BallPhysicsComponent(self.pack, self.PLAY_RECT)
        self.move_comp.game_object = self.game_object

    def assert_ball_on_pack(self):
        assert self.game_object.x == self.pack.x
        assert self.game_object.y == self.pack.get_rect().top + self.game_object.height / 2

    def update(self):
        self.move_comp.update(1)
Exemplo n.º 2
0
 def setup(self):
     self.game_object = StubGameObject(self.OBJECT_POS[0], self.OBJECT_POS[1])
     self.pack = StubGameObject(70, 70)
     self.move_comp = BallPhysicsComponent(self.pack, self.PLAY_RECT)
     self.move_comp.game_object = self.game_object
Exemplo n.º 3
0
 def create_ball(self):
     self.ball_physics = BallPhysicsComponent(self.pack, self.screen_rect)
     self.ball = SpriteGameObjectCreator(self.sprite_factory.create_ball_sprite()) \
         .components([self.ball_physics, SimpleMoveComponent(), ClampComponent(self.screen_rect)]) \
         .create()
     self.game_objects.append(self.ball)
Exemplo n.º 4
0
class BlockOut:
    def __init__(self):
        self.game_factory = None
        self.input_handler = None
        self.layout_provider = None
        self.sprite_factory = None
        self.screen_rect = None
        self.sound_factory = None

    def init(self):
        self.game_objects = []
        self.background = self.create_background()
        self.win_message = self.game_factory.load_image('win_message.png')
        self.createAllSprites()

    def create_background(self):
        return self.game_factory.load_image('background.png')

    def createAllSprites(self):
        self.create_pack()
        self.create_ball()
        self.create_blocks()

    def create_pack(self):
        self.pack = SpriteGameObjectCreator(self.sprite_factory.create_pack_sprite()) \
            .components(
            [UserInputComponent(self.input_handler), SimpleMoveComponent(), ClampComponent(self.screen_rect), SoundOnCollisionComponent(PACK, self.sound_factory)]) \
            .create_at(self.screen_rect.width / 2, 20)
        self.game_objects.append(self.pack)

    def create_ball(self):
        self.ball_physics = BallPhysicsComponent(self.pack, self.screen_rect)
        self.ball = SpriteGameObjectCreator(self.sprite_factory.create_ball_sprite()) \
            .components([self.ball_physics, SimpleMoveComponent(), ClampComponent(self.screen_rect)]) \
            .create()
        self.game_objects.append(self.ball)

    def create_blocks(self):
        self.blocks = BlocksGameObjectCreator() \
            .sprite_factory(self.sprite_factory) \
            .sound_factory(self.sound_factory) \
            .create_at(self.screen_rect.center)
        self.game_objects.append(self.blocks)

    def on_update(self, elapsed_time):
        if self.input_handler.key_down(SPACE):
            self.ball_physics.play()
        self.update_game_objects(elapsed_time)
        self.update_layout_if_needed()
        self.detect_collisions()

    def update_game_objects(self, elapsed_time):
        to_add = []
        to_remove = []
        for go in self.game_objects:
            go.update(elapsed_time)
            self.update_added_and_removed(go, to_add, to_remove)

        self.game_objects = [v for v in self.game_objects if v not in to_remove]
        self.game_objects.extend(to_add)

    def update_added_and_removed(self, go, to_add, to_remove):
        if go.alive:
            to_add.extend(go.new_objects)
            go.new_objects = []
        else:
            to_remove.append(go)

    def update_layout_if_needed(self):
        if self.blocks.num_of_blocks == 0:
            if not self.layout_provider.current_is_last():
                self.blocks.update_layout(self.layout_provider.get_next_layout())
            self.ball_physics.stay()

    def detect_collisions(self):
        for i in xrange(len(self.game_objects)):
            for j in xrange(i + 1, len(self.game_objects)):
                obj_1 = self.game_objects[i]
                obj_2 = self.game_objects[j]
                if obj_1.active and obj_2.active:
                    if obj_1.collides_with(obj_2):
                        obj_1.handle_collision_with(obj_2)
                        obj_2.handle_collision_with(obj_1)

    def on_render(self):
        self.background.blit(0, 0)
        if self.layout_provider.current_is_last() and self.blocks.num_of_blocks == 0:
            self.win_message.blit(self.screen_rect.width / 2 - self.win_message.width / 2, self.screen_rect.height / 2)
        self.sprite_factory.draw()