Python 如何旋转精灵并朝鼠标位置发射子弹?

Python 如何旋转精灵并朝鼠标位置发射子弹?,python,pygame,Python,Pygame,目标是让一些子弹从玩家的当前位置出来,然后让它们沿直线移动,直线由一个向量定义,该向量由点击按钮时鼠标位置的点和玩家的位置定义,但当按下按钮时,什么也不会发生。有人能告诉我这个代码有什么问题吗?多谢各位 导入pygame 输入数学 pygame.init() win=pygame.display.set_模式((500500)) pygame.display.set_标题(“太空射手”) char=pygame.image.load(“spaceship\u sprite.png”) x=500

目标是让一些子弹从玩家的当前位置出来,然后让它们沿直线移动,直线由一个向量定义,该向量由点击按钮时鼠标位置的点和玩家的位置定义,但当按下按钮时,什么也不会发生。有人能告诉我这个代码有什么问题吗?多谢各位

导入pygame
输入数学
pygame.init()
win=pygame.display.set_模式((500500))
pygame.display.set_标题(“太空射手”)
char=pygame.image.load(“spaceship\u sprite.png”)
x=500/2
y=500/2
宽度=50
高度=50
速度=6
项目符号列表=[]
def指向鼠标(x、y、char):
鼠标x,鼠标y=pygame.mouse.get\u pos()
向量x,向量y=鼠标x-x,鼠标y-y
角度=(180/math.pi)*-math.atan2(向量y,向量x)-90
更新的_image=pygame.transform.rotate(字符、整数(角度))
image\u location=更新的\u image.get\u rect(中心=(x,y))
win.blit(更新的图片、图片位置)
def更新_游戏(x、y、宽度、高度、字符):
胜利填充((0,0,0))
指向鼠标(x,y,char)
pygame.display.update()
def生成子弹(x,y):
项目符号的全局列表
初始值x=x
初始值y=y
鼠标x,鼠标y=pygame.mouse.get\u pos()
向量x,向量y=鼠标x-x,鼠标y-y
#规范化向量
距离=数学.sqrt(向量x**2+向量y**2)
归一化向量=(向量x/距离,向量y/距离)
列出\u项目符号。追加([initial\u x,initial\u y,normalized\u vec])
运行=真
运行时:
#查看事件
pygame.时间延迟(75)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
如果event.type==pygame.MOUSEBUTTONDOWN:
繁殖子弹(x,y)
对于\u项目符号列表中的项目符号:
项目符号[0]=项目符号[0]*项目符号[2][0]
项目符号[1]=项目符号[1]*项目符号[2][1]
pygame.draw.rect(win,(0,0255),(int(bullet[0]),int(bullet[1]),20,20))
如果项目符号[0]>500或项目符号[0]<0或项目符号[1]<0或项目符号[1]>500:
删除项目符号列表[项目符号列表.索引(项目符号)]
持续
keys=pygame.key.get_pressed()
如果键[pygame.K_LEFT]和x>0+宽度:
x=x-速度
elif键[pygame.K_RIGHT]和x<500-宽度:
x=x+速度
elif键[pygame.K_UP]和y>0+宽度:
y=y-速度
elif键[pygame.K_DOWN]和y<500-宽度:
y=y+速度
更新游戏(x,y,宽度,高度,字符)
pygame.quit()

有两个问题。子弹的当前位置乘以其规格化方向向量。这没有道理:

对于项目符号列表中的项目符号:
项目符号[0]=项目符号[0]*项目符号[2][0]
项目符号[1]=项目符号[1]*项目符号[2][1]
将方向向量添加到项目符号的位置:

对于项目符号列表中的项目符号:
项目符号[0]+=项目符号[2][0]
项目符号[1]+=项目符号[2][1]
如果要提高子弹的速度,则必须按一定的
速度缩放矢量。e、 g:

def spawn_bullet(x,y):
项目符号的全局列表
初始值x=x
初始值y=y
鼠标x,鼠标y=pygame.mouse.get\u pos()
向量x,向量y=鼠标x-x,鼠标y-y
距离=数学.sqrt(向量x**2+向量y**2)
速度=5
移动向量=(速度*向量x/距离,速度*向量y/距离)
列出\u项目符号。追加([initial\u x,initial\u y,move\u vec])

第二个问题是,在绘制项目符号后,显示被清除,因此您永远不会“看到”项目符号

清除显示后,在
update_game
中绘制子弹:

def更新_游戏(x,y,宽度,高度,字符):
胜利填充((0,0,0))
对于\u项目符号列表中的项目符号:
pygame.draw.rect(win,(0,0255),(int(bullet[0]),int(bullet[1]),20,20))
指向鼠标(x,y,char)
pygame.display.update()
(删除主应用循环的图形)


最简单的例子:

导入数学
导入pygame
def blit_指向鼠标(目标搜索、字符搜索、x、y):
鼠标x,鼠标y=pygame.mouse.get\u pos()
向量x,向量y=鼠标x-x,鼠标y-y
角度=(180/math.pi)*-math.atan2(向量y,向量x)-90
rotated_surface=pygame.transform.rotate(char_surf,round(角度))
旋转的曲面位置=旋转的曲面。获取(中心=(x,y))
目标曲面blit(旋转曲面、旋转曲面位置)
def生成项目符号(项目符号列表,x,y):
鼠标x,鼠标y=pygame.mouse.get\u pos()
向量x,向量y=鼠标x-x,鼠标y-y
距离=数学形(向量x,向量y)
如果距离=0:
返回
速度=5
移动向量=(速度*向量x/距离,速度*向量y/距离)
列出\u项目符号。追加([x,y,移动\u向量])
pygame.init()
window=pygame.display.set_模式((500500))
clock=pygame.time.clock()
rocket=pygame.image.load('Rocket64.png')
rocket\u rect=rocket.get\u rect(中心=window.get\u rect().center)
速度=6
项目符号列表=[]
bullet=pygame.Surface((20,20),pygame.SRCALPHA)
pygame.draw.circle(子弹,(64,64,64),(10,10),10)
pygame.平局.圆圈(子弹,(96,96,96),(10,10),9)
pygame.draw.circle(子弹,(128,128,128),(9,9),7)
pygame.draw.circle(子弹,(160160160),(8,8),5)
pygame.draw.circle(子弹,(192192192),(7,7),3)
pygame.draw.circle(子弹,(224224224224),(6,6),1)
运行=真
运行时:
时钟滴答(60)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
如果event.type==pygame.MOUSEBUTTONDOWN:
生成子弹(子弹列表,*火箭直置中心)
对于项目符号列表中的项目符号位置:
子弹头位置[0]+=子弹头位置[2][0]
子弹头位置[1]+=子弹头位置[2][1]
若否(0),