1

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.

furas
  • 134,197
  • 12
  • 106
  • 148
Ectrizz
  • 139
  • 2
  • 10
  • Side note: Always convert your images with the [`pygame.Surface.convert`](http://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert) or `convert_alpha` (for images with transparency) methods to improve the blit performance, e.g.: `Monster = pygame.image.load('Monster1re.png').convert()`. – skrx Jan 08 '18 at 01:36
  • if you get error message then put full error message (Traceback) in question (as text, not screenshot). There are other useful informations. – furas Jan 08 '18 at 01:43
  • When I try this I get the following errors, I pre-loaded the images to avoid a lagging game. Bulleti = pygame.image.load('bullet.png').convert() pygame.error: cannot convert without pygame.display initialized And when i try the .conver_alpha I get this: line 47, in __init__ self.rect = self.image.get_rect() AttributeError: 'builtin_function_or_method' object has no attribute 'get_rec and line 88, in mob = Mob(Monster) – Ectrizz Jan 08 '18 at 11:20

1 Answers1

2

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.

skrx
  • 19,980
  • 5
  • 34
  • 48
  • When I try this I get the following errors, I pre-loaded the images to avoid a lagging game. Bulleti = pygame.image.load('bullet.png').convert() pygame.error: cannot convert without pygame.display initialized And when i try the .conver_alpha I get this: line 47, in __init__ self.rect = self.image.get_rect() AttributeError: 'builtin_function_or_method' object has no attribute 'get_rec and line 88, in mob = Mob(Monster) – Ectrizz Jan 08 '18 at 11:23
  • The converting to a sprite group worked for me, the above comment it for the convert types. – Ectrizz Jan 08 '18 at 11:23
  • You cannot call the `convert` method before you initialized the display with `pygame.display.set_mode`. And the second error probably happened because you forgot the parentheses behind `.convert_alpha()`. – skrx Jan 08 '18 at 11:58