如何在pygame中为子弹地狱制作完美的圆形图案?

时间:2017-10-08 16:15:48

标签: python pygame

我正在使用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

我怎样才能使它成为一个完美的循环传播

1 个答案:

答案 0 :(得分:0)

出现此问题是因为pygame.Rect s不能有浮点数,因为它们的x和y坐标和pygame只会截断分配给rect的浮点数。您可以添加另外两个属性self.posxself.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