当前位置: 首页 > 知识库问答 >
问题:

Pygame碰撞检测:AttributeError

阎兴为
2023-03-14

我已经有一段时间了。我正在尝试用PyGame制作一个游戏,我到达了碰撞段,已经被卡住了一段时间,并且检查了一些线程。

这是我的代码(删除了中间的其他方法和条件语句,但保留了相关部分)。我对这个错误有点困惑,因为我在两个类init中都self.imageRect=self.image.get_rect(),但是我有这个错误。当程序试图在dog类中执行冲突检测部分时,该错误具体为:
"属性错误:'Pebble'对象没有属性'rect'"。我做错了什么?

import random
import pygame, sys

pygame.init()
clock = pygame.time.Clock() # fps clock

screenSize = WIDTH, HEIGHT = [800, 600]
screen = pygame.display.set_mode(screenSize)

background = pygame.Surface(screen.get_size())
bgColorRGB = [153, 204, 255]
background.fill(bgColorRGB)


pebbleGroup = pygame.sprite.Group()
pebbleSingle = pygame.sprite.GroupSingle() 
dogSingle = pygame.sprite.GroupSingle()


#----------------------------------------------------------------------
class Dog(pygame.sprite.Sprite):
    def __init__(self, path, speed):
        pygame.sprite.Sprite.__init__(self) #call Sprite initializer
        self.image = pygame.image.load(path) # load sprite from path/file loc.
        self.imageRect = self.image.get_rect() # get bounds of image
        self.imageWidth = self.image.get_width()
        self.imageHeight = self.image.get_height()
        self.speed = speed

    # sets location of the image, gets the start location of object
    # sets the start location as the image's left and top location
    def setLocation(self, location):
        self.imageRect.left, self.imageRect.top = location


    def checkCollision(self, pebble, dogGroup):
        if pygame.sprite.spritecollide(pebble, dogGroup, False):
                print "collided"

#---------------------------------------------------------------------
class Pebble(pygame.sprite.Sprite):
    def __init__(self, path, speed, location):
        pygame.sprite.Sprite.__init__(self) 
        self.image = pygame.image.load(path) 
        self.imageRect = self.image.get_rect()
        self.imageWidth = self.image.get_width()
        self.imageHeight = self.image.get_height()
        self.imageRect.left, self.imageRect.top = location
        self.speed = speed # initialize speed
        self.isDragged = False


#----------------------------------------------------------------------
def startGame():

    pebblePaths = ['images/pebble/pebble1.jpg', 'images/pebble/pebble2.jpg']
    for i in range(3):
        pebblePath = pebblePaths[random.randrange(0, len(pebblePaths))]
        pebbleSpeed = [random.randrange(1, 7), 0]
        pebbleLocation = [0, random.randrange(20, HEIGHT - 75)]
        pebble = Pebble(pebblePath, pebbleSpeed, pebbleLocation)
        pebbleGroup.add(pebble)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


        for pebble in pebbleGroup:
            dog.checkCollision(pebble, dogSingle)

        pygame.display.flip()
        clock.tick(30) # wait a little before starting again
startGame()

共有1个答案

支劲
2023-03-14

它期待Sprite.rect,所以从

self.imageRect = self.image.get_rect()
#to
self.rect = self.image.get_rect()

笔记

self.imageWidth = self.image.get_width()
self.imageHeight = self.image.get_height()
self.imageRect.left, self.imageRect.top = location

这些不是必需的,因为rect有许多属性,如self.rect.widthself.rect.topleft=位置。另一个有用的是centerx

完整列表:pygameRect文档

 类似资料:
  • 所以我试图用Python和Pyplay创建一个益智平台游戏,但是我遇到了一点麻烦。当我为主要角色使用单点图像,而不是矩形图像时,如何制作碰撞检测器?我知道直角图像有左、右、顶部和底部像素功能(这对冲突检测非常有用),但是对于单片图像有这样的功能吗?或者我只需要为x和y坐标创建一个变量图像的宽度/高度?我试过用那个 但是catImg一直在通过窗户的尽头。我做错了什么?提前谢谢。

  • 在开始学习相关知识点之前,我们有必要先学习精灵和碰撞检测的含义。 精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具、人物、场景装饰等,它们都可以看做成一张张小的“精灵”图。除此之外,人物的移动也可以看做是一系列小精灵图构成的序列(按帧组成的序列),如下图所示: 图1:动作逐帧分解图 如果将逐帧分解后的动作,按照一定的频率播放,那么就形成了

  • 我正在编写我的第一个Pyplay游戏。我试图进行冲突检测,但有时会奏效- 我尝试使用实际上我使用 这是我的碰撞代码: 我除了当我触摸尖峰,启动功能,但只是有时工作。

  • 我对Python非常陌生,最近我一直致力于在pyplay中创建一个小型的太空入侵者风格的游戏。然而,我几乎已经到达了终点,我想让它这样,如果敌人的船(块)与我的船(玩家)相撞,碰撞被检测到,移除我的两艘船并显示一个简短的“游戏结束”信息。 到目前为止,我有探测子弹和敌舰碰撞的代码,我重写了这个代码,如果我的船和敌舰碰撞,但是这个代码只有在我不开枪的情况下才有效,我也必须从一边移动到另一边为了检测到

  • 我画了一个旋转的矩形,我需要检查它是否碰撞。整个班级: 这是碰撞函数: 这就是我得到的: 我认为这已经足够了,因为它每次都会随着旋转位置的更新来检测碰撞,但是似乎我必须使用分离轴定理,你能帮助我吗?

  • 碰撞检测 现在你知道了如何制造种类繁多的图形对象,但是你能用他们做什么?一个有趣的事情是利用它制作一个简单的 碰撞检测系统 。你可以用一个叫做:hitTestRectangle 的自定义的函数来检测两个矩形精灵是否接触。 hitTestRectangle(spriteOne, spriteTwo) 如果它们重叠, hitTestRectangle 会返回 true。你可以用 hitTestRect