i can't shoot the bullet in this pygame space invaders

Viewed 34

Pygame is perfectly installed, everything else is working fine spaceship movement and enemy movement but i am not able to see the bullet which i have drawn from inside the fire_bullet function, I have tried drawing it from outside the function and that does seem to work .

import pygame
import os
import random
pygame.init()

#Screen
screen = pygame.display.set_mode((800, 600))

#Title and Icon
pygame.display.set_caption('Space Invaders ')
UFO = pygame.image.load(os.path.join('Assets2', 'ufo.png'))
pygame.display.set_icon(UFO)


#player

playerImg = pygame.image.load(os.path.join('Assets2', 'spaceship.png'))
playerX = 370
playerY = 480
VEL = 0

def player(x, y):
    screen.blit(playerImg, (x, y))


#enemy
enemyImg = pygame.image.load(os.path.join('Assets2', 'enemy.png'))
enemyimg1 = pygame.transform.scale(enemyImg, (45, 50))
enemyX = random.randint(0,800)
enemyY = random.randint(50,150)
enemyX_change = 0.7
enemyY_change = 40

def enemy(x,y):
    screen.blit(enemyimg1, (x, y))

#background
bg = pygame.image.load(os.path.join('Assets2', 'space.png'))

#bullet
bulletimg = pygame.image.load(os.path.join('Assets2', 'bullet.png'))
bulletX = 0
bulletY = 480
bulletX_change = 0
bulletY_change = 10
bullet_state = "ready"  #Ready - Rest, Fire - Motion

def fire_bullet(x,y):
    global bullet_state
    bullet_state = "fire"
    screen.blit(bulletimg, (x+16, y+10))


run = True

#Game loop

while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    # Movement
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                VEL = -1.4
            if event.key == pygame.K_RIGHT:
                VEL= 1.4
            # Bullet positioning
            if event.key == pygame.K_SPACE:
                fire_bullet(playerX, bulletY)



        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                VEL = 0

    playerX += VEL

    # Restricting boundaries of spaceship
    if playerX <= 0:
        playerX = 0
    elif playerX >= 736:
        playerX = 736

    enemyX += enemyX_change

    # Restricting boundaries of Enemy
    if enemyX <= 0:
       enemyX_change = 1
       enemyY += enemyY_change
    elif enemyX >= 736:
        enemyX_change = -1
        enemyY += enemyY_change

    #Bullet Movement
    if bullet_state is "fire":
        fire_bullet(playerX, bulletY)
        bulletY -= bulletY_change


    screen.fill((255,255,0))
    screen.blit(bg, (0,0))

    player(playerX, playerY)

    enemy(enemyX, enemyY)

    pygame.display.update()

Also all the assets are fine and dowloaded correctly so idk why is it still not showing the bullet drawn from inside the function

1 Answers

Your bullet is so fast that you can barely see it. You have to limit the frames per second. Use pygame.time.Clock to control the frames per second and thus the game speed.
The method tick() of a pygame.time.Clock object, delays the game in that way, that every iteration of the loop consumes the same period of time. See pygame.time.Clock.tick():

This method should be called once per frame.

e.g.:

clock = pygame.time.Clock()

#Game loop
while run:
    clock.tick(60)

    # [...]
Related