我正在玩pygame游戏,我希望有一个受重力影响的玩家。
我需要一个可以这样做的代码 -
如果玩家没有与块碰撞: player.y = player.y + 1
所以当它下面有一个街区时,不要摔倒......否则会摔倒。
这是整个代码:
import pygame,random
from pygame.locals import *
import itertools
pygame.init()
screen=pygame.display.set_mode((640,480))
class Block(object):
sprite = pygame.image.load("texture\\dirt.png").convert_alpha()
def __init__(self, x, y):
self.rect = self.sprite.get_rect(centery=y, centerx=x)
class Player(object):
sprite = pygame.image.load("texture\\playr.png").convert()
sprite.set_colorkey((0,255,0))
def __init__(self, x, y):
self.rect = self.sprite.get_rect(centery=y, centerx=x)
blocklist = []
player = []
while True:
screen.fill((25,30,90))
mse = pygame.mouse.get_pos()
for event in pygame.event.get():
if event.type == QUIT: exit()
key=pygame.key.get_pressed()
if key[K_LSHIFT]:
if event.type==MOUSEMOTION:
x=(int(mse[0]) / 32)*32
y=(int(mse[1]) / 32)*32
blocklist.append(Block(x+16,y+16))
else:
if event.type == pygame.MOUSEBUTTONUP:
if event.button == 1:
to_remove = [b for b in blocklist if b.rect.collidepoint(mse)]
for b in to_remove:
blocklist.remove(b)
if not to_remove:
x=(int(mse[0]) / 32)*32
y=(int(mse[1]) / 32)*32
blocklist.append(Block(x+16,y+16))
elif event.button == 3:
x=(int(mse[0]) / 32)*32
y=(int(mse[1]) / 32)*32
player=[]
player.append(Player(x+16,y+16))
for b in blocklist:
screen.blit(b.sprite, b.rect)
for p in player:
if p.rect.colliderect(blocklist):
print 'scoof'
screen.blit(p.sprite, p.rect)
pygame.display.update()
感谢任何帮助!
答案 0 :(得分:2)
您的问题是blocklist
不是Rect,它是一个Rects列表。 colliderect
只接受一个Rect,但你给它一个列表。这是一个有效的解决方案:
for p in player:
if any(p.rect.colliderect(block) for block in blocklist):
print 'scoof'
else:
p.rect.top += 1
screen.blit(p.sprite, p.rect)
这将看到blocklist
中的任何块是否与播放器发生冲突。如果是,则会打印“scoof”,否则会将播放器向下移动一个像素。
答案 1 :(得分:1)
colliderect
应该采用矩形参数。在你的代码中,你传递了一个完整的块列表(阻止列表),所以它不知道如何处理它。试试这段代码,让我知道它是否有效。
for b in blocklist:
screen.blit(b.sprite, b.rect)
for p in player:
colliding = False
for b in blocklist:
if p.rect.colliderect(b.rect):
colliding = True
if not colliding:
p.rect.top += 1
screen.blit(p.sprite, p.rect)
pygame.display.update()