首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在pygame中如何让精灵发生碰撞?

在pygame中如何让精灵发生碰撞?
EN

Stack Overflow用户
提问于 2019-04-16 03:21:47
回答 1查看 24关注 0票数 0

我正在尝试用pygame为我的基本2D游戏做碰撞。我遇到了一个问题,游戏不能启动,我得到了一个错误。

代码语言:javascript
复制
     playercolidecheck = MyPlayer.collide(v)
     File "C:\Users\marti\Desktop\Python\PyMine\PyMineFile.py", line 53, 
     in collide
     return pygame.sprite.spritecollideany(self, enemies)
     File "C:\Users\marti\AppData\Local\Programs\Python\Python37\lib\site- 
     packages\pygame\sprite.py", line 1586, in spritecollideany
     spritecollide = sprite.rect.colliderect
     AttributeError: 'Player' object has no attribute 'rect'

我试着自定义碰撞,但无济于事。以下是该项目的代码:

代码语言:javascript
复制
import pygame
pygame.mixer.init()
pygame.init()

win = pygame.display.set_mode((800,600))
pygame.display.set_caption("PyMine")

clock = pygame.time.Clock()

#Images
dirtimage = pygame.image.load("dirt.png")
grassimage = pygame.image.load("grass.png")
woodimage = pygame.image.load("wood.png")
playerimage = pygame.image.load("player.png")

pygame.display.set_icon(grassimage)

drawlist = []

class Block:
    def __init__(self,ID,x,y,add,w,h):
        self.ID = ID
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        if add == True:
            drawlist.append(self)

    def main(self):
        if self.ID == 0:
            win.blit(dirtimage, (self.x,self.y))
        if self.ID == 1:
            win.blit(grassimage, (self.x,self.y))
        if self.ID == 2:
            win.blit(woodimage, (self.x,self.y))

class Player:
    def __init__(self,add,x,y,):
        self.x = x
        self.y = y
        if add == True:
            drawlist.append(self)

    def main(self):
        win.blit(playerimage, (self.x,self.y))

    def DONTUSE(self,TargetX,TargetY):
        if TargetX > self.x or TargetX < self.x or TargetY > self.y or TargetY < self.y: return False
        return True

    def collide(self, enemies):
        return pygame.sprite.spritecollideany(self, enemies)

MyBlock1 = Block(0,160,160,True,32,32)
MyBlock2 = Block(1,32,0,True,32,32)
MyBlock3 = Block(2,64,0,True,32,32)
MyPlayer = Player(False,96,0)

run = True
while run:
    keys = pygame.key.get_pressed()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                MyPlayer.x -= 32
            if event.key == pygame.K_RIGHT:
                MyPlayer.x += 32
    win.fill((255,255,255))
    MyPlayer.main()
    for v in drawlist:
        v.main()
        playercolidecheck = MyPlayer.collide(v)
        if playercolidecheck == True:
            MyPlayer.y -= 0.1
            pygame.draw.rect(win,(255,25,25),[MyPlayer.x,MyPlayer.y,16,16])
    MyPlayer.y += 0.1
    pygame.display.update()
    clock.tick(60)
pygame.quit()
quit()

它给了我一个错误,它不会在屏幕上显示任何东西。不过,它会打开一个窗口,给它命名并给出它的图标。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-16 03:37:47

您的Player类没有pygame rect对象,这是spritecollideany函数所必需的。因此,将self传入下面这一行:

return pygame.sprite.spritecollideany(self, enemies)

您正在将您自己的自定义类Player传递给函数,您需要向您的类添加一个rect对象,以便pygame知道它在哪里。

因此,您应该在开始时初始化一个self.rect,并为这些变量使用self.rect.xself.rect.y,而不是为播放器使用self.x self.y。确保在玩家移动时更新此rect。这将以pygame能够理解的格式进行处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55695979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档