pygame之飞机大战子弹360度角度的算法

当子弹拥有一定角度的时候,可以在子弹的set_speed()函数里,算出子弹x,y两个方向的速度,输入角度是degree换成弧度radian

  def set_speed(self, speed, angle=0):
        self.speed = speed
        self.angle = angle
        angle = math.pi * angle / 180
        self.x_speed = speed * math.cos(angle)
        self.y_speed = speed * math.sin(angle)

因为是继承了 pygame.sprite.Sprite。直接在update()函数中把位置更新行了。

 #会自动调用
    def update(self):
        self.rect.x += self.x_speed
        self.rect.y += self.y_speed

但是你会发现,子弹并不能360度发射,原因是speed的数字很小,一般在10之内,当角度也小的时候,speed*sin(ange)的数字转成整数(int)后(像素必须是int),误差很大,积累后,只能发射聊聊无几的几个。

目前的想法,不先算速度,在算位置,而是先算长度,再根据角度算位置,这样每个子弹的误差就很小了。

  def set_speed(self, speed, angle=0):
        self.speed = speed
        self.angle = angle
        # angle = math.pi * angle / 180
        # self.x_speed = speed * math.cos(angle)
        # self.y_speed = speed * math.sin(angle)

在update()函数里计算位置

 def update(self)
      self.distance += self.speed 
      angle = self.angle
      angle = math.pi * angle / 180
      self.rect.x = self.distance * math.cos(angle) + self.orx
      self.rect.y = self.distance * math.sin(angle) + self.ory
      # print(self.distance)

在set_post()函数里,输入发射的起点位置

 def set_pos(self, x, y):
        
        self.rect.x = x
        self.rect.y = y
        self.orx = x
        self.ory = y

猜你喜欢

转载自blog.csdn.net/hailler1119/article/details/88679456