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

基本精灵碰撞的属性错误

郜昊苍
2023-03-14

刚开始在pygame中的精灵碰撞。运行此代码时,会弹出一个属性错误,指出“组”对象没有属性 “rect”。我不知道为什么会发生此错误。建议?

from random import randint
import pygame
pygame.init()


white = [255,255,255]
blue = [0,0,255]
red = [255,0,0]

size = (400,400)
screen = pygame.display.set_mode(size)
pygame.display.set_caption('Simple character')

clock = pygame.time.Clock()

class Ball(pygame.sprite.Sprite):

    def __init__(self, xDelta, yDelta, color):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([20,20])
        self.image.fill(white)
        self.image.set_colorkey(white)

        self.xDelta = xDelta
        self.yDelta = yDelta
        self.color = color

        self.rect = self.image.get_rect()

        pygame.draw.circle(self.image, self.color,
                           [(self.rect.x + 10), (self.rect.y + 10)], 10)



    def update(self):
        self.rect.x += self.xDelta
        self.rect.y += self.yDelta

        if self.rect.y <= 0 or self.rect.y >= 380:
            self.yDelta *= -1    
        if self.rect.x >= 380 or self.rect.x <= 0:
            self.xDelta *= -1

allSprites = pygame.sprite.Group()
blues = pygame.sprite.Group()
reds = pygame.sprite.Group()

for i in range(5):
    circle = Ball(randint(1, 10), randint(1, 10), blue)
    circle.rect.x = randint(0,380)
    circle.rect.y = randint(0,380)
    blues.add(circle)
    allSprites.add(circle)

    circle2 = Ball(randint(1, 10), randint(1, 10), red)
    circle2.rect.x = randint(0,380)
    circle2.rect.y = randint(0,380)
    reds.add(circle2)
    allSprites.add(circle2)

play = True

while play:
    clock.tick(20)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            play = False

    allSprites.update()

    collision = pygame.sprite.spritecollide(blues, reds, True)
    for circle in collision:
        circle.xDelta = circle.yDelta = 0

    screen.fill(white)

    allSprites.draw(screen)

    pygame.display.flip()

pygame.quit()

共有1个答案

翟冯浩
2023-03-14

您正在对Group类的两个对象调用spritecollide。该函数接受一个精灵和一个组。

spritecollide(sprite, group, dokill, collided = None) -> Sprite_list

你可以做的是循环遍历所有的蓝调精灵,并用一个蓝色的球来调用斯普利特科利德

for blueball in blues.sprites:
    collision = pygame.sprite.spritecollide(blues, reds, True)
        for circle in collision:
            circle.xDelta = circle.yDelta = 0
 类似资料:
  • 这就是正在发生的事情,游戏不断停止,因为两个圆圈相互碰撞,我正在尝试通过确保ID是正方形ID来防止这种情况,我试图让圆圈碰撞在一起,而忽略碰撞,但它没有这样做,我不知道如何确切地阻止它相互碰撞,只允许它与正方形碰撞。 基本上我想阻止这个圆与另一个圆碰撞,并允许它与正方形碰撞。 任何帮助都会很好谢谢 游戏引擎引擎类 这是我在扩展game.engine.engine包的game类中检查冲突的地方。 游

  • 我在PyGame中创建了两个简单的精灵,其中一个是雨伞,另一个是雨滴。雨滴被添加到一个名为< code>all_sprites的sprite组中。伞精灵有自己的组,名为< code>Umbrella_sprite 雨滴从屏幕顶部“落下”,如果其中一个碰到雨伞/与雨伞碰撞..雨滴应该被删除了。但是除了特定雨滴之外,所有其他雨滴都受此影响。

  • 我已经寻找并找到了单个碰撞的答案,但我正在寻找一种检测多种类型的碰撞的方法。我正在制作一个游戏,其中有3个我想要的碰撞。用户飞机与敌方子弹相撞,用户子弹与敌机相撞(我已经工作过),敌方子弹与用户子弹相撞。我已经设置并更正了所有类别BitMask和contactTestBitMask。这是我的委托方法。

  • 我是IOS开发的新手,目前在didBeginContact方法中遇到一些sprite工具包冲突问题。 如果一个碰撞的物理物体被移走了,我如何摆脱或者停止didBeginContact的运行?例:一颗子弹与两个重叠的敌人相撞。因为子弹击中第一个敌人并被摧毁,所以在第二个敌人上运行的碰撞检查抛出异常,因为子弹不再存在。 我试过检查nil和NSNULL值,但运气不好。我收到的错误代码是“线程1:EXC_

  • 在get_hit=pyGame.sprite的第82行,我检查sprite碰撞的移动时,它会给出错误提示:“:File”c:\Users\pc\VS_PYTHON_PY\pyGame.PY“。”。spritecollide(Player,敌方,True)文件“C:\python py\lib\site packages\pygame\sprite.py”,第1682行,位于spritecrolli

  • 我一直在学习一些pygame教程,并且基于这些教程开发了自己的代码。具体如下: 所以我想出了如何让我的家伙跳跃,但是我已经在天空中放置了一个块并试图这样做: 试图让角色停止跳跃。有没有一个内置的函数来测试这一点,或者有没有一个适合我的方法。顺便说一下,这是行不通的,我似乎也不知道该怎么做。非常感谢任何帮助:)