thenoober
thenoober

Reputation: 77

pygame sprite collision ... how can i cheak for sprite collision?

from numpy import place
import pygame, sys ,random as ran 
start = True
class Player(pygame.sprite.Sprite):
    def __init__(self, pos_x, pos_y):
        super().__init__()
        self.attack_animation = False
        self.sprites_1 = []
        self.sprites_1.append(pygame.image.load('crossHair.png'))
        self.sprites_1.append(pygame.image.load('crossHair_2.png'))
        self.sprites_1.append(pygame.image.load('crossHair_3.png'))
        self.sprites_1.append(pygame.image.load('crossHair_4.png'))
        self.sprites_1.append(pygame.image.load('crossHair_5.png'))
        self.sprites_1.append(pygame.image.load('FIRE.png'))
        self.current_sprite = 0
        self.image = self.sprites_1[self.current_sprite]
        self.image.set_colorkey('white')
        for items in self.sprites_1:
            items.set_colorkey('white')
        self.rect = self.image.get_rect()
        self.rect.topleft = [pos_x,pos_y]
        

    def attack(self):
        self.attack_animation = True
        self.image.set_colorkey('white')

    def update(self,speed):
        self.image.set_colorkey('white')
        if self.attack_animation == True:
            self.current_sprite += speed
            if int(self.current_sprite) >= len(self.sprites_1):
                self.current_sprite = 0
                self.attack_animation = False
                print('shot')
            self.image = self.sprites_1[int(self.current_sprite)]
            # self.image = self.sprites_1[int(self.current_sprite)]
        mouse = pygame.mouse.get_pos()
        self.rect = mouse
class enemy(pygame.sprite.Sprite):
    def __init__(self, pos_x, pos_y):
        super().__init__()
        self.image = pygame.image.load('sp_1.png')
        self.rect = self.image.get_rect()
        self.rect.center = [pos_x, pos_y]
        self.image.set_colorkey((255,255,255))
# General setup
pygame.init()
pygame.mouse.set_visible(0)
clock = pygame.time.Clock()
# Game Screen
screen_width = 400
screen_height = 400
mouse = pygame.mouse.get_pos()
screen = pygame.display.set_mode((screen_width,screen_height))
pygame.display.set_caption("Sprite Animation")

# Creating the sprites and groups


moving_sprites = pygame.sprite.Group()
crosshair = Player(mouse[0],mouse[1])
enemy_x = ran.randint(18,387)
enemy_y = ran.randint(18,387)
print(enemy_x,enemy_y)
enemy_ = enemy(enemy_x,enemy_y)
moving_sprites.add(enemy_,crosshair)
while True:
    # Player.set_pos(*pygame.mouse.get_pos())
    globals()['mouse'] = pygame.mouse.get_pos()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            if pygame.mouse.get_pressed()[0]:
                crosshair.attack()
                enemy.checkCollision(enemy,crosshair,enemy_)
                # enemy.attack()
                # pygame.sprite.spritecollide(Player,enemy,True)
    screen.fill((120,220,150))






    #this is causing the problem
    get_hit = pygame.sprite.spritecollide(Player,enemy,True)
    




# Drawing
    screen.set_colorkey('white')
    moving_sprites.draw(screen)
    moving_sprites.update(0.08)
    pygame.display.flip()
    clock.tick(120)
    

the movement i check for sprite collision it gives me error sayin' : File "c:\Users\pc\VS_PYTHON_PY\pyGame.py", line 82, in get_hit = pygame.sprite.spritecollide(Player,enemy,True) File "C:\python-py\lib\site-packages\pygame\sprite.py", line 1682, in spritecollide default_sprite_collide_func = sprite.rect.colliderect AttributeError: type object 'Player' has no attribute 'rect'

why is that happening can you solve this pls

Upvotes: -1

Views: 280

Answers (1)

Rabbid76
Rabbid76

Reputation: 211277

The arguments of pygame.sprite.spritecollide must be instance objects of Sprite and Group classes. Player and enemy are a classes, however crosshair and enemy_ are objects. Create a Group for the enemies and detect the collisions between the crosshair and the Group of enemies:

crosshair = Player(mouse[0],mouse[1])
enemyGroup = pygame.sprite.Group()
enemy_ = enemy(enemy_x,enemy_y)
enemyGroup.add(enemy_)
while True:
    # [...]

    get_hit = pygame.sprite.spritecollide(crosshair, enemyGroup, True)

See also How do you program collision in classes? and How do I detect collision in pygame?.


Also see Style Guide for Python Code: Class names should normally use the CapWords convention. The name of the class should be Enemy instead of enemy.

Upvotes: 1

Related Questions