python - 为什么我的子弹与鼠标呈 90 度角移动?
问题描述
于是在网上找了几个答案,试了一个,发现“子弹”总是和光标成90度角。有任何解决这个问题的方法吗?我对三角学的经验很少。另外,我对这件事很陌生,所以不要介意代码中缺乏结构。
import pygame
import math
pygame.init()
win_height=800
win_width=800
win=pygame.display.set_mode((win_width,win_height))
pygame.display.set_caption("Shooter Game")
white=(255,255,255)
black=(0,0,0)
clock=pygame.time.Clock()
bullets=pygame.sprite.Group()
class soldier_class(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image=pygame.image.load("inkscape images for games/soldier2.png")
self.image=pygame.transform.scale(self.image,(100,150))
self.rect=self.image.get_rect()
def update(self):
new_rect=soldier_rotated.get_rect(center=(soldier.rect.x,soldier.rect.y))
win.blit(soldier_rotated,(new_rect.x,new_rect.y))
class bullet_class(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image=pygame.Surface((25,25))
self.image.fill(black)
self.rect=self.image.get_rect()
self.angle=0
def update(self):
self.rect.x+=5*math.cos(self.angle)
self.rect.y-=5*math.sin(self.angle)
soldier=soldier_class()
soldier.rect.x=200
soldier.rect.y=200
while True:
mouse=pygame.mouse.get_pos()
clock.tick(60)
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
key=pygame.key.get_pressed()
if key[pygame.K_w]:
soldier.rect.y-=5
if key[pygame.K_s]:
soldier.rect.y+=5
if key[pygame.K_d]:
soldier.rect.x+=5
if key[pygame.K_a]:
soldier.rect.x-=5
if key[pygame.K_SPACE]:
bullet=bullet_class()
bullet.rect.x=soldier.rect.x
bullet.rect.y=soldier.rect.y
bullet.angle=math.atan2(mouse[0]-bullet.rect.x,mouse[1]-bullet.rect.y)
bullets.add(bullet)
angle=math.atan2(mouse[0]-soldier.rect.x,mouse[1]-soldier.rect.y)/6.28*360
soldier_rotated=pygame.transform.rotate(soldier.image,angle)
win.fill(white)
soldier.update()
bullets.update()
bullets.draw(win)
pygame.display.update()
解决方案
因为角度计算错误:
while True:
# [...]
if key[pygame.K_SPACE]:
# [...]
#bullet.angle=math.atan2(mouse[0]-bullet.rect.x,mouse[1]-bullet.rect.y)
bullet.angle = math.atan2(soldier.rect.y - mouse[1], mouse[0] - soldier.rect.x)
#angle = math.atan2(mouse[0]-soldier.rect.x,mouse[1]-soldier.rect.y)/6.28*360
angle = math.atan2(soldier.rect.y - mouse[1], mouse[0] - soldier.rect.x) * 180/math.pi
推荐阅读
- julia - 是否可以用宏改变函数的主体?
- angular - Angular 6 没有正确显示错误(它只显示 ERROR Error: "[object Object]" )
- arm - 堆栈指针和程序计数器有什么区别?
- javascript - 使用正则表达式如何在 url 中获得两个单词之间的匹配?
- javascript - 未捕获的错误:使用 react 创建旭日形图时出现 Highcharts 错误 #17
- java - Javax Websocket使用路径参数提交登录数据,好的做法?
- django - 按范围 django 获取 ids group
- python - 如何使用 python pandas 找到 Shapiro-Wilk?
- javascript - 使用 react 轮询 API
- sql - OPENJSON 给出空值