1

I have been slowly expanding this program as I learn more about python and pygame and I can't figure out collisions. My ground class is an image that I have used "convert_alpha()" on so I put a pygame mask on it to try and check for collisions between the player and the ground. There are holes in the image so the player could fall if the collision isn't happening. Sorry if it's long but I figured I'd post the whole thing.

The current method I am trying is in the while loop at the bottom.

The error message is this: AttributeError: 'Player' object has no attribute 'sprite'

import pygame
from sys import exit

class Player(pygame.sprite.Sprite):
    def __init__(self,pos,group):
        super().__init__(group)
        self.surface = pygame.image.load('graphics/Player/player_stand.png').convert_alpha()
        self.rect = self.surface.get_rect(center = pos)
        self.mask = pygame.mask.from_surface(self.surface)
        self.direction = pygame.math.Vector2()
        self.speed = 5
        self.player_gravity = 0

    def input(self):
        keys = pygame.key.get_pressed()

        if keys[pygame.K_d]:
            self.direction.x = 1
        elif keys[pygame.K_a]:
            self.direction.x = -1
        else:
            self.direction.x = 0

        if keys[pygame.K_SPACE] and self.rect.bottom >= 400:
            self.player_gravity = -14

        self.player_gravity += 1
        self.rect.y += self.player_gravity
        if self.rect.bottom >= 400: self.rect.bottom = 400

    def update(self):
        self.input()
        self.rect.center += self.direction * self.speed

class Ground(pygame.sprite.Sprite):
    def __init__(self,group):
        super().__init__(group)

        self.image = pygame.image.load('graphics/test2.png').convert_alpha()
        self.surface = pygame.transform.scale(self.image,(4000,600))
        self.rect = self.surface.get_rect(topleft = (0,0))
        self.mask = pygame.mask.from_surface(self.image)

class CameraGroup(pygame.sprite.Group):
    def __init__(self):
        super().__init__()
        self.display_surface = pygame.display.get_surface()

        # camera offset
        self.offset = pygame.math.Vector2()
        self.half_w = self.display_surface.get_size()[0] // 2

    def center_target_camera(self,target):
        self.offset.x = target.rect.centerx - self.half_w

    def custom_draw(self,player):

        self.center_target_camera(player)
        ground_offset = ground.rect.topleft - self.offset
        self.display_surface.blit(ground.surface,ground_offset)

        for sprite in sorted(self.sprites(),key = lambda sprite: sprite.rect.topleft):
            offset_pos = sprite.rect.topleft - self.offset
            self.display_surface.blit(sprite.surface,offset_pos)

pygame.init()
screen = pygame.display.set_mode((1200,600))
clock = pygame.time.Clock()

camera_group = CameraGroup()
player = Player((600,400),camera_group)
ground = Ground(camera_group)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    screen.fill('#2C1029')

    camera_group.update()
    camera_group.custom_draw(player)

    if pygame.sprite.spritecollide(player.sprite,ground,False,pygame.sprite.collide_mask):
        print("it works")

    pygame.display.update()
    clock.tick(60)
ahem11
  • 43
  • 3
  • If `Player` *is* a `Sprite` why are you expecting it to have a `sprite` attribute? – UnholySheep Mar 17 '22 at 23:44
  • Welcome to Stack Overflow. Most of your code is completely irrelevant to the question. See how to create a [mcve], and edit the question. – Peter Wood Mar 17 '22 at 23:49
  • @UnholySheep For the spritecollide it needs to have an attribute 'sprite' so how would I give that class that attribute, Maybe that's the better question. – ahem11 Mar 17 '22 at 23:53

1 Answers1

0

It is not necessary that the first argument of pygame.sprite.spritecollide has a sprite attribute, but it must be a Sprite object. player is a Sprite object because the Player class inherits pygame.sprite.Sprite. Just pass player instead of player.sprite:

if pygame.sprite.spritecollide(player.sprite,ground,False,pygame.sprite.collide_mask):

if pygame.sprite.spritecollide(player, ground, False, pygame.sprite.collide_mask):

See alos How do I detect collision in pygame?.

Rabbid76
  • 202,892
  • 27
  • 131
  • 174