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

TypeError:参数必须是pygame中的rect样式对象

姬歌者
2023-03-14

一段时间以来,我一直在努力教自己如何在pygame中使用精灵,而现在我被困在碰撞检测上。

我在代码中遇到问题的具体位置是标记为“error here”的注释部分,这段代码一直给我“TypeError:Argument必须是rect-style-object”错误,该特定代码的目标是检测冲突。

这段代码的目标是每当玩家块进入非玩家块时在shell中打印一条消息,正如我之前所说的,我很难做到这一点。

from pygame.locals import *
import pygame

pygame.init()

SIZE = WIDTH, HEIGHT = 500, 700
screen = pygame.display.set_mode(SIZE)

plr_g = pygame.sprite.Group()
h_box = pygame.sprite.Group()

BLUE = (0, 206, 209)
GREEN = (0, 255, 0)

class Player(pygame.sprite.Sprite):
    def __init__(self, width, height):
        pygame.sprite.Sprite.__init__(self, plr_g)

        self.image = pygame.Surface([width, height])
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()


        self.rect.center = (WIDTH / 2, HEIGHT / 2)
        #self.rect = (400, 200)


    def x_pos(self):
        self.rect.x
    def y_pos(self):
        self.rect.y
    def move_l(self, pixels):
        self.rect.x -= pixels
    def move_r(self, pixels):
        self.rect.x += pixels
    def move_u(self, pixels):
        self.rect.y -= pixels
    def move_d(self, pixels):
        self.rect.y += pixels


class Hitbox(pygame.sprite.Sprite):
    def __init__(self, bx, by):
        pygame.sprite.Sprite.__init__(self, h_box)

        self.image = pygame.Surface([100, 100])
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()

        self.rect = (bx, by)


hitbox = Hitbox(300, 300)
hitbox = Hitbox(100, 500)
player = Player(50, 50)


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

        elif event.type==pygame.KEYDOWN:
            if event.key==pygame.K_LEFT:
                player.move_l(10)
            if event.key==pygame.K_RIGHT:
                player.move_r(10)
            if event.key==pygame.K_UP:
                player.move_u(10)
            if event.key==pygame.K_DOWN:
                player.move_d(10)


    #error here
    if plr_g.colliderect(h_box):
        print("collide")
    #----------------

    plr_g.update()
    h_box.update()




    screen.fill((50, 50, 50))
    h_box.draw(screen)
    plr_g.draw(screen)
    pygame.display.flip()

共有2个答案

干京
2023-03-14
block_hit_list = plr_g.colliderect(h_box)
for block in block_hit_list:
    print ("collide")

我基本上是在列表中循环查看plr_g中的精灵和hitbox中的精灵之间是否存在任何冲突。

巫马越彬
2023-03-14

h_box是一个精灵组,不是精灵,也绝对不是正方形。必须在单个精灵上调用精灵的collide_rect函数。一个可能的解决方案类似于以下内容,遍历h_box中的所有精灵:

if any([plr_g.colliderect(sp) for sp in h_box]):
    print("collide")
 类似资料:
  • 免责声明:我知道这个网站上的其他人也有这个错误,但它是在不同的环境中出现的,而且修复似乎在这里不起作用。 嘿stackoverflow,基本上我一直在做一个横向空间入侵者游戏,你的船跟随你鼠标的Y位置,但留在左边,点击发射一颗子弹。敌人从右边随机产卵,然后飞向左边,一旦物体进入屏幕一侧,它们就会被移除。这一切都很好,但是当我试图实施冲突检测来查看射击何时击中敌人时,我得到了错误: 它指向行返回hi

  • 当我试图运行我的程序我结束了以下错误 错误发生在代码的第134行。这里是使用的代码,详细的答案将不胜感激,因为我是pygame的新手

  • 这是我的代码的一部分,工作不正常,我试图设置键,使桨向上和向下移动,但我无法找出我的代码有什么问题。 错误是: 参数必须是rect样式对象

  • 我创建这个类是为了更好地使用它 然后我想创建一个简单的函数来剪辑一个矩形,就像这样 但是当我将rect传递到我的函数中时,我在标题中得到了错误。我甚至还打印了字体 我想知道Rect样式的对象和Rect对象之间是否有区别,因为我太困惑了。此外,在屏幕上绘制矩形是布局tic-tac-toe GUI的最佳方式,还是绘制线条更简单。

  • 我目前正在制作一个平台游戏,我被阻止碰撞...你能帮帮我吗?我实际上添加了一些方块来测试碰撞,在Perso类下创建了一个玩家。我真的需要在那个入口之后制造碰撞,并且必须精心设计重力来让玩家跳跃。这是我的代码:导入pyplay从pygame.locals导入*pygame.init() pygame.quit()

  • 我正在用一个简单的游戏尝试python,但是遇到了这个错误 代码如下所示: 然后错误显示: 文件“my_code/alien_invision/bullet.py”,第15行,在init self中。rect=pygame。Rect(左=0,上=0,宽=self.settings.bullet\u width, 类型错误:参数必须是Rect样式的对象 如果我按以下方式更改该行,它将正常工作: 我不