I am making a zombie shooter game - I want to make player shoot multiple bullets at once but in my code I can only get it to shoot 1 bullet until it comes back. how do I make it so it keep shooting bullets if i am holding space bar?
here's the code till now:-
# --------- Zombie Shooter Game --------- #
import pygame
from pygame.locals import *
import math
#variabls / constants
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
#pygame initialization!
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
pygame.display.set_caption('Zombie invader')
BACKGROUND_COLOR = (30,30,30)
screen.fill(BACKGROUND_COLOR)
class Bullet():
def __init__(self,surface) -> None:
self.screen = surface
# -- bullet stats --
self.color = (255,255,255)
self.width = 5
self.height = 5
self.x = player.x
self.y = player.y
# -- bullet var --
self.ready = True
self.speed = 10
self.ammo = 10
def run(self):
self.draw()
self.update()
def draw2(self):
pass
def reset(self):
self.ready = True
self.ammo += 1
def draw(self):
self.bullet = pygame.draw.rect(self.screen,self.color,pygame.Rect(self.x,self.y,self.width,self.height))
def update(self):
if self.ready == True:
self.x = player.x + player.width/2 - self.width/2
self.y = player.y + player.height/2 - self.height/2
else:
self.x += self.moveX
self.y += self.moveY
if "space" in main.keysPressed:
self.shoot()
if self.x > SCREEN_WIDTH or self.x < 0 or self.y > SCREEN_HEIGHT or self.y < 0:
self.reset()
def shoot(self):
if self.ready == True:
self.ready = False
self.ammo -= 1
self.targetX,self.targetY = main.mouseX,main.mouseY
self.distanceX,self.distanceY = self.targetX - self.x,self.targetY - self.y
self.angle = math.atan2(self.distanceX,self.distanceY)
self.moveX,self.moveY = math.sin(self.angle) * self.speed,math.cos(self.angle) * self.speed
class Player():
def __init__(self,surface) -> None:
self.screen = surface
# -- Player Stats --
self.color = pygame.Color('dodgerblue1')
self.width = 20
self.height = 20
self.x = SCREEN_WIDTH/2 - self.width/2
self.y = SCREEN_HEIGHT/2 - self.height/2
def run(self):
#running all the Player function
self.draw()
self.move()
def draw(self):
#drawing player on the screen
self.player = pygame.draw.rect(self.screen,self.color,pygame.Rect(self.x,self.y,self.width,self.height))
def move(self):
#moving player
if "right" in main.keysPressed:
self.x += 4
if "left" in main.keysPressed:
self.x -= 4
if "up" in main.keysPressed:
self.y -= 4
if "down" in main.keysPressed:
self.y += 4
class Main():
def __init__(self,surface):
self.screen = surface
self.keysPressed = []
self.mouseX, self.mouseY = pygame.mouse.get_pos()
def run(self):
#main loop
running = True
while running:
self.screen.fill(BACKGROUND_COLOR)
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
running = False
if event.key == K_RIGHT or event.key == K_d:
self.keysPressed.append("right")
if event.key == K_LEFT or event.key == K_a:
self.keysPressed.append("left")
if event.key == K_UP or event.key == K_w:
self.keysPressed.append("up")
if event.key == K_DOWN or event.key == K_s:
self.keysPressed.append("down")
if event.key == K_SPACE:
self.keysPressed.append("space")
if event.type == KEYUP:
if event.key == K_RIGHT or event.key == K_d:
self.keysPressed.remove("right")
if event.key == K_LEFT or event.key == K_a:
self.keysPressed.remove("left")
if event.key == K_UP or event.key == K_w:
self.keysPressed.remove("up")
if event.key == K_DOWN or event.key == K_s:
self.keysPressed.remove("down")
if event.key == K_SPACE:
self.keysPressed.remove("space")
if event.type == pygame.QUIT:
running = False
self.mouseX, self.mouseY = pygame.mouse.get_pos()
clock.tick(60)
player.run()
bullet.run()
pygame.display.update()
if __name__ == '__main__':
player = Player(screen)
bullet = Bullet(screen)
main = Main(screen)
main.run()
I have tried different way that were given but couldn't understand how they did it