title: how do I fire a bullet with mouse in pygame?
body: <p>I am trying to fire a bullet from my tank</p>
  
  <pre><code>for event in pygame.event.get():
      if event.type == pygame.MOUSEBUTTONDOWN:
          if pygame.mouse.get_pressed()[0]:
              cannon_ball_move_change = 1
  
  cannon_ball_move += cannon_ball_move_change
  </code></pre>
  
  <p>pos_x,pos_y is the position of the main character</p>
  
  <p>mouse_x,mouse_y is the position of the mouse</p>
  
  <pre><code>mouse_x,mouse_y=pygame.mouse.get_pos()
  
  mouse_radians = math.radians(-180) + math.atan2((pos_y-mouse_y),(pos_x-mouse_x))
  </code></pre>
  
  <p>function that moves the gun I am pointing at:</p>
  
  <pre><code>def player_gun(pos_x,pos_y,mouse_radians):
  
      pygame.draw.line(screen,green,[pos_x,pos_y],[pos_x+20*math.cos(mouse_radians),pos_y+20*math.sin(mouse_radians)],5)
      #'pygame.draw.line' draws a line(gun) that connects from the player and the direction of where the mouse is pointing at
  
      pygame.draw.circle(screen,green,[pos_x,pos_y],5)
      #this is the gun's body part
  </code></pre>
  
  <p>function that shoots cannonballs(bullets):</p>
  
  <pre><code>def player_cannonball(mouse_radians,cannon_ball_move,pos_x,pos_y):
      cannonball_x = int(cannon_ball_move*(math.cos(mouse_radians))+pos_x)
      cannonball_y = int(cannon_ball_move*(math.sin(mouse_radians))+pos_y)
      pygame.draw.circle(screen,red,[cannonball_x,cannonball_y],5)
      print(cannonball_x,cannonball_y)
  </code></pre>
  
  <p>calling the function</p>
  
  <pre><code>player_cannonball(mouse_radians,cannon_ball_move,pos_x,pos_y)
  player_gun(pos_x,pos_y,mouse_radians)
  </code></pre>
  
  <p>Is this the right way to fire a bullet in pygame?</p>
  
  <p><strong>problem 1: When I click where I want to shoot nothing comes out of my tank</strong></p>
  
  <p><em>(solved by user2588654)</em></p>
  
  <p><strong>problem 2: After I click to shoot and I move the mouse the bullet movement is affected by the movement of my mouse</strong></p>
  
  <p><em>(solved by user2588654)</em></p>
  
  <p>This is my whole code down below but you don't have to see it</p>
  
  <p>The pictures:</p>
  
  <p><a href="https://www.dropbox.com/s/mgzllcg0xer3z2c/enemy.png?dl=0" rel="nofollow noreferrer">enemy</a></p>
  
  <p><a href="https://www.dropbox.com/s/ehrijvo5pbyo67j/player1.png?dl=0" rel="nofollow noreferrer">player</a></p>
  
  <p><a href="https://www.dropbox.com/s/tu2wexbkyq3norw/background.png?dl=0" rel="nofollow noreferrer">background</a></p>
  
  <p>(some variables are different from above)</p>
  
  <p>pos_x+360 is pos_x</p>
  
  <p>pos_y+740 is pos_y</p>
  
  <p>mouse_radians is radians_pt</p>
  
  <p>ball_move is cannonball_move</p>
  
  <pre><code>import pygame,math,random
  pygame.init()
  display_width = 1200
  display_height = 800
  white = (255,255,255)
  black = (0,0,0)
  red = (200,0,0)
  yellow = (150,150,0)
  green=(0,170,0)
  light_yellow = (255,255,0)
  light_red = (255,0,0)
  role_model = car_image = pygame.image.load('player1.png')
  enemy = pygame.image.load('enemy.png')
  background = pygame.image.load('background.png')
  
  clock = pygame.time.Clock()
  FPS = 30
  screen = pygame.display.set_mode([display_width,display_height])
  screen_rect = screen.get_rect()
  car_width = 16
  car_height = 28
  smallfont =pygame.font.SysFont('comicsansms',25)
  medfont =pygame.font.SysFont('comicsansms',50)
  largefont =pygame.font.SysFont('comicsansms',80)
  
  def player_car(car_image,rect,angle,pos_x,pos_y):
      rot_image,rot_rect=rotate(car_image,rect,angle)
      rot_rect.centerx +=pos_x
      rot_rect.centery += pos_y
      screen.blit(rot_image,rot_rect)
      print(rot_rect)
  
  
  def player_turret(pos_x,pos_y,radians_pt):
      pygame.draw.line(screen,green,[pos_x+360,pos_y+740],[pos_x+360+20*math.cos(radians_pt),pos_y+740+20*math.sin(radians_pt)],5)
      pygame.draw.circle(screen,green,[pos_x+360,pos_y+740],5)
  
  def player_cannonball(radians_pt,ball_move,pos_x,pos_y):
      #cannonball_count = 0
      ball_x = int(ball_move*(math.cos(radians_pt))+pos_x+360)
      ball_y = int(ball_move*(math.sin(radians_pt))+pos_y+740)
      pygame.draw.circle(screen,red,[ball_x,ball_y],5)
      print(ball_x,ball_y)
  
  def enemy_car(enemy,rect,angle_e,pos_x_e,pos_y_e):
      rot_image_e,rot_rect_e=rotate(enemy,rect,angle_e)
      rot_rect_e.centerx +=pos_x_e
      rot_rect_e.centery += pos_y_e
      screen.blit(rot_image_e,rot_rect_e)
  
  def death_move(pos_x,pos_y):
      color_list=[light_yellow,light_red]
      for i in range(40):
          a=color_list[random.randrange(0,2)]
          pygame.draw.circle(screen,a,[random.randint((pos_x+360)-25,(pos_x+360)+25),random.randint((pos_y+740)-25,(pos_y+740)+25)],3)
          pygame.display.update()
          clock.tick(FPS)
  
  def death():
      msg_to_screen('YOU ARE DEAD',red,0,size='large')
      msg_to_screen('press c to continue or q to quit',black,50)
      pygame.display.update()
      death = True
      while death:
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                  death = False
                  pygame.quit()
                  quit()
              if event.type == pygame.KEYDOWN:
                  if event.key == pygame.K_c:
  
                      gameloop()
                      death = False
                  elif event.key == pygame.K_q:
                      death =  False
                      pygame.quit()
                      quit()
  
          clock.tick(15)
  
  def game_pause():
      game_pause = True
      msg_to_screen('PAUSED',black,0,'large')
      msg_to_screen('press c to continue or q to quit',red,40)
      pygame.display.update()
      while game_pause:
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
  ##                controls = False
  ##                gameintro = False
  ##                running = False
  ##                game_pause = False
                  pygame.quit()
                  quit()
              if event.type == pygame.KEYDOWN:
                  if event.key == pygame.K_c:
                      game_pause = False
                  elif event.key == pygame.K_q:
                      pygame.quit()
                      quit()
  
  
          clock.tick(15)
  def game_intro():
      gameintro = True
  
      while gameintro == True:
  
          for event in pygame.event.get():
              if event.type == pygame.KEYDOWN:
                  if event.key == pygame.K_p:
  
                      gameloop()
                      gameintro = False
  
                  if event.key == pygame.K_c:
  
                      controls()
                      gameintro = False
  
              if event.type == pygame.QUIT:
                  pygame.quit()
                  quit()
          screen.fill(white)
          msg_to_screen('CAR RACING',black,y_displace=-50,size = 'large')
          msg_to_screen('press p to play and c for controls menu',red,y_displace=20)
          msg_to_screen('by yeonjekim',yellow,y_displace=80)
          pygame.display.update()
          clock.tick(15)
  
  def text_objects(text,color,size):
      if size == "small":
          textSurface = smallfont.render(text, True, color)
      elif size == "medium":
          textSurface = medfont.render(text, True, color)
      elif size == "large":
          textSurface = largefont.render(text, True, color)
  
  
      return textSurface, textSurface.get_rect()
  
  def turret(pos_x_t,pos_y_t):
      pygame.draw.circle(screen,black,[pos_x_t,pos_y_t],30)
  def msg_to_screen(msg,color, y_displace=0, size = "small"):
      textSurf, textRect = text_objects(msg,color, size)
      textRect.center = (display_width / 2), (display_height / 2)+y_displace
      screen.blit(textSurf, textRect)
  def controls():
      controls = True
  
      while controls == True:
          for event in pygame.event.get():
              if event.type == pygame.KEYDOWN:
                  if event.key == pygame.K_b:
                      controls = False
                      game_intro()
              elif event.type == pygame.QUIT:
                  pygame.quit()
                  quit()
          screen.fill(white)
          msg_to_screen('CONTROLS',black,y_displace=-100,size = 'large')
          msg_to_screen('K_LEFT:  go left',green,y_displace = -40)
          msg_to_screen('K_RIGHT: go right',green,y_displace = 0)
          msg_to_screen('K_UP:    go up',green,y_displace = 40)
          msg_to_screen('K_DOWN:  go down',green,y_displace = 80)
          msg_to_screen('K_SPACE: break',green,y_displace = 120)
          msg_to_screen('K_p:     pause',green,y_displace = 160)
          msg_to_screen('press b to go back to the main menu',red,y_displace = 200)
          pygame.display.update()
          clock.tick(15)
  def rotate(image, rect, angle):
      rot_image = pygame.transform.rotate(image, angle)
      rot_rect = rot_image.get_rect(center=rect.center)
      return rot_image,rot_rect
  
  def carRotationPos(angle):
      x=1*math.cos(math.radians(angle-90))
      y=1*math.sin(math.radians(angle-90))
  
      return x,y
  
  
  def gameloop():
      gameintro = False
      running = True
      angle = -90
      radians_pt = 0
      radians_pt_change = 0
      angle_change = 0
      changeX = 0
      changeY=0
      max_speed = 25
      x=0
      y=0
      pos_x=0
      pos_y=0
      pos_x_e= 120
      pos_y_e=-30
      speed = 0
      speed_change = 0
      change_1=0
      count = 0
      count_e = 0
      change_2 = 0
      max_speed_e = 15
      slowingdown=0
      angle_e=-90
      mouse_x=0
      mouse_y=0
      cannonball_max_count = 5
      ball_move =0
      ball_move_change=0
      moving_up = False
      moving_down = False
      slowdown_up = False
      slowdown_down = False
      rect = role_model.get_rect(center = (360,740))#center = screen_rect.center)
      while running == True:
  
  
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                  controls = False
                  gameintro = False
                  running = False
  
  
              if event.type == pygame.KEYDOWN:
                  if event.key == pygame.K_p:
                      game_pause()
  
                  elif event.key == pygame.K_LEFT:
  
  
                      angle_change = 5
  
                  elif event.key == pygame.K_RIGHT:
                      angle_change = -5
  
                  elif event.key == pygame.K_UP:
                      slowdown_up = False
                      slowdown_down = False
                      changeX=-x
                      changeY=y
                      speed_change = ((1/2)*speed_change**2 - (1/2)*speed_change+ 1)*0.2
                      moving_up = True
                  #start of my problem
                  elif event.key == pygame.K_DOWN:
                      slowdown_down = False
                      slowdown_up = False
                      changeX=x
                      changeY=-y
                      speed_change = ((1/2)*speed_change**2 - (1/2)*speed_change+ 1)*0.2
                      moving_down = True
                  elif event.key == pygame.K_SPACE:
                      change_1 =2
  
  
  
              if event.type == pygame.KEYUP:
                  if event.key == pygame.K_LEFT:
                      angle_change = 0
  
                  elif event.key == pygame.K_RIGHT:
                      angle_change = 0
  
                  elif event.key == pygame.K_UP:
                      moving_up = False
                      slowdown_up = True
                  elif event.key == pygame.K_DOWN:
                      moving_down = False
                      slowdown_down = True
                  elif event.key == pygame.K_SPACE:
                      slowingdown = 0
                      change_1 = 0
                      max_speed = 25
              if event.type == pygame.MOUSEBUTTONDOWN:
                  if pygame.mouse.get_pressed()[0]:
                      ball_move_change=1
  
          ball_move += ball_move_change
          mouse_x,mouse_y=pygame.mouse.get_pos()
          mouse_gradient=math.atan2((pos_y+740-mouse_y),(pos_x+360-mouse_x))
          radians_pt = mouse_gradient+math.radians(-180)
          print(radians_pt)
          player_cannonball(radians_pt,ball_move,pos_x,pos_y)
  
          slowingdown+=change_1 
          if moving_up == True:
              max_speed-=slowingdown
          elif moving_down == True:
              max_speed-=slowingdown
  
  
          if changeX or changeY:
              pos_x+=changeX
              pos_y+=changeY
          if angle == -360 or angle == 360:
              angle = 0
  
          if angle_change:
              angle +=angle_change
          if speed_change:
              speed+=speed_change
  
  
              if speed &gt; max_speed:
                  speed = max_speed
  
  
  
  
          screen.blit(background,(0,0))
          x,y=carRotationPos(angle)
  
          x=round(x*speed)
          y=round(y*speed)
          if slowdown_up == True:
  
              changeX = -x
              changeY = y
              speed =speed- 1
              if speed &lt;=0:
                  speed = 0
  
          if slowdown_down == True:
              changeX = x
              changeY = -y
              speed =speed- 1
              if speed &lt;=0:
                  speed = 0
  
  
          if moving_up:
  
  
              changeX = -x
              changeY = y
  
          if moving_down:
  
              changeX = x
              changeY = -y
  
          #collision detection
          if pos_x&lt;-341:
  
              death_move(pos_x,pos_y)
              death()
  ##            pos_x = -341
  ##            pos_x+=2
          if pos_y&lt;-720:
              death_move(pos_x,pos_y)
              death()
  ##            pos_y=-720
  ##            pos_y+=2
          if pos_y&gt;43:
              death_move(pos_x,pos_y)
              death()
  ##            pos_y = 43
  ##            pos_y-=2
          if pos_x&gt;820:
              death_move(pos_x,pos_y)
              death()
  ##            pos_x = 820
  ##            pos_x-=2
          #enemy collision detection
  
          #grass collison
          if not(-308&lt;pos_x&lt;782 and -686&lt;pos_y&lt;13):
              if count&gt;20:
                  count = 20
              count +=1
  
              max_speed = 25-count
              if slowingdown&gt;4-change_1:
                  slowingdown = 4-change_1
              if slowingdown&lt;0:
                  slowingdown = 0
          elif -228&lt;pos_x&lt;718 and -625&lt;pos_y&lt;-50:
              if count&gt;20:
                  count = 20
              count +=1
              max_speed = 25-count
              if slowingdown&gt;4-change_1:
                  slowingdown = 4-change_1
              if slowingdown&lt;0:
                  slowingdown = 0
          else:
              count = 0
              max_speed = 25
              if slowingdown&gt;25-change_1:
                  slowingdown = 25-change_1
              if slowingdown&lt;0:
                  slowingdown = 0
  
          #enemy grass collision
  ##        if not(-308&lt;pos_x_e&lt;782 and -686&lt;pos_y_e&lt;13):
  ##            if count_e&gt;20:
  ##                count_e = 20
  ##            count_e +=1
  ##            
  ##            max_speed_e = 25-count_e
  ##            if slowingdown&gt;4-change_1:
  ##                slowingdown = 4-change_1
  ##            if slowingdown&lt;0:
  ##                slowingdown = 0
  ##        elif -228&lt;pos_x_e&lt;718 and -625&lt;pos_y_e&lt;-50:
  ##            if count_e&gt;20:
  ##                count_e = 20
  ##            count_e +=1
  ##            max_speed_e = 25-count  #max_speed_e
  ##            if slowingdown&gt;4-change_1:
  ##                slowingdown = 4-change_1
  ##            if slowingdown&lt;0:
  ##                slowingdown = 0
  ##        else:
  ##            count_e = 0
  ##            max_speed_e = 25
  ##            if slowingdown&gt;25-change_1:
  ##                slowingdown = 25-change_1
  ##            if slowingdown&lt;0:
  ##                slowingdown = 0
  
          #end of the collision detection
  
          #enemy car code
          if angle_e == 270:
              angle_e = -90
          if -260&lt;=pos_x_e&lt;730 and pos_y_e == -30:
              pos_x_e+=10#((1/2)*speed_change**2 - (1/2)*speed_change+ 1)*0.2
  
  
          elif -90&lt;=angle_e&lt;0:
              angle_e += 5
  
  
  
          elif angle_e==0 and -657&lt;pos_y_e&lt;=-30:
              pos_y_e -= 10
          elif 0&lt;=angle_e &lt;90 and pos_y_e == -660:
              angle_e +=5
  
          elif pos_y_e == -660 and -260&lt;pos_x_e&lt;=730:
  
              pos_x_e -=10
          elif pos_y_e == -660 and pos_x_e == -260 and 90&lt;=angle_e&lt;180:
              angle_e +=5
          elif -660&lt;=pos_y_e&lt;-40  and pos_x_e == -260 and angle_e == 180:
              pos_y_e += 10
          elif -40&lt;=pos_y_e&lt;-30 and 180&lt;=angle_e&lt;270:
              pos_y_e +=10/18
              angle_e +=5
          if pos_y_e ==-29.99999999999997:
              pos_y_e = round(pos_y_e)
  
          #pos_x_t = random.randint(30,600)
          #pos_y_t = random.randint(30,600)
          #turret(pos_x_t,pos_y_t)
          #if enemy team reaches the yellow line enemy team earns a turret
          #the enemy can shoot
          #you can get items if you reach the yellow line, the item could be a gun for removing enemy turrets
  
          player_car(car_image,rect,angle,pos_x,pos_y)
          player_turret(pos_x,pos_y,radians_pt)
          enemy_car(enemy,rect,angle_e,pos_x_e,pos_y_e)
  
  
  
          msg_to_screen('speed = '+str(round(speed*5,1))+'km/h',black, y_displace=-375, size = "small")
          pygame.display.update()
          clock.tick(FPS)
  
  game_intro()
  pygame.quit()
  </code></pre>