2017-05-21 13 views
1

私のコードに問題があります。だから、私はバナナが空から落ちる、そして猿がそれらをつかわなければならない、パイゲームでゲームを作りたいと思っています。私はそれらの2つの間に衝突を作り出すのにかなりの困難を抱えています(既に過ごした時間)。パイゲームの衝突を作成する

だから、これは私のコードです:

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

Er ...連合? **衝突**を意味しますか? –

+0

さて、間違って私の間違い –

+0

あなたは既に[スプライトグループ](http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Group)に精通していますか?何を試しましたか? – skrx

答えて

0

すべてのスプライトを含み、2行のコードで更新して描画するためのall_spritesという2つのスプライトグループと、macacoとバナナの衝突をチェックするためのbananasグループを作成しました。そして、衝突したスプライトを得るにはpygame.sprite.spritecollide関数が必要です。スプライトインスタンスとスプライトグループを渡す必要があります。スプライトがグループ内のスプライトと衝突した場合にチェックします。衝突したバナナをリストとして返します。リストでは、繰り返し実行したり、ポイントカウンタを増やしたりすることができます。あなたは(Pythonの2 super(Macaco, self).__init__()super機能super().__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

ありがとうございました!それが私が見逃していたものです...あなたは私をたくさん助けました! –