I did some research to see if I could fix my problem on my own but it has been fruitless so far. I’ve checked to see if I ran the .display command too much but I haven’t, the program will run without error but the screen appears black except when I close the window out, you can catch a glimpse of what it is supposed to display. Any insight into what is wrong? Help is greatly appreciated!
import math import random import pygame from pygame import mixer # Initialize the pygame pygame.init() # create the screen screen = pygame.display.set_mode((800, 600)) # Background background = pygame.image.load('space background.png') # Background Sound # come back to this from bg music 'mixer.music.load('insert file name')' # mixer.music.play(-1) # Title and Icon pygame.display.set_caption("Space Invaders") icon = pygame.image.load('ufo.png') pygame.display.set_icon(icon) # Player playerImg = pygame.image.load('ship.png') playerX = 370 playerY = 480 playerX_change = 0 # Enemy enemyImg = [] enemyX = [] enemyY = [] enemyX_change = [] enemyY_change = [] num_of_enemies = 6 for i in range(num_of_enemies): enemyImg.append(pygame.image.load('enemy.png')) enemyX.append(random.randint(0, 735)) enemyY.append(random.randint(50, 150)) enemyX_change.append(0.3) enemyY_change.append(40) # Bullet # Ready - you cat see the bullet on the screen # Fire - The bullet is currently moving bulletImg = pygame.image.load('bullet.png') bulletX = 0 bulletY = 480 bulletX_change = 0 bulletY_change = 1 # Bullet speed bullet_state = "ready" # Score score_value = 0 font = pygame.font.Font('Minecraft.ttf', 24) textX = 10 testY = 10 # might have to change back to 'text' # Game Over text over_font = pygame.font.Font('Minecraft.ttf', 64) def show_score(x, y): score = font.render("Score : " + str(score_value), True, (225, 225, 255)) screen.blit(score, (x, y)) def game_over_text(x, y): over_text = over_font.render("GAME OVER", True, (225, 225, 255)) screen.blit(over_text, (200, 250)) def player(x, y): screen.blit(playerImg, (x, y)) def enemy(x, y, i): screen.blit(enemyImg[i], (x, y)) def fire_bullet(x, y): global bullet_state bullet_state = "fire" screen.blit(bulletImg, (x + 16, y + 10)) def iscollision(enemyX, enemyY, bulletX, bulletY): distance = math.sqrt(math.pow(enemyX - bulletX, 2)) + (math.pow(enemyY - bulletY, 2)) if distance < 27: return True else: return False # Game Loop running = True while running: # RGB 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 # if keystroke is pressed check whether its right or left if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: playerX_change = -0.7 # player speed if event.key == pygame.K_RIGHT: playerX_change = 0.7 if event.key == pygame.K_SPACE: if bullet_state == "ready": bullet_Sound = mixer.Sound('laser.wav') bullet_Sound.play() # Get the current X corrdinate of te spaceship bulletX = playerX fire_bullet(playerX, bulletY) if event.type == pygame.KEYUP: if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: playerX_change = 0 # 5 = 5 + -0.1 -> 5 = 5 - 0.1 # 5 = 5 + 0.1 # Checking for boundries of spaceship playerX += playerX_change if playerX <= 0: playerX = 0 elif playerX >= 736: playerX = 736 # Enemy Movement for i in range(num_of_enemies): # Game over if enemyY[i] > 440: for j in range(num_of_enemies): enemyY[j] = 2000 game_over_text() break enemyX[i] += enemyX_change[i] if enemyX[i] <= 0: enemyX_change[i] = 0.3 # enemy speed enemyY[i] += enemyY_change[i] elif enemyX[i] >= 736: enemyX_change[i] = -0.3 enemyY[i] += enemyY_change[i] # Collision collision = iscollision(enemyX[i], enemyY[i], bulletX, bulletY) if collision: explosion_Sound = mixer.Sound('explosion.wav') explosion_Sound.play() bulletY = 480 bullet_state = "ready" score_value += 100 enemyX[i] = random.randint(0, 736) enemyY[i] = random.randint(50, 150) enemy(enemyX[i], enemyY[i], i) # Bullet Movement if bulletY <= 0: bulletY = 480 bullet_state = "ready" if bullet_state == "fire": fire_bullet(bulletX, bulletY) bulletY -= bulletY_change player(playerX, playerY) show_score(textX, testY) pygame.display.update()
Advertisement
Answer
All you have to do is indent the last bit of code (the 11 lines under the comment Bullet Movement
) one level in. Right now, it’s not under the while
loop, which explains why the screen is black and why it only appears after you click the close button (which exits the loop and executes the drawing code). Hope this helps!