May-28-2023, 01:44 PM
hi, im trying to implement a item colection sistem on my game but i cant understand why is not workin, the items are suposed to disapear wen you touch them and spawn the next one but i cant make it work, can anybody help pls?heres my code
pygame.init() screen = pygame.display.set_mode((screen_width, screen_height)) clock = pygame.time.Clock() level = Level(level_map, screen) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() screen.fill((0,0,0)) screen.blit(background,(5,0)) level.run() pygame.display.update() clock.tick(60) level_map = [ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "X XXXXXX X", "X XXXXXX X", "X XXXXXX X", "X XXXXXX X", "X XXXXXX X", "XXXXXXXXXXX X", "X X F X", "X X XXXXXXXXXXXXX", "X X XXXXXXXXXXXXX", "X X", "X XXXXXXXXXXXX X", "X X", "X XXXXXXXX", "X XXXXXXXX", "X M P XXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", ] tile_size = 40 screen_width =850 screen_height = len(level_map) * tile_size class Tile(pygame.sprite.Sprite): def __init__(self, pos, size): super().__init__() self.image = pygame.Surface((size, size)) self.image.fill((35,35,35)) self.rect = self.image.get_rect(topleft=pos) def update(self, x_shift): self.rect.x += x_shift class Flor(pygame.sprite.Sprite): def __init__(self, pos, size): super().__init__() self.image = pygame.Surface((size, size)) self.image.fill('yellow') self.rect = self.image.get_rect(topleft=pos) def update(self, x_shift): self.rect.x += x_shift class Mesa(pygame.sprite.Sprite): def __init__(self, pos, size): super().__init__() self.image = pygame.Surface((size, size)) self.image.fill('brown') self.rect = self.image.get_rect(topleft=pos) def update(self, x_shift): self.rect.x += x_shift class Player(pygame.sprite.Sprite): def __init__(self, pos): super().__init__() self.image = pygame.Surface((32, 64)) self.image.fill("red") self.rect = self.image.get_rect(topleft=pos) # player movment self.direction = pygame.math.Vector2(0, 0) self.speed = 25 self.gravity = 0.8 self.jump_speed = -18 self.jumping = False def update(self): keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: self.direction.x = -1 elif keys[pygame.K_RIGHT]: self.direction.x = 1 else: self.direction.x = 0 if (keys[pygame.K_UP] or keys[pygame.K_SPACE]) and not self.jumping: self.direction.y = self.jump_speed self.jumping = True def move_y(self): self.direction.y += self.gravity self.rect.y += self.direction.y def move_x(self): self.rect.x += self.direction.x * self.speed COLECTED_ITEMS = 0 class Level: def __init__(self, level_data, surface): # level setup self.display_surface = surface self.setup_level(level_data) self.world_shift = 0 def setup_level(self, layout): self.tiles = pygame.sprite.Group() self.player = pygame.sprite.GroupSingle() for row_index, row in enumerate(layout): for col_index, cell in enumerate(row): x = col_index * tile_size y = row_index * tile_size if cell == "X": tile = Tile((x, y), tile_size) self.tiles.add(tile) if cell == "P": player_sprite = Player((x, y)) self.player.add(player_sprite) if (cell == "F") and COLECTED_ITEMS == 4: tile = Flor((x, y), tile_size) self.tiles.add(tile) if (cell == "M") and COLECTED_ITEMS == 0: tile = Mesa((x, y), tile_size) self.tiles.add(tile) def colision_itens(self): player = self.player.sprite for Mesa in self.tiles.sprites(): if Mesa.rect.colliderect(player.rect): if player.direction.x < 0 or player.direction.x > 0: COLECTED_ITEMS + 4 def scream_scroll(self): Player = self.player.sprite Player_x = Player.rect.centerx direction_x = Player.direction.x if Player_x < screen_width / 5 and direction_x < 0: self.world_shift = 5 Player.speed = 0 elif Player_x > screen_width - (screen_width / 5) and direction_x > 0: self.world_shift = -5 Player.speed = 0 else: self.world_shift = 0 Player.speed = 5 def colision_x(self): player = self.player.sprite player.move_x() for sprite in self.tiles.sprites(): if sprite.rect.colliderect(player.rect): if player.direction.x < 0: player.rect.left = sprite.rect.right elif player.direction.x > 0: player.rect.right = sprite.rect.left if player.direction.x > 0 or player.direction.x < 0: player.direction.y = 0.5 player.jumping = False else: player.jumping = True def colision_y(self): player = self.player.sprite player.move_y() for sprite in self.tiles.sprites(): if sprite.rect.colliderect(player.rect): if player.direction.y > 0: player.rect.bottom = sprite.rect.top player.jumping = False player.direction.y = 0 elif player.direction.y < 0: player.rect.top = sprite.rect.bottom player.direction.y = 0.5 def wall_grip(self): player = self.player.sprite player.move_x() for sprite in self.tiles.sprites(): if sprite.rect.colliderect(player.rect): if player.direction.x < 0 or player.direction.x > 0: player.direction.y = 0.5 def run(self): # level tiles self.tiles.update(self.world_shift) self.tiles.draw(self.display_surface) self.scream_scroll() self.colision_itens() # player self.player.update() self.colision_x() self.colision_y() # self.wall_grip() self.player.draw(self.display_surface)any help is welcome