2013-07-12 160 views
0

我正在pygame的平臺遊戲中學習引擎。pygame平臺碰撞

我讓它創建塊的多個實例,並且我有一個可以以越來越快的速度下降的播放器對象。我怎麼能做到這一點,以便當玩家擊中該區塊時,它不會經過?這裏是我的代碼:

#imports 
import pygame, sys 
from pygame.locals import * 

#init game 
pygame.init() 
screen = pygame.display.set_mode((640,480)) 
pygame.key.set_repeat(True) 
clock = pygame.time.Clock() 

#classes 
class playerClass: 
    x = 100 
    y = 100 
    boundingBox_x = 32 
    boundingBox_y = 32 
    sprite = pygame.image.load("Image2.png").convert_alpha() 

class Block(object): 

    sprite = None 

    def __init__(self, x, y): 
     if not Block.sprite: 
      Block.sprite = pygame.image.load("Image1.png").convert_alpha() 
     self.rect = Block.sprite.get_rect(top=y, left=x) 

#objects 
playerObject = playerClass() 
blocks = [] 
blocks.append(Block(0, 14*32)) 
blocks.append(Block(1*32, 14*32)) 
blocks.append(Block(2*32, 14*32)) 
blocks.append(Block(3*32, 14*32)) 
blocks.append(Block(4*32, 14*32)) 
blocks.append(Block(5*32, 14*32)) 
blocks.append(Block(6*32, 14*32)) 
blocks.append(Block(7*32, 14*32)) 
blocks.append(Block(8*32, 14*32)) 
blocks.append(Block(9*32, 14*32)) 
blocks.append(Block(10*32, 14*32)) 
blocks.append(Block(11*32, 14*32)) 
blocks.append(Block(12*32, 14*32)) 
blocks.append(Block(13*32, 14*32)) 
blocks.append(Block(14*32, 14*32)) 
blocks.append(Block(15*32, 14*32)) 
blocks.append(Block(16*32, 14*32)) 
blocks.append(Block(17*32, 14*32)) 
blocks.append(Block(18*32, 14*32)) 
blocks.append(Block(19*32, 14*32)) 

blocks.append(Block(0, 13*32)) 
blocks.append(Block(19*32, 13*32)) 
blocks.append(Block(0, 13*32)) 
blocks.append(Block(19*32, 13*32)) 
blocks.append(Block(0, 12*32)) 
blocks.append(Block(19*32, 12*32)) 
blocks.append(Block(0, 11*32)) 
blocks.append(Block(19*32, 11*32)) 
#colors 
white = 255,255,255 

#variables 
up = False 
down = False 
right = False 
left = False 

xspeed = 0 
yspeed = 0 
gspeed = 0.2 
#functions 

#main loop 
quitting = False 
while quitting == False: 
    for event in pygame.event.get(): 

#event processing 
     if event.type == pygame.QUIT: 
      quitting = True 

#game logic 
    yspeed += gspeed 
    playerObject.y += yspeed 
#drawing 
    screen.fill((white)) 

    screen.blit(playerObject.sprite,(playerObject.x,playerObject.y)) 
    for block in blocks: 
     screen.blit(block.sprite, block.rect) 

    pygame.display.flip() 

#ending 
    clock.tick(60) 

另外,我知道我使用了很多代碼來構建關卡。我正在從系統讀取txt文件的級別。謝謝

+1

如果您使用['pygame.sprite'](http://www.pygame.org/docs/ref/sprite.html)模塊,它可以爲您完成大部分的工作。如果你只是使用圖像,並嘗試自己做這一切,還有更多的工作要做。你想要哪個答案? – abarnert

+0

作爲一個方面說明,它看起來像你的代碼有一個不同的嚴重問題:幾乎所有東西都使用類屬性而不是實例屬性。這意味着該類的所有實例將共享相同的值。除了常量或全局行爲標誌之外,您通常不想使用類屬性。 – abarnert

+0

@abarnert:好的。我將如何去解決這個問題? – lando111

回答

2

這樣做的簡單方法是使用pygame.sprite模塊,它專門設計用於這類事情。

該頁面上的示例顯示了大部分您想要執行的操作; pygame自帶的Shooter示例顯示了所有的細節。

但簡要地說:請BlockPlayersprite.Sprite兩個子類,把所有的Block s轉換精靈組,而不是隻是一個列表,並使用spritecollideany(player, block_group),而這一切就是這麼簡單。


如果你想要做手工,這不是更難。你需要保持對玩家的邊界矩形的軌道,你對每個塊做同樣的方式,然後,而不是這樣的:

spritecollideany(player, block_group) 

...你這樣做:

player.rect.collidelist([block.rect for block in blocks]) != -1 

在一般情況下,一切sprite呢,你可以自己做 - 只需要大約兩倍的代碼。當然,你必須弄清楚你需要做的所有事情 - 通過sprite,精靈和團隊的簡單API幾乎告訴你你在大多數遊戲中用他們做的所有事情。