Python 在pygame中朝鼠标方向开枪

Python 在pygame中朝鼠标方向开枪,python,pygame,Python,Pygame,我就是不明白为什么我的子弹不起作用。我制作了一个bullet类,它是: class Bullet: def __init__(self): self.x = player.x self.y = player.y self.height = 7 self.width = 2 self.bullet = pygame.Surface((self.width, self.height)) self.

我就是不明白为什么我的子弹不起作用。我制作了一个bullet类,它是:

class Bullet:
    def __init__(self):
        self.x = player.x
        self.y = player.y
        self.height = 7
        self.width = 2
        self.bullet = pygame.Surface((self.width, self.height))
        self.bullet.fill((255, 255, 255))
现在,我在游戏类中添加了几个函数,下面是新代码:

class Game:
    def __init__(self):
        self.bullets = []
    
    def shoot_bullet(self):
         if self.bullets:
            for bullet in self.bullets:
                rise = mouse.y - player.y
                run = mouse.x - player.x
                angle = math.atan2(rise, run)

                bullet.x += math.cos(angle)
                bullet.y += math.sin(angle)

                pygame.transform.rotate(bullet.bullet, -math.degrees(angle))
                D.blit(bullet.bullet, (bullet.x, bullet.y))


    def generate_bullet(self):
        if  mouse.is_pressed():
            self.bullets.append(Bullet())
我希望代码能做的是一个
Bullet()
会被添加到
游戏中。每次我按下鼠标按钮,子弹就会被添加到
游戏中。shoot\u Bullet
会计算玩家和鼠标之间的角度,并按照鼠标的方向相应地射出子弹。然而,结果是一片混乱,子弹实际上不旋转也不移动。它们被生成并奇怪地移动到屏幕的左侧。我不确定我是否弄糟了什么,或者我使用的方法完全错误。

首先,不变换对象本身,而是创建一个新的旋转曲面并返回它

如果要向某个方向发射子弹,则该方向在子弹发射时定义,但不会持续更改。 发射子弹时,设置子弹的起始位置,并将方向向量计算到鼠标位置:

self.pos=(x,y)
mx,my=pygame.mouse.get_pos()
self.dir=(mx-x,my-y)
方向向量不应取决于到鼠标的距离,但它必须是一个。 通过除以

length=math.hypot(*self.dir)
如果长度=0.0:
self.dir=(0,-1)
其他:
self.dir=(self.dir[0]/length,self.dir[1]/length)
计算矢量的角度并旋转子弹。通常,向量的角度可以通过
atan2(y,x)
来计算。y轴需要反转(
atan2(-y,x)
),因为y轴通常指向上,但在PyGame坐标系中,y轴指向下(请参阅):

angle=math.degrees(math.atan2(-self.dir[1],self.dir[0]))
self.bullet=pygame.Surface((7,2)).convert_alpha()
自我项目符号填充((255,255,255))
self.bullet=pygame.transform.rotate(self.bullet,角度)
要更新项目符号的位置,只需缩放方向(按速度)并将其添加到项目符号的位置即可:

self.pos=(self.pos[0]+self.dir[0]*self.speed,
自我位置[1]+自我方向[1]*自我速度)
要在正确的位置绘制旋转的项目符号,请获取旋转项目符号的边框,并使用
self.pos
设置中心点(请参见):

bullet\u rect=self.bullet.get\u rect(中心=self.pos)
冲浪板(自我弹头,弹头)
另见


最简单的例子:

导入pygame
输入数学
pygame.init()
window=pygame.display.set_模式((500500))
clock=pygame.time.clock()
类别项目符号:
定义初始化(self,x,y):
self.pos=(x,y)
mx,my=pygame.mouse.get_pos()
self.dir=(mx-x,my-y)
长度=数学形下(*self.dir)
如果长度=0.0:
self.dir=(0,-1)
其他:
self.dir=(self.dir[0]/length,self.dir[1]/length)
角度=数学度(数学atan2(-self.dir[1],self.dir[0]))
self.bullet=pygame.Surface((7,2)).convert_alpha()
自我项目符号填充((255,255,255))
self.bullet=pygame.transform.rotate(self.bullet,角度)
自身速度=2
def更新(自我):
self.pos=(self.pos[0]+self.dir[0]*self.speed,
自我位置[1]+自我方向[1]*自我速度)
def绘图(自我、冲浪):
bullet\u rect=self.bullet.get\u rect(中心=self.pos)
冲浪板(自我弹头,弹头)
项目符号=[]
位置=(250250)
运行=真
运行时:
时钟滴答(60)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
如果event.type==pygame.MOUSEBUTTONDOWN:
项目符号。追加(项目符号(*pos))
对于项目符号中的项目符号[:]:
bullet.update()
如果不是window.get_rect().collidepoint(bullet.pos):
项目符号。移除(项目符号)
窗口填充(0)
pygame.draw.circle(窗口,(0,255,0),位置,10)
对于子弹中的子弹:
子弹画(窗口)
pygame.display.flip()

这可能是在不同象限中产生负面结果的触发器函数吗?-当鼠标位于右上角时,它能工作吗?我打印出了sin和cos值,似乎就是这样(看起来sin在第二象限是负数)。我该怎么解决这个问题呢?对,sin是正的,cos是负的,那么使用极坐标呢?裁判: