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

2024-06-02 05:43:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在pygame中开发一个游戏,我希望有一个受重力影响的玩家。在

我需要一个像这样的代码-

如果玩家没有与方块相撞: player.y=玩家.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()

感谢任何帮助!在


Tags: inrectselfeventforgetifscreen
2条回答

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

colliderect应采用矩形参数。你不知道你是怎么做的。试试这个代码,让我知道它是否有效。在

编辑:Oops修复了一些潜在的错误。在

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 ^{}.

相关问题 更多 >