我正在使用pygame搞乱一个子弹地狱游戏。我试图制作一个圆形的传播模式。下面这段代码让我陷入困境。以下是我的子弹类,其中包含更新子弹位置的更新功能
class Bullet(pygame.sprite.Sprite):
def __init__(self, angle):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(os.path.join(img_folder, "bullet.png")).convert()
self.image.set_colorkey(BLACK)
self.rect = self.image.get_rect()
self.rect.center = (WIDTH / 2 , HEIGHT / 2)
self.angle = angle
self.counter = 0
self.speedx = 5
self.speedy = 5
def update(self):
self.rect.x += self.speedx * math.cos(math.radians(self.angle))
self.rect.y += self.speedy * math.sin(math.radians(self.angle))
if(self.rect.right > 640 or self.rect.left < 0 or self.rect.bottom > 480 or self.rect.top < 0):
self.kill()
模式组功能创建为
for x in range(12):
bullet_sprite1.add(Bullet(angle))
angle += 30
在生成模式时,它不会创建一个完美的圆圈,因为您可以看到here
我怎样才能使它成为一个完美的循环传播
答案 0 :(得分:0)
出现此问题是因为pygame.Rect
s不能有浮点数,因为它们的x和y坐标和pygame只会截断分配给rect的浮点数。您可以添加另外两个属性self.posx
和self.posy
来存储和更新实际位置,然后将它们分配给self.rect.center
。
class Bullet(pygame.sprite.Sprite):
def __init__(self, angle):
# Rest of the attributes omitted.
self.speedx = 5 * math.cos(math.radians(self.angle))
self.speedy = 5 * math.sin(math.radians(self.angle))
self.posx = self.rect.centerx
self.posy = self.rect.centery
def update(self):
self.posx += self.speedx
self.posy += self.speedy
self.rect.center = (self.posx, self.posy)
if (self.rect.right > 640 or self.rect.left < 0
or self.rect.bottom > 480 or self.rect.top < 0):
self.kill()
您也可以使用矢量。
from pygame.math import Vector2
class Bullet(pygame.sprite.Sprite):
def __init__(self, angle):
# Rest of the attributes omitted.
self.rect = self.image.get_rect(center=(WIDTH / 2 , HEIGHT / 2))
self.velocity = Vector2(1, 0).rotate(angle) * 5
self.pos = Vector2(self.rect.center)
def update(self):
self.pos += self.velocity
self.rect.center = self.pos