我和一些朋友一直在编写一个有趣的新射击技师。为了它的工作,我们需要向玩家面对的方向射击。 Sprite正在与Pygame.Transform.Rotate一起旋转。我们怎样才能找到一个角度,向那个方向射击我的子弹?
这是我们用于旋转精灵的代码
char_image_number = pygame.mouse.get_pressed()
if char_image_number == (0, 0, 0):
char_image = pygame.image.load(player_none).convert_alpha()
char_image = pygame.transform.rotate(char_image, angle)
screen.blit(background, (0,0))
screen.blit(char_image,(540, 260))
pygame.display.update()
elif char_image_number == (1, 0, 0):
print (angle)
char_image = pygame.image.load(player_left).convert_alpha()
angle+=1
char_image = pygame.transform.rotate(char_image, angle)
screen.blit(background, (0,0))
screen.blit(char_image,(540, 260))
pygame.display.update()
elif char_image_number == (0, 0, 1):
print (angle)
angle-=1
char_image = pygame.image.load(player_right).convert_alpha()
char_image=pygame.transform.rotate(char_image, angle)
screen.blit(background, (0,0))
screen.blit(char_image,(540, 260))
pygame.display.update()
elif char_image_number == (1, 0, 1):
char_image = pygame.image.load(player_both).convert_alpha()
char_image = pygame.transform.rotate(char_image, angle)
screen.blit(background, (0,0))
screen.blit(char_image,(540, 260))
pygame.display.update()
我们如何以玩家面对的角度拍摄?
答案 0 :(得分:9)
这是一个如何使用矢量数学来做你想做的快速的可执行例子。
import pygame
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((32, 32))
self.image.fill((0, 0, 0))
self.image.set_colorkey((0, 0, 0))
pygame.draw.polygon(self.image, pygame.Color('dodgerblue'), ((0, 0), (32, 16), (0, 32)))
self.org_image = self.image.copy()
self.angle = 0
self.direction = pygame.Vector2(1, 0)
self.rect = self.image.get_rect(center=(200, 200))
self.pos = pygame.Vector2(self.rect.center)
def update(self, events, dt):
for e in events:
if e.type == pygame.KEYDOWN:
if e.key == pygame.K_SPACE:
self.groups()[0].add(Projectile(self.rect.center, self.direction.normalize()))
pressed = pygame.key.get_pressed()
if pressed[pygame.K_a]:
self.angle += 3
if pressed[pygame.K_d]:
self.angle -= 3
self.direction = pygame.Vector2(1, 0).rotate(-self.angle)
self.image = pygame.transform.rotate(self.org_image, self.angle)
self.rect = self.image.get_rect(center=self.rect.center)
class Projectile(pygame.sprite.Sprite):
def __init__(self, pos, direction):
super().__init__()
self.image = pygame.Surface((8, 8))
self.image.fill((0, 0, 0))
self.image.set_colorkey((0, 0, 0))
pygame.draw.circle(self.image, pygame.Color('orange'), (4, 4), 4)
self.rect = self.image.get_rect(center=pos)
self.direction = direction
self.pos = pygame.Vector2(self.rect.center)
def update(self, events, dt):
self.pos += self.direction * dt
self.rect.center = self.pos
if not pygame.display.get_surface().get_rect().contains(self.rect):
self.kill()
def main():
pygame.init()
screen = pygame.display.set_mode((500, 500))
sprites = pygame.sprite.Group(Player())
clock = pygame.time.Clock()
dt = 0
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
sprites.update(events, dt)
screen.fill((30, 30, 30))
sprites.draw(screen)
pygame.display.update()
dt = clock.tick(60)
if __name__ == '__main__':
main()
注意:您似乎每帧都在加载播放器的图像。你不应该这样做,因为这非常慢。只需加载每个图像一次。此外,最好在代码中只有一个位置调用pygame.display.update()
,因为您应确保每帧只调用一次。
答案 1 :(得分:0)
你有angle
度,所以试试这个:
import math
# angle examples
for angle in [0, 30, 45, 60, 0+90, 30+90, 45+90, 60+90, 0+180, 30+180, 45+180, 60+180, 0+270, 30+270, 45+270, 60+270]:
bullet_speed = 10
bullet_move_x = bullet_speed * math.cos( math.radians(angle) )
bullet_move_y = -bullet_speed * math.sin( math.radians(angle) )
print angle, bullet_move_x, bullet_move_y
现在您可以将bullet_move_x
,bullet_move_y
添加到子弹位置。
为了获得更好的效果,请将子弹位置保持为float
并在弹出子弹时转换为int
答案 2 :(得分:0)
此示例演示了如何利用矢量来控制子弹的位置,速度和起始偏移。
在while循环中,我们使用math.atan2
计算目标的角度,然后用于旋转加农炮图像并传递给Bullet
个实例。在__init__
的{{1}}方法中,我们按角度旋转偏移矢量,速度矢量和精灵图像。
要移动子弹,我们将(旋转的)速度矢量添加到位置矢量,并将矩形位置设置为Bullet
矢量。必须移动矩形,因为它保持blit位置并用于碰撞检测。
pos