Pygame:测试实体之间冲突的方法

时间:2013-09-23 15:56:40

标签: python pygame

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

感谢任何帮助!

2 个答案:

答案 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()

这是documentation for colliderect.