def _handle_player_collide_block(self, player: Player, block: Block, data, arbiter: pymunk.Arbiter) -> bool: if(block.get_id() == "bounce"): # Propel Mario when collide to BounceBlock self._player.set_velocity((0, -180)) if(block.get_id()== "flag"): self.addScore() #to let the player enter his name to add the score on the highscore file self.level = self.getNextLevel(self.level) #get the nextLevel using the config File self.reset_world(self.level) if(get_collision_direction(player, block) == "A"): #increase the player health in case his on top of the flag player.change_health(1) if(block.get_id()=="tunnel" and get_collision_direction(player, block) == "A" and self.down_pressed is True): #GO THE NEXT LEVEL IF the player pressed up on top of the tunnel self.level = self.getNextTunnelLevel(self.level) self.reset_world(self.level) #Removing the bricks on the left and on the right of the switch if block.get_id() == "switch" and get_collision_direction(player, block) == "A": x,y = block.get_position() block1 = self._world.get_block(x-GRID_WIDTH,y-block.getCollNum()*GRID_HEIGHT) block2 = self._world.get_block(x+GRID_WIDTH,y+block.getCollNum()*GRID_HEIGHT) self._world.remove_block(block1) self._world.remove_block(block2) block.incrementcollNum() block.on_hit(arbiter, (self._world, player)) return True
def setUp(self) -> None: o = None block00 = Block.from_int_array([[o, o, o], [1, o, o], [o, o, o]]) block01 = Block.from_int_array([[o, o, o], [0, 1, o], [o, o, o]]) block10 = Block.from_int_array([[1, 0, 1], [1, 1, o], [1, 1, 1]]) block11 = Block.from_int_array([[o, o, o], [1, o, o], [o, 1, o]]) self.test_board = Board([[block00, block01], [block10, block11]])
def test_rotate_block(self): o = None tests = [{ 'rot': Rotation(Position(0, 0), True), 'new': Block.from_int_array([[1, 1, o], [1, o, o], [o, o, o]]) }, { 'rot': Rotation(Position(0, 1), False), 'new': Block.from_int_array([[o, o, o], [o, 1, o], [o, 0, 1]]) }] for test in tests: new_board = self.test_board.rotate_block(test['rot']) self.assertEqual(new_board.get_block(test['rot'].get_block_pos()), test['new'])
def add_block(self, block: Block, x: float, y: float, *args, **kwargs): """Adds a block to the game world at the grid cell that contains ('x', 'y') Parameters: block (Block): The block to add to the grid x (float): The x-coordinate of the position contained by the cell y (float): The y-coordinate of the position contained by the cell - See add_block_to_grid for other parameters """ col, row = self.xy_to_grid(x, y) row -= block.get_cell_size()[1] - 1 return self.add_block_to_grid(block, col, row, *block.get_cell_size(), *args, **kwargs)
def test_play_marble(self): o = None tests = [{ 'move': Placement(Position(0, 0), Position(0, 0)), 'new': Block.from_int_array([[1, o, o], [1, o, o], [1, 1, o]]), 'colour': 1 }, { 'move': Placement(Position(0, 1), Position(2, 1)), 'new': Block.from_int_array([[o, o, o], [0, 1, o], [1, 0, o]]), 'colour': 0 }] for test in tests: new_board = self.test_board.play_marble(test['move'], test['colour']) self.assertEqual(new_board.get_block(test['move'].get_block_pos()), test['new'])
def _handle_mob_collide_block(self, mob: Mob, block: Block, data, arbiter: pymunk.Arbiter) -> bool: if mob.get_id() == "fireball": if block.get_id() == "brick": self._world.remove_block(block) self._world.remove_mob(mob) return True
def create_block(world: World, block_id: str, x: int, y: int, *args): """Create a new block instance and add it to the world based on the block_id. Parameters: world (World): The world where the block should be added to. block_id (str): The block identifier of the block to create. x (int): The x coordinate of the block. y (int): The y coordinate of the block. """ block_id = BLOCKS[block_id] if block_id == "mystery_empty": block = MysteryBlock() elif block_id == "mystery_coin": block = MysteryBlock(drop="coin", drop_range=(3, 6)) elif block_id == "bounce_block": # Adding bounce, tunnel and flag to the game world block = BounceBlock() elif block_id == "flag": block = FlagpoleBlock() elif block_id == "tunnel": block = TunnelBlock() elif block_id == "switch" : block = switch() else: block = Block(block_id) world.add_block(block, x * BLOCK_SIZE, y * BLOCK_SIZE)
def setUp(self) -> None: o = None self.test_block = Block.from_int_array([ [o, o, o], [1, 1, 1], [0, 1, 0], ])
def _draw_block(self, instance: Block, shape: pymunk.Shape, view: tk.Canvas, offset: Tuple[int, int]) -> List[int]: image = self.load_image(self._block_images[instance.get_id()]) return [ view.create_image(shape.bb.center().x + offset[0], shape.bb.center().y, image=image, tags="block") ]
def _handle_mob_collide_block(self, mob: Mob, block: Block, data, arbiter: pymunk.Arbiter) -> bool: if mob.get_id() == "fireball": if block.get_id() == "brick": self._world.remove_block(block) self._world.remove_mob(mob) if mob.get_id() == "mushroom": if get_collision_direction(block, mob) in ("L", "R"): mob.direction *= -1 return True
def _handle_player_collide_block(self, player: Player, block: Block, data, arbiter: pymunk.Arbiter) -> bool : ''' handle when the player hit some blocks, when they are colliding, the on_hit function will run''' if block.get_id() == "switch": block.on_hit(arbiter, (self._world, player)) return False if block.get_id() == "flag": if get_collision_direction(player, block) == "L" or get_collision_direction(player, block) == "R": self.reset_world(new_level=block.get_filename()) if get_collision_direction(player, block) == "A" : block.on_hit(arbiter, (self._world, player)) if block.get_id() == "tunnel": if get_collision_direction(player, block) == "A": # self._master.bind("s", lambda a : self._tunnel(block)) self._master.bind("<Down>", lambda a : self._tunnel(block)) else: block.on_hit(arbiter, (self._world, player)) return True
def _handle_mob_collide_block(self, mob: Mob, block: Block, data, arbiter: pymunk.Arbiter) -> bool: if(mob.get_id() == "mushroom"): #to change the mob direction when he touch a block if get_collision_direction(block, mob) == "L" or get_collision_direction(block, mob) == "R": mob.set_tempo(-1 * mob.get_tempo()) if mob.get_id() == "fireball": if block.get_id() == "brick": self._world.remove_block(block) self._world.remove_mob(mob) return True
def _handle_player_collide_block(self, player: Player, block: Block, data, arbiter: pymunk.Arbiter) -> bool: if get_collision_direction(player, block) == "A": self._can_jump = True if block._id == "bouncy": if get_collision_direction(player, block) == "A": self._renderer.activate_bouncy(block.get_shape()) elif block._id == "switch": if block.activated(): return False elif block._id == "flagpole": name = self._ask_name() score_name = self._current_level.replace(".txt", "_score.txt") self._scores.load_scores(score_name) self._scores.add_score(name, self._player.get_score()) self._scores.save_scores(score_name) self.reset_world(block._next_level) block.on_hit(arbiter, (self._world, player)) return True
def _handle_player_collide_block(self, player: Player, block: Block, data, arbiter: pymunk.Arbiter) -> bool: if get_collision_direction( player, block ) == "A": # when player touch the blocks, set jumping to false self._player.set_jumping(False) if block.get_id() == "flag": if get_collision_direction(player, block) == "A": block.on_hit(arbiter, data) else: # tell the player to input their name and see if the score records need to be updated self.update_score() if self.get_next_level( ) == 'END': # if there's no further level, ask if start over ans = messagebox.askokcancel( 'Good job, you finish the game', 'Start Over?') if ans: self.reset_world('level1.txt') self._level = 'level1.txt' self._player.clear_score() self._player.change_health( self._player.get_max_health()) self.redraw_status() else: self._master.destroy() else: self.reset_world(self.get_next_level()) self._level = self.get_next_level() elif block.get_id() == "tunnel": if get_collision_direction( player, block) == "A" and self._player.is_duck() is True: self._player.set_duck(False) self.reset_world(self.get_next_level()) elif block.get_id() == 'switches': if block.is_active(): block.on_hit(arbiter, (self._world, player)) block.on_hit(arbiter, (self._world, player)) return True
def init(self): self.allSprites = pygame.sprite.Group() self.walls = pygame.sprite.Group() self.event = pygame.sprite.Group() self.passing = pygame.sprite.Group() self.projectile = pygame.sprite.Group() Block(self, 20, 15, (255, 255, 255), collision=False, event=True) for wall in self.data["blocks"]: for i in range(wall["w"]): for j in range(wall["h"]): breakable = True if "breakable" in wall.keys() else False Block(self, wall["x"] + i, wall["y"] + j, wall["color"], breakable=breakable) self.player = Player(self, self.playerSpawn[0], self.playerSpawn[1]) self.camera = Camera(self.width, self.height)
def test_clockwise_rotate(self): o = None rotated_block = Block.from_int_array([ [0, 1, o], [1, 1, o], [0, 1, o], ]) msg = 'rotate anticlockwise not performing as expected' self.assertEqual(self.test_block.rotate_clockwise(), rotated_block, msg) self.assertEqual( rotated_block.rotate_anticlockwise().rotate_clockwise(), rotated_block)
def _handle_mob_collide_block(self, mob: Mob, block: Block, data, arbiter: pymunk.Arbiter) -> bool : ''' handle when the mob hit other block when the mob is fireball and hit a brick, the block will be destroyed when the mob is mushroom and hit a brick, it will change its direction ''' if mob.get_id() == "fireball" : if block.get_id() == "brick" : self._world.remove_block(block) self._world.remove_mob(mob) if mob.get_id() == "mushroom": if get_collision_direction(mob, block) == "L" or get_collision_direction(mob, block) == "R" : mob.set_tempo(-mob.get_tempo()) return True
def _handle_mob_collide_block(self, mob: Mob, block: Block, data, arbiter: pymunk.Arbiter) -> bool: if mob.get_id() == "fireball" or mob.get_id( ) == 'bullet_l' or mob.get_id() == 'bullet_r': if block.get_id() == "brick": self._world.remove_block(block) self._world.remove_mob(mob) else: self._world.remove_mob(mob) elif mob.get_id( ) == "mushroom": # mushroom bounces back a little when encountering blocks if get_collision_direction( mob, block) == "R" or get_collision_direction( mob, block) == "L": mob.set_tempo(-mob.get_tempo()) elif mob.get_id( ) == 'gang': # gang jumps over the blocks when encountering them if get_collision_direction(mob, block) == "R": mob.set_velocity((50, -350)) elif get_collision_direction(mob, block) == "L": mob.set_velocity((-50, -350)) return True
def _tunnel(self, block: Block): '''when the player stand on a tunnel and press the <down> or s, this function will bring him to a new level''' self.reset_world(new_level=block.get_filename())
def blank(board_size, block_size) -> 'Board': return Board([[Block.blank(block_size) for _ in range(board_size)] for _ in range(board_size)])
def _handle_player_collide_block(self, player: Player, block: Block, data, arbiter: pymunk.Arbiter) -> bool: block.on_hit(arbiter, (self._world, player)) return True
def test_get_size(self): for i in range(1, 10): self.assertEqual(Block.blank(i).get_size(), i)