2017-05-21 4 views
1

내 코드에 문제가 있습니다. 그래서 파이 게임에서 바나나가 하늘에서 떨어지는 게임을 만들고 원숭이가 그들을 잡아야합니다. 나는 그 두 시간 (이미 노력한 시간을 보냈다) 사이에 충돌을 만드는 데 어려움을 겪고있다.파이 게임에서 충돌 만들기

그래서,이 내 코드는 다음과 같습니다

import pygame, sys, random, time, os 
from pygame.locals import * 

#Variáveis necessárias 
banana_speed = 5 
monkey_speed = 20 
WIDTH = 800 
HEIGHT = 800 
pontos = 0 
vidas = 3 

#Nome do jogo 
pygame.display.set_caption("Catch the fruit") 

#Tamanho do ecrã do jogo 
screen = pygame.display.set_mode((WIDTH, HEIGHT)) 

class Macaco(pygame.sprite.Sprite): 
    def __init__(self): 
     self.image = pygame.image.load('monkey.png') 
     self.rect = self.image 
     self.x = 300 
     self.y = 640 
    def keyboard(self): 
     key = pygame.key.get_pressed() 
     if key[pygame.K_RIGHT]: 
      self.x += monkey_speed 
     elif key[pygame.K_LEFT]: 
      self.x -= monkey_speed 
    def draw (self, screen): 
     screen.blit(self.rect, (self.x, self.y)) 

class Background(pygame.sprite.Sprite): 
    def __init__(self, image_file, location): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load(image_file) 
     self.rect = self.image.get_rect() 
     self.rect.left, self.rect.top = location 

class Banana(pygame.sprite.Sprite): 
    def __init__(self): 
     self.image = pygame.image.load('banana.png') 
     self.rect = self.image 
     self.x = random.randrange(0,WIDTH) 
     self.y = -50 
    def draw(self, screen): 
     self.y = self.y + banana_speed 
     screen.blit(self.rect,(self.x, self.y)) 

#Funções necessárias para o Loop 
macaco = Macaco() 
banana = Banana() 
Background = Background('background.png', [0,0]) 

os.environ["SDL_VIDEO_CENTERED"] = "1" 
pygame.init() 

while vidas > 0: 
    for event in pygame.event.get(): 
     if event.type == KEYDOWN: 
      if event.key == K_ESCAPE: 
       running = False 
     elif event.type == QUIT: 
      running = False 

    screen.blit(Background.image, Background.rect) 
    pressed_keys = pygame.key.get_pressed() 
    macaco.keyboard() 
    macaco.draw(screen) 
    banana.draw(screen) 
    pygame.display.update() 

편집 : 그래서 내가 다른 해결책을 시도하고 이것이 않았다

import pygame, sys, random, time, os 
from pygame.locals import * 

#Variáveis necessárias 
banana_speed = 5 
monkey_speed = 20 
WIDTH = 800 
HEIGHT = 800 
pontos = 0 
vidas = 3 
green = (0, 0 , 255) 

#Nome do jogo 
pygame.display.set_caption("Catch the fruit") 

#Tamanho do ecrã do jogo 
screen = pygame.display.set_mode((WIDTH, HEIGHT)) 

class Macaco(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.rect = pygame.image.load('monkey.png') 
     self.image = pygame.Surface([WIDTH, HEIGHT]) 
     self.x = 300 
     self.y = 640 
     self.image.fill(green) 
    def keyboard(self): 
     key = pygame.key.get_pressed() 
     if key[pygame.K_RIGHT]: 
      self.x += monkey_speed 
     elif key[pygame.K_LEFT]: 
      self.x -= monkey_speed 
    def draw (self, screen): 
     screen.blit(self.rect, (self.x, self.y)) 

class Background(pygame.sprite.Sprite): 
    def __init__(self, image_file, location): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load(image_file) 
     self.rect = self.image.get_rect() 
     self.rect.left, self.rect.top = location 

class Banana(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.rect = pygame.image.load('banana.png') 
     self.image = pygame.Surface([WIDTH, HEIGHT]) 
     self.x = random.randrange(0, WIDTH) 
     self.y = -50 
    def draw(self, screen): 
     self.y = self.y + banana_speed 
     screen.blit(self.rect,(self.x, self.y)) 


#Funções necessárias para o Loop 
macaco = Macaco() 
banana = Banana() 
Background = Background('background.png', [0,0]) 

os.environ["SDL_VIDEO_CENTERED"] = "1" 
pygame.init() 

while vidas > 0: 
    for event in pygame.event.get(): 
     if event.type == KEYDOWN: 
      if event.key == K_ESCAPE: 
       running = False 
     elif event.type == QUIT: 
      running = False 
    screen.blit(Background.image, Background.rect) 
    pressed_keys = pygame.key.get_pressed() 
    macaco.keyboard() 
    macaco.draw(screen) 
    banana.draw(screen) 
    blocks_hit_list = pygame.sprite.spritecollide(macaco, banana, True) 
    for blocks in blocks_hit_list: 
     pontos +=1 
    pygame.display.update() 

당신이 나에게 도움을 주시기 바랍니다 줄 수 있을까요?

+0

어 ... 연합? ** 충돌 **을 의미합니까? –

+0

네, 저의 실수는 미안합니다 –

+0

[스프라이트 그룹] (http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Group)에 익숙합니까? 너는 무엇을 시도 했는가? – skrx

답변

0

두 스프라이트 그룹을 만들었습니다 : all_sprites 모든 스프라이트가 포함되어 있으며 두 줄의 코드로 업데이트하고 그려야합니다. 그룹은 마카코와 바나나 사이의 충돌을 확인하는 데 사용됩니다. 그런 다음 충돌 한 스프라이트를 얻으려면 pygame.sprite.spritecollide 함수가 필요합니다. 스프라이트 인스턴스와 스프라이트 그룹을 전달해야하며 스프라이트가 그룹의 스프라이트와 충돌 한 경우 사용자를 확인합니다. 충돌 한 바나나를 목록으로 반환합니다.이 목록을 통해 반복적으로 수행 할 수 있으며, 예를 들어 포인트 카운터를 증가시킬 수 있습니다.

이 있습니다 (super 기능 super().__init__()와 (파이썬 2 super(Macaco, self).__init__()).

이를 업데이트하려면 그렇게 스프라이트 그룹과 올바르게 사용할 수 있도록하여 스프라이트에 부모 클래스의 __init__ 메소드를 호출해야 당신의 스프라이트의 위치는, 새로운 X, Y 좌표로 자신의 topleft (또는 center) 속성을 설정합니다.

을 이미지 통화에서 RECT를 얻으려면 self.rect = self.image.get_rect().

import sys 
import random 
import pygame 


pygame.init() 
screen = pygame.display.set_mode((800, 800)) 


class Macaco(pygame.sprite.Sprite): 

    def __init__(self): 
     super().__init__() 
     self.image = pygame.Surface((30, 30)) 
     self.image.fill((190, 140, 20)) 
     self.rect = self.image.get_rect() 
     self.x = 300 
     self.y = 640 
     self.speed = 20 

    def keyboard(self, keys): 
     if keys[pygame.K_RIGHT]: 
      self.x += self.speed 
     elif keys[pygame.K_LEFT]: 
      self.x -= self.speed 

    def update(self): 
     self.rect.topleft = self.x, self.y 


class Banana(pygame.sprite.Sprite): 

    def __init__(self): 
     super().__init__() 
     self.image = pygame.Surface((30, 30)) 
     self.image.fill((230, 230, 40)) 
     self.rect = self.image.get_rect() 
     self.x = random.randrange(0, 770) 
     self.y = -50 
     self.speed = 5 

    def update(self): 
     self.y += self.speed 
     self.rect.topleft = self.x, self.y 


macaco = Macaco() 
banana = Banana() 

all_sprites = pygame.sprite.Group(macaco, banana) 
bananas = pygame.sprite.Group(banana) 

clock = pygame.time.Clock() 
running = True 

while running: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       running = False 

    keys = pygame.key.get_pressed() 
    macaco.keyboard(keys) 
    all_sprites.update() 
    # Collision detection. Check if macaco collided with bananas group, 
    # return collided bananas as a list. dokill argument is True, so 
    # that collided bananas will be deleted. 
    collided_bananas = pygame.sprite.spritecollide(macaco, bananas, True) 
    for collided_banana in collided_bananas: 
     print('Collision.') 

    screen.fill((70, 40, 70)) 
    all_sprites.draw(screen) 

    pygame.display.update() 
    clock.tick(30) 

pygame.quit() 
sys.exit() 
+0

고마워요! 그때 내가 놓친 게 ... 너는 나를 많이 도왔다! –

관련 문제