0

I have a problem with my pygame game. I made an player animation when the player is moving. I also added a bullet. My problem is that after I used my bullet my player and the bullet is flickering. When i only update the display on the end, you can not see the bullet. Multiple updates bring the issue of flickering player and bullet. pls help me. Thank you

import random

import pygame

# Intialize the pygame
pygame.init()

# create the screen
screen = pygame.display.set_mode((640, 360))

# Background
background = pygame.image.load('SSF2_Final_Valley.png')
walkRight = [pygame.image.load('R1a.png'), pygame.image.load('R2a.png'), pygame.image.load('R3a.png'), pygame.image.load('R4a.png'), pygame.image.load('R5a.png'), pygame.image.load('R6a.png'), pygame.image.load('R7a.png'), pygame.image.load('R8a.png'), pygame.image.load('R9a.png')]
walkLeft = [pygame.image.load('L1a.png'), pygame.image.load('L2a.png'), pygame.image.load('L3a.png'), pygame.image.load('L4a.png'), pygame.image.load('L5a.png'), pygame.image.load('L6a.png'), pygame.image.load('L7a.png'), pygame.image.load('L8a.png'), pygame.image.load('L9a.png')]
char = pygame.image.load('stand.png')


vel = 5
width = 64
screen_width = 640
left = False
right = False
clockobject = pygame.time.Clock()


#player
playerImg = pygame.image.load('stand.png')
playerX = 15
playerY = 290
playerX_change = 0

# Bullet

# Ready - You can't see the bullet on the screen
# Fire - The bullet is currently moving

bulletImg = pygame.image.load('kunai.png')
bulletX = 15
bulletY = 290 - 32
bulletX_change = 3
bulletY_change = 0
bullet_state = "ready"

def redrawGameWindow():
    global player
    def player(x, y):
        global walkCount
        screen.blit(background, (0,0))
        #chracter wird gezecihnet
        if walkCount + 1 >= 20:
            walkCount = 0
        if left:
            screen.blit(walkLeft[walkCount//3], (x, y))
            walkCount += 1
            
        elif right:
            screen.blit(walkRight[walkCount//3], (x, y))
            walkCount += 1
            
        else:
            screen.blit(char, (x, y))
            pygame.display.update()
            
    global fire_bullet   
    def fire_bullet(x, y):
        global bullet_state
        bullet_state = "fire"
        screen.blit(bulletImg, (x + 32, y + 32))
        pygame.display.update()
    
    #pygame.display.update()
    
running = True
while running:
    # RGB = Red, Green, Blue
    screen.fill((0, 0, 0))
    # Background Image
    screen.blit(background, (0, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()
            exit()
            

        # if keystroke is pressed check whether its right or left
        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_SPACE:
                if bullet_state is "ready":
                    
                    # Get the current x cordinate of the spaceship
                    bulletX = playerX
                    fire_bullet(bulletX, bulletY)

                
    keys = pygame.key.get_pressed()
                
    if keys[pygame.K_LEFT] and playerX > vel:
        playerX -= vel
        left = True
        right = False
        
    elif keys[pygame.K_RIGHT] and playerX < screen_width- width :
        playerX += vel
        right = True
        left = False
        
    else:
        right = False
        left = False
        walkCount = 0
        
                
    # 5 = 5 + -0.1 -> 5 = 5 - 0.1
    # 5 = 5 + 0.1
        
    # Bullet Movement
    if bulletX <= 0:
        bulletX = 15
        bullet_state = "ready"

    if bullet_state is "fire":
        fire_bullet(bulletX, bulletY)
        bulletX += bulletX_change
        
    if (bulletX > screen_width-width):
        bullet_state = "ready"

    redrawGameWindow()
    player(playerX, playerY)
    pygame.display.update()
  • You have multiple calls to `pygame.display.update()` in the application loop. This causes the flickering. Remove the extra `pygame.display.update()` form `fire_bullet`. – Rabbid76 Mar 28 '21 at 15:03
  • Furthermore you have to call `fire_bullet` after `redrawGameWindow`. You must draw the bullet after drawing the background. – Rabbid76 Mar 28 '21 at 15:11

0 Answers0