Ectrizz
Ectrizz

Reputation: 139

Collision is not working Bullet vs Mob

I've tried numerous things to let my bullets collide with my mob, but it doesn't work. The bullet just goes straight through the mob. I also tried spritecollide and groupcollide codes, but they all failed. Maybe i'm putting my code in the wrong line or the wrong place. I also want the bullet and mob to be removed from the list.

import pygame
import random
import math
GRAD = math.pi / 180

black = (0,0,0)

Bulleti = pygame.image.load('bullet.png')
Monster = pygame.image.load('Monster1re.png')

class Config(object):
    fullscreen = True
    width = 1366
    height = 768
    fps = 60

class Player(pygame.sprite.Sprite):
    maxrotate = 180
    down = (pygame.K_DOWN)
    up = (pygame.K_UP)

    def __init__(self, startpos=(102,579), angle=0):
        super().__init__()
        self.pos = list(startpos)
        self.image = pygame.image.load('BigShagHoofdzzz.gif')
        self.orig_image = self.image
        self.rect = self.image.get_rect(center=startpos)
        self.angle = angle

    def update(self, seconds):
        pressedkeys = pygame.key.get_pressed()
        if pressedkeys[self.down]:
            self.angle -= 2
            self.rotate_image()
        if pressedkeys[self.up]:
            self.angle += 2
            self.rotate_image()

    def rotate_image(self):
        self.image = pygame.transform.rotate(self.orig_image, self.angle)
        self.rect = self.image.get_rect(center=self.rect.center)

class Mob(pygame.sprite.Sprite):
    def __init__(self, image):
        super().__init__()
        self.image = image
        self.rect = self.image.get_rect()
        self.rect.x = 1400
        self.rect.y = random.randrange(500,600)
        self.speedy = random.randrange(-8, -1)

    def update(self):
        self.rect.x += self.speedy
        if self.rect.x < -100 :
            self.rect.x = 1400
            self.speedy = random.randrange(-8, -1)

class Bullet(pygame.sprite.Sprite): 
    """This class represents the bullet."""
    def __init__(self, pos, angle, image):
        super().__init__()

        self.image = image
        self.image = pygame.transform.rotate(self.image, angle)
        self.rect = self.image.get_rect()
        speed = 15

        self.velocity_x = math.cos(math.radians(-angle)) * speed
        self.velocity_y = math.sin(math.radians(-angle)) * speed

        self.pos = list(pos)

    def update(self):
        """ Move the bullet. """
        self.pos[0] += self.velocity_x
        self.pos[1] += self.velocity_y

        self.rect.center = self.pos




player = Player()

#this is the mob group
mobs = []
for x in range(0,10):
    mob = Mob(Monster)
    mobs.append(mob)

print(mobs)

#sprite lists
bullet_list = pygame.sprite.Group()

all_sprites_list = pygame.sprite.Group()
allgroup = pygame.sprite.LayeredUpdates()
allgroup.add(player)

for mob in mobs:
    all_sprites_list.add(mob)








def main():
    #game 
    pygame.mixer.pre_init(44100, -16, 1, 512)
    pygame.mixer.init()
    pygame.init()
    screen=pygame.display.set_mode((Config.width, Config.height),         
  pygame.FULLSCREEN)
    background = pygame.image.load('BGGameBig.png')
    sound = pygame.mixer.Sound("shoot2.wav")

    clock = pygame.time.Clock()
    FPS = Config.fps


    mainloop = True
    while mainloop:
        millisecond = clock.tick(Config.fps)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
            mainloop = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    mainloop = False
                if event.key == pygame.K_SPACE: #Bullet schiet knop op space
                    # Pass the position and angle of the player.
                    bullet = Bullet(player.rect.center, player.angle, 
Bulleti)
                    all_sprites_list.add(bullet)
                    bullet_list.add(bullet)
                    sound.play()
                if event.key == pygame.K_ESCAPE:
                    mailoop = False 


        pygame.display.set_caption("hi")
        allgroup.update(millisecond)
        all_sprites_list.update()
        for bullet in bullet_list:
            if bullet.rect.x > 1380:
                bullet_list.remove(bullet)
                all_sprites_list.remove(bullet)
 #this is the code for collission
        hits = pygame.sprite.groupcollide(bullet_list, mobs, True, True)


        screen.blit(background, (0,0))
        allgroup.draw(screen)
        all_sprites_list.draw(screen)
        pygame.display.flip()


if __name__ == '__main__':
    main()
    pygame.quit()

if anyone could help me out on this one it would really be appreciated. I spent alot of time working on the solution but I haven't found any yet. Watched alot of youtubers and did the same thing but it just won't work.

Upvotes: 1

Views: 102

Answers (1)

skrx
skrx

Reputation: 20478

I get a different error when I run the program, an AttributeError caused by this line hits = pygame.sprite.groupcollide(bullet_list, mobs, True, True). That happens because the mobs list should be a pygame.sprite.Group.

mobs = pygame.sprite.Group()
for x in range(0,10):
    mob = Mob(Monster)
    mobs.add(mob)

After I changed this part of the code, it worked correctly.

Upvotes: 2

Related Questions