2013-07-12 112 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几乎告诉你你在大多数游戏中用他们做的所有事情。