Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyGame] i need help pls
#1
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
Reply
#2
The code has errors. Could you post a working example please?
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#3
The problem is in the sequence.

1. Update everything
2. collision x - stops player from colliding with anything in X direction
3. collision y - stops player from colliding with anything in Y direction
4. Check for collisions between player and tiles. Guaranteed there are no collisions.

I also find it odd you put the treasure in the same group as the other tiles (walls and floors). How are you supposed to know that a collision is with treasure? This does not only check for Mesa objects.
for Mesa in self.tiles.sprites():
The Mesa name is meaningles in this conext. It is just a variable and works the same if it is "a" instead of Mesa. The loop looks at all sprites. in the tiles group, not just sprites that are Mesa objects..
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020