当子弹拥有一定角度的时候,可以在子弹的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