0

我正在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()

任何帮助表示赞赏!

4

2 回答 2

2

你的问题是blocklist不是一个矩形,它是一个矩形列表。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”,否则它会将播放器向下移动一个像素。

于 2013-09-23T16:42:14.813 回答
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()

colliderect.

于 2013-09-23T16:25:15.810 回答