2017-01-03 5 views
1

저는 컴퓨팅 프로젝트를 위해 일종의 앱이나 게임을 만들어야합니다. 나는 우주 침략자를 만들겠다고 결심했다. 나는 기본 작업을 할 수 있었고, 스프라이트는 플레이어를 움직일 수 있고, 적들은 화면 상단에서 떨어지며 배경과 음악은 제대로 작동했지만 충돌은 제대로 작동하지 않습니다. 모서리가 접촉하거나 두 모서리 사이의 중간 점이 접촉하면 잘 동작하며 프로그램이 닫힙니다. 그러나 모서리/중간 점이 접촉하지 않으면 스프라이트가 서로 오른쪽을 통과합니다. 어떤 도움이라도 대단히 감사 할 것입니다. 다음은 코드입니다.파이 게임 충돌이 작동하지 않습니다.

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() 

어떤 도움을 주셔서 감사합니다.

답변

1

기능 pygame.sprite.collide_rect은 직접 사용할 수 없습니다.

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

이 작동합니다 : '주'충돌 기능

  1. 귀하의 경우에는
  2. pygame.sprite.spritecollideany()

pygame.sprite.spritecollide()

  • pygame.sprite.groupcollide()
  • 당신이 pygame.sprite.spritecollideany 원하는에 전달 될 의도에서 1을 반환하십시오. 0은 player과 충돌했습니다.

    관련 문제