Python Pygame-使子弹朝光标方向射击

Python Pygame-使子弹朝光标方向射击,python,math,pygame,Python,Math,Pygame,我试图让游戏中的子弹朝着光标的方向射击,直到它击中窗口边界。我的项目符号当前指向光标,但一旦到达光标所在位置,它就会停止 我注意到,如果光标在屏幕外,子弹可能会到达边界,因此我尝试通过乘法和加法将用于计算子弹移动的光标位置修改为始终在窗口外,但我无法使其按照我希望的方式工作 win = pygame.display.set_mode((1000, 800)) pos = pygame.mouse.get_pos() keys = pygame.key.get_pressed() def sho

我试图让游戏中的子弹朝着光标的方向射击,直到它击中窗口边界。我的项目符号当前指向光标,但一旦到达光标所在位置,它就会停止

我注意到,如果光标在屏幕外,子弹可能会到达边界,因此我尝试通过乘法和加法将用于计算子弹移动的光标位置修改为始终在窗口外,但我无法使其按照我希望的方式工作

win = pygame.display.set_mode((1000, 800))
pos = pygame.mouse.get_pos()
keys = pygame.key.get_pressed()

def shoot(bullets):
    for bullet in bullets:
        if bullet.x > 0 and bullet.x <1000 and bullet.y > 0 and bullet.y < 800:
            pygame.draw.circle(win, (255, 255, 255), (round(bullet.x) ,round(bullet.y)),5)
            diffX = bullet.targetX - bullet.x
            diffY = bullet.targetY - bullet.y
            ang = math.atan2(diffY,diffX)
            bullet.x += math.cos(ang)*bullet.vel
            bullet.y += math.sin(ang)*bullet.vel

if keys[pygame.K_SPACE] and RegBullet.canShoot:
        RegBullet.canShoot = False
        regBullets.append(RegBullet(win,x=p1.getX(),y=p1.getY(),targetX=pos[0],targetY=pos[1]))
        pause = threading.Thread(target=cool_down,args=(1,))
        pause.start()
win=pygame.display.set_模式((1000800))
pos=pygame.mouse.get_pos()
keys=pygame.key.get_pressed()
def射击(子弹):
对于子弹中的子弹:
如果bullet.x>0,bullet.x 0和bullet.y<800:
pygame.draw.circle(赢,(255,255,255),(圆(bullet.x),圆(bullet.y)),5)
diffX=bullet.targetX-bullet.x
diffY=bullet.targetY-bullet.y
ang=数学参数atan2(diffY,diffX)
bullet.x+=数学cos(ang)*bullet.vel
bullet.y+=math.sin(ang)*bullet.vel
如果键[pygame.K_SPACE]和RegBullet.canShoot:
RegBullet.canShoot=False
追加(RegBullet(win,x=p1.getX(),y=p1.getY(),targetX=pos[0],targetY=pos[1]))
暂停=线程。线程(目标=冷却,参数=(1,))
暂停。开始()

问题在于,您需要通过矢量计算子弹的方向,从子弹的当前位置到目标点(
bullet.targetX
bullet.targetY
)。
一旦子弹到达目标,则该方向为(0,0),子弹不再移动。
不要将目标位置存储在
bullet
中。而是存储初始方向向量。e、 g:

bullet.diffX=targetX-bullet.x
bullet.diffY=targetY-bullet.y
ang=math.atan2(bullet.diffY,bullet.diffX) bullet.x+=数学cos(ang)*bullet.vel bullet.y+=math.sin(ang)*bullet.vel 使用和验证项目符号是否在窗口内:

对于项目符号中的项目符号:
如果pygame.Rect(0,0,1000,800).collidepoint(bullet.x,bullet.y):
# [...]
甚至:

对于项目符号中的项目符号:
半径=5
bullet_rect=pygame.rect(-radius,-radius,radius,radius);
bullet_rect.center=(bullet.x,bullet.y)
如果pygame.Rect(0,0,1000,800).collide Rect(bullet_Rect):
# [...]

我建议用于计算子弹的移动,例如:

bullet.pos=pg.math.Vector2(bullet.x,bullet.y)
bullet.dir=pg.math.Vector2(targetX,targetY)-bullet.pos
bullet.dir=bullet.dir.normalize()
对于项目符号中的项目符号:
如果#[…]
bullet.pos+=bullet.dir*bullet.vel
bullet.x,bullet.y=(圆形(bullet.pos.x),圆形(bullet.pos.y))

仅提供与项目符号相关的代码。如果你需要看更多的代码,请让我知道。谢谢你指出这一点。我将diffX和diffY移动到bullet类中,并从那里调用它,而不是不断刷新它们。