Search code examples
pythonpygamebullet

Not able to shoot bullet in pygame


So recently I have been trying to make my first big game but I'm stuck on the shooting phase. Basically, my problem is I want to make it so that I can shoot multiple bullets and move around while doing so, but I can't seem to figure it out.

Code:

import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((600,600))
pygame.display.set_caption("Shooter Game!")
#Variables
playerX = 5
playerY = 5
black = (0,0,0)
blue = (0,0,255)
red = (255,0,0)
clicking = False
bulletX = playerX
bulletY = playerY
#End Of Variables#
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            exit()
    screen.fill(blue)
    player = pygame.image.load("Young_Link_2D.png").convert_alpha()
    screen.fill(blue)
    player1 = pygame.transform.scale(player, (100,100))
    screen.blit(player1,(playerX,playerY))
    keyPressed = pygame.key.get_pressed()
    #Controls
    if keyPressed[pygame.K_a]:
        playerX -= 1
        bulletX = playerX
    if keyPressed[pygame.K_d]:
        playerX += 1
        bulletX = playerX
    if keyPressed[pygame.K_w]:
        playerY -= 1
        bulletY = playerY
    if keyPressed[pygame.K_s]:
        playerY += 1
        bulletY = playerY
    #End of Controls
    
    #Shooting
    if event.type == pygame.MOUSEBUTTONUP:
        if event.button == 1:
            Bullet = pygame.draw.rect(screen, red, (bulletX+35,bulletY + 60,10,25))
            bulletY = bulletY + 1
    
    pygame.display.update()

Solution

  • Here is what i meant by classes:

    import pygame
    import Bullet
    from pygame.locals import *
    
    pygame.init()
    screen = pygame.display.set_mode((600, 600))
    pygame.display.set_caption("Shooter Game!")
    # Variables
    playerX = 5
    playerY = 5
    black = (0, 0, 0)
    blue = (0, 0, 255)
    red = (255, 0, 0)
    clicking = False
    bulletX = playerX
    bulletY = playerY
    bullets = []
    newBullet = False
    # End Of Variables#
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                exit()
        screen.fill(blue)
        player = pygame.image.load("100x100_logo.png").convert_alpha()
        screen.fill(blue)
        player1 = pygame.transform.scale(player, (100, 100))
        screen.blit(player1, (playerX, playerY))
        keyPressed = pygame.key.get_pressed()
        # Controls
        if keyPressed[pygame.K_a]:
            playerX -= 1
            bulletX = playerX
        if keyPressed[pygame.K_d]:
            playerX += 1
            bulletX = playerX
        if keyPressed[pygame.K_w]:
            playerY -= 1
            bulletY = playerY
        if keyPressed[pygame.K_s]:
            playerY += 1
            bulletY = playerY
        # End of Controls
    
        # Shooting
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                bullets.append(Bullet.Bullet(bulletX + 35, bulletY + 60))
    
        for i in range(len(bullets)):
            bullets[i].draw(screen, (255, 0, 0))
            bullets[i].move(1)
        print(len(bullets))
    
        pygame.display.update()
    

    Thats your main code. There is still a bug where there is no cooldown so multiple bullets are created consecutively when holding the mouse button.

    import pygame
    
    class Bullet:
        def __init__(self, x, y):
            self.x = x
            self.y = y
    
        def draw(self, win, colour):
            pygame.draw.rect(win, colour, (self.x, self.y, 10, 25))
    
        def move(self, speed):
            self.y += speed
    

    and thats the bullet class to create multiple instances