我目前正尝试使用蒙版和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),但我不确定为什么我甚至无法运行该程序。另外,我知道碰撞不起作用,因为乒乓球会撞到原始图像的矩形,而不是旋转的图像,但是我不知道为什么如果我使用内置的精灵功能会发生这种情况。感谢。
答案 0 :(得分:0)
在与另一个精灵相交的组中查找精灵 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
也可以)。