精灵出现和与旋转物体碰撞的问题; Pygame对象不可迭代

时间:2017-12-04 06:20:55

标签: python object rotation pygame collision

我目前正尝试使用蒙版和collide_rect功能在我的乒乓球和我的球员的球拍之间进行像素完美碰撞。我在pong类中创建了自己的checkCollision函数,用于检查像素完美碰撞。但是,现在,我甚至无法让Sprite工作或出现在屏幕上,因为我的" Pong对象不可迭代。

以下是我的pong类,其中包含重要功能:(如果需要,我会发布其他代码)

class Pong(pygame.sprite.Sprite):

    def __init__(self, screensize):

        pygame.sprite.Sprite.__init__(self)

        self.screensize = screensize

        self.centerx = screensize[0] // 2
        self.centery = screensize[1] // 2
        self.radius = 25
        self.rect = pygame.Rect(self.centerx-self.radius,
                                self.centery-self.radius,
                                self.radius*2, self.radius*2)

        self.pokeimage = pygame.image.load("pokeball.png")
        self.pokeimage = pygame.transform.scale(self.pokeimage, (self.radius, self.radius))

        #Create the mask
        self.mask = pygame.mask.from_surface(self.pokeimage)

    def checkCollision(self, player_paddle, ai_paddle):

        col = pygame.sprite.collide_rect(self, player_paddle)

        return col 

    def collisionFormula(self, player_paddle, ai_paddle):

        if self.checkCollision(self, player_paddle):

    def collision_checks(self, player_paddle, ai_paddle):

        #if the ball hits the top or bottom of the screen, change the y direction
        if self.rect.top <= 0 or self.rect.bottom >= self.screensize[1] - 1:
            self.direction[1] *= -1

        #if the pong hits the paddles, change how the pong ball moves 
        if self.rect.colliderect(player_paddle.rect) or self.rect.colliderect(ai_paddle.rect):
            self.collisionFormula(player_paddle, ai_paddle)

    def update(self, player_paddle, ai_paddle):

        self.update_ball_position()
        self.reset_ball()
        self.collision_checks(player_paddle, ai_paddle)

在我的PlayerPaddle类中,我执行相同的掩码初始化。

class PlayerPaddle(pygame.sprite.Sprite):
    def __init__(self, screensize):

        pygame.sprite.Sprite.__init__(self)
        self.screensize = screensize

        self.centerx = 50
        self.centery = screensize[1]//2

        self.height = 100
        self.width = 20
        self.imageMaster = pygame.image.load("naruto.png").convert_alpha()
        self.imageMaster = pygame.transform.scale(self.imageMaster, (self.width, self.height))
        self.image = self.imageMaster

        #mask
        self.mask = pygame.mask.from_surface(self.image)


    def turnLeft(self):
        self.dir += 45
        if self.dir > 360:
            self.dir = 45

    def turnRight(self):
        self.dir -= 45
        if self.dir < 0:
            self.dir = 315
    def update(self):
        #Rotate functions
        oldCenter = self.rect.center
        self.image = pygame.transform.rotate(self.imageMaster, self.dir)
        self.rect = self.image.get_rect()
        self.rect.center = oldCenter

这是我的主要功能:

def main():     pygame.init()

screensize = (640,700)
screen = pygame.display.set_mode(screensize)

background = pygame.Surface(screen.get_size())
background.fill((0, 255, 0))

clock = pygame.time.Clock()

pong = Pong(screensize)
player_paddle = PlayerPaddle(screensize)
ai_paddle = AIPaddle(screensize)


paddleSprite = pygame.sprite.Group(player_paddle)
pongSprite = pygame.sprite.Group(pong)

while running:
    running = True

        #object updating phase
        ai_paddle.update(pong, player_paddle)
        player_paddle.update()
        pong.update(player_paddle, ai_paddle)

        if pygame.sprite.spritecollide(player_paddle, pong, False, pygame.sprite.collide_mask):
            print("Collided")



    #rendering phase
        ai_paddle.render(screen)
        player_paddle.render(screen)
        pong.render(screen)

        paddleSprite.clear(screen, background)
        paddleSprite.update()
        paddleSprite.draw(screen)

        pongSprite.clear(screen,background)
        pongSprite.update()
        pongSprite.draw(screen)

        pygame.display.flip()

    pygame.quit()


main()

我做了两个&#34; group&#34;对象(pong和player_paddle),但我不确定为什么我甚至无法运行该程序。另外,我知道碰撞不起作用,因为乒乓球会撞到原始图像的矩形,而不是旋转的图像,但是我不知道为什么如果我使用内置的精灵功能会发生这种情况。感谢。

1 个答案:

答案 0 :(得分:0)

阅读spritecollide

的文档
  

在与另一个精灵相交的组中查找精灵    spritecollide(sprite, group ,dokill,collided = None) - &gt; Sprite_list

第二个参数必须是pygame.sprite.Group),而不是单个Sprite。

它可以是具有一个精灵的组事件。但是你使用的是pong,它是单精灵,而不是组。

请参阅collide_mask

的文档
  

使用蒙版在两个精灵之间进行碰撞检测    collide_mask(SpriteLeft,SpriteRight) - &gt;点

使用蒙版检查两个精灵之间的碰撞。

编辑:您的代码中存在

问题
spritecollide(player_paddle, pong,...) 

因为pong是单Sprite,而不是Group

使用pong,您应该使用collide_mask

collide_mask(player_paddle, pong)

您可以spritecollide使用pongSprite Group

spritecollide(player_paddle, pongSprite,...)`
顺便说一句:你可以使用更好的名字,即。 pong_group代替pongSprite 最终pong_sprite代替pong(但pong也可以)。