'How to make a shoot-outed bullet unaffected by following moves in pygame?

I'm making a simple shooting game following a book using pygame. but the example in the book only shoots in one direction and can't move upward. so I make a few changes but now the shoot-outed bullets will be affected by arrow keys. how should I fix it? Sorry for my ugly codes and thanks for your suggestion!

import pygame

from settings import Settings
from ship import Ship
from bullet import Bullet

class AlienInvasion:
    """overall class to manage game assets and behavior"""

    def __init__(self):
        """initialize"""
        pygame.init()
        self.settings = Settings()

        self.screen = pygame.display.set_mode(
            (self.settings.screen_width,self.settings.screen_height))
        pygame.display.set_caption("alien invasion")
        self.ship = Ship(self)
        self.bullets = pygame.sprite.Group()

    def run_game(self):
        """start the main loop for game"""
        while True:
            self._check_events()
            self.ship.update()
            self.bullets.update(self)

            #delete bullet that touch the wall
            for bullet in self.bullets.copy():
                if (bullet.rect.bottom <= 0   or
                    bullet.rect.top >= 720    or
                    bullet.rect.right >= 1280 or
                    bullet.rect.left <= 0):
                      self.bullets.remove(bullet)
            self._update_screen()

    def _check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._kd_events(event)
            elif event.type == pygame.KEYUP:
                self._ku_events(event)

    def _update_screen(self):
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()

        #make the most recently drawn screen visiable
        pygame.display.flip()

    def _kd_events(self,event):
        if event.key == pygame.K_RIGHT:
            self.ship.moving_r = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_l = True
        elif event.key == pygame.K_UP:
            self.ship.moving_u = True
        elif event.key == pygame.K_DOWN:
            self.ship.moving_d = True
        elif event.key == pygame.K_ESCAPE:
            pygame.quit()
            sys.exit()
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()
    def _ku_events(self,event):
        if event.key == pygame.K_RIGHT:
            self.ship.moving_r = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_l = False
        elif event.key == pygame.K_UP:
            self.ship.moving_u = False
        elif event.key == pygame.K_DOWN:
            self.ship.moving_d = False
    def _fire_bullet(self):
        new_bullet = Bullet(self)
        self.bullets.add(new_bullet)
        
if __name__ == '__main__':
    #make a ai instance and run it
    ai = AlienInvasion()
    ai.run_game()
import pygame
from pygame.sprite import Sprite

class Bullet(Sprite):
    
    def __init__(self,ai_game):
        """create a bullet at ship's current position"""
        super().__init__()
        self.screen = ai_game.screen
        self.settings = ai_game.settings
        self.color = self.settings.bullet_color

        self.rect = pygame.Rect(0,0,self.settings.bullet_width,
            self.settings.bullet_height)
        self.rect.center = ai_game.ship.rect.center

        #store the bullet's postion
        self.y = float(self.rect.y)
        self.x = float(self.rect.x)

    def update(self,ai_game):
        """move the bullet"""
        if ai_game.ship.image == ai_game.ship.image_r:
            self.x += self.settings.bullet_speed
            self.rect.x = self.x
        elif ai_game.ship.image == ai_game.ship.image_l:
            self.x -= self.settings.bullet_speed
            self.rect.x = self.x
        elif ai_game.ship.image == ai_game.ship.image_u:
            self.y -= self.settings.bullet_speed
            self.rect.y = self.y
        elif ai_game.ship.image == ai_game.ship.image_d:
            self.y += self.settings.bullet_speed
            self.rect.y = self.y

    def draw_bullet(self):
        pygame.draw.rect(self.screen,self.color,self.rect)


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source