2017-01-03 6 views
1

Für mein Computerprojekt muss ich eine Art App oder Spiel machen. Ich entschied, dass ich Weltraum-Eindringlinge machen würde. Ich habe es geschafft, die Grundlagen zum Laufen zu bringen, die Sprites würden spawnen, ich könnte den Spieler bewegen, die Feinde fielen von der Oberseite des Bildschirms und der Hintergrund und die Musik funktionierten einwandfrei, aber die Kollision funktioniert nicht richtig. Wenn sich die Ecken berühren oder der Mittelpunkt zwischen zwei Ecken sich berührt, klappt es gut, das Programm schließt sich. Aber wenn die Ecken/Mittelpunkte sich nicht berühren, gehen die Sprites durcheinander. Jede Hilfe würde sehr geschätzt werden. Hier ist der Code:Pygame Collision funktioniert nicht

import pygame 
import random 
import sys 
# --- constants --- (UPPER_CASE names) 

WHITE = (255, 255, 255) 
BLACK = ( 0, 0, 0) 
RED = (255, 0, 0) 
GREEN = ( 0, 255, 0) 
BLUE = ( 0, 0, 255) 
ORANGE = (255, 255, 0) 
YELLOW = ( 0, 255, 255) 

DISPLAY_WIDTH = 720 
DISPLAY_HEIGHT = 720 

FPS = 60 

# --- classes --- (CamelCase names) 

class Player(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load("images\\user1.gif").convert() 
     self.image = pygame.transform.scale(self.image, (50, 50)) 
     self.rect = self.image.get_rect() 
     self.speed_x = 0 

    def update(self): 
     self.speed_x = 0 
     keystate = pygame.key.get_pressed() 
     if keystate[pygame.K_LEFT]: 
      self.speed_x = -7 
     if keystate[pygame.K_RIGHT]: 
      self.speed_x = 7 
     self.rect.x += self.speed_x 
     if self.rect.right > DISPLAY_WIDTH: 
      self.rect.right = DISPLAY_WIDTH 
     if self.rect.left < 0: 
      self.rect.left = 0 


class Mob(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load("images\\enemy1.gif").convert() 
     self.image = pygame.transform.scale(self.image, (50, 50)) 
     self.rect = self.image.get_rect() 
     self.speed_x = 0 
     self.rect.x = random.randrange(0, DISPLAY_WIDTH - self.rect.width) 
     self.rect.y = random.randrange(-100, -40) 
     self.speedy = random.randrange(3, 11) 

    def update(self): 
      self.rect.y +=self.speedy 
      if self.rect.top > DISPLAY_HEIGHT + 10: 
       self.rect.x = random.randrange(0, DISPLAY_WIDTH - self.rect.width) 
       self.rect.y = random.randrange(-100, -40) 
       self.speedy = random.randrange(3, 11) 

# --- functions --- (lower_case names) 

# empty 

# --- main --- (lower_case names) 

# - init - 

pygame.init() 
pygame.mixer.init() 

display = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT)) 
display_rect = display.get_rect() 

# - objects - 

all_sprites = pygame.sprite.Group() 
mobs = pygame.sprite.Group() 

player = Player() 
player.rect.center = ((DISPLAY_WIDTH/2), DISPLAY_HEIGHT/1.2) 

all_sprites.add(player) 
for z in range(8): 
    mob = Mob() 
    mobs.add(mob) 
    all_sprites.add(mob) 
background = pygame.image.load("images\\background.jpg") 
background = pygame.transform.scale(background, (DISPLAY_WIDTH, DISPLAY_HEIGHT)) 

# - other - 

pygame.mixer.music.load("audio\\soundtrack.mp3") 
pygame.mixer.music.play(-1) 
pygame.mixer.music.set_volume(0.4) 

# - mainloop - 

crashed = False 
clock = pygame.time.Clock() 

while not crashed: 

    # - events - 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      crashed = True 

     print(event) 


# - checks for a hit - 
    col = pygame.sprite.collide_rect(mob, player) 
    if col: 
      sys.exit() 
# - updates (without draws) - 

    all_sprites.update() 

# - draws (without updates) - 

    display.blit(background, (0, 0)) 

    all_sprites.draw(display) 

    pygame.display.update() 

# - FPS - 

    clock.tick(FPS) 

# - end - 
pygame.quit() 

Jede Hilfe wäre toll, danke.

Antwort

1

Die Funktion pygame.sprite.collide_rect ist nicht für den direkten Gebrauch bestimmt. Es ist beabsichtigt, in die 'main' kollidieren Funktionen

  1. pygame.sprite.spritecollide()
  2. pygame.sprite.groupcollide()
  3. pygame.sprite.spritecollideany()

In Ihrem Fall weitergegeben werden möchten Sie pygame.sprite.spritecollideany:

col = pygame.sprite.spritecollideany(player, mobs) 
if col: 
    sys.exit() 

Diese Funktion wird Eins zurückgeben in mobs, die mit player kollidierte.