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!
JavaScript
x
184
184
1
import math
2
import random
3
4
import pygame
5
from pygame import mixer
6
7
# Initialize the pygame
8
pygame.init()
9
10
# create the screen
11
screen = pygame.display.set_mode((800, 600))
12
13
# Background
14
background = pygame.image.load('space background.png')
15
16
# Background Sound
17
# come back to this from bg music 'mixer.music.load('insert file name')'
18
# mixer.music.play(-1)
19
20
# Title and Icon
21
pygame.display.set_caption("Space Invaders")
22
icon = pygame.image.load('ufo.png')
23
pygame.display.set_icon(icon)
24
25
# Player
26
playerImg = pygame.image.load('ship.png')
27
playerX = 370
28
playerY = 480
29
playerX_change = 0
30
31
# Enemy
32
enemyImg = []
33
enemyX = []
34
enemyY = []
35
enemyX_change = []
36
enemyY_change = []
37
num_of_enemies = 6
38
39
for i in range(num_of_enemies):
40
enemyImg.append(pygame.image.load('enemy.png'))
41
enemyX.append(random.randint(0, 735))
42
enemyY.append(random.randint(50, 150))
43
enemyX_change.append(0.3)
44
enemyY_change.append(40)
45
46
# Bullet
47
48
# Ready - you cat see the bullet on the screen
49
# Fire - The bullet is currently moving
50
51
bulletImg = pygame.image.load('bullet.png')
52
bulletX = 0
53
bulletY = 480
54
bulletX_change = 0
55
bulletY_change = 1 # Bullet speed
56
bullet_state = "ready"
57
58
# Score
59
60
score_value = 0
61
font = pygame.font.Font('Minecraft.ttf', 24)
62
textX = 10
63
testY = 10 # might have to change back to 'text'
64
65
# Game Over text
66
over_font = pygame.font.Font('Minecraft.ttf', 64)
67
68
69
def show_score(x, y):
70
score = font.render("Score : " + str(score_value), True, (225, 225, 255))
71
screen.blit(score, (x, y))
72
73
74
def game_over_text(x, y):
75
over_text = over_font.render("GAME OVER", True, (225, 225, 255))
76
screen.blit(over_text, (200, 250))
77
78
79
def player(x, y):
80
screen.blit(playerImg, (x, y))
81
82
83
def enemy(x, y, i):
84
screen.blit(enemyImg[i], (x, y))
85
86
87
def fire_bullet(x, y):
88
global bullet_state
89
bullet_state = "fire"
90
screen.blit(bulletImg, (x + 16, y + 10))
91
92
93
def iscollision(enemyX, enemyY, bulletX, bulletY):
94
distance = math.sqrt(math.pow(enemyX - bulletX, 2)) + (math.pow(enemyY - bulletY, 2))
95
if distance < 27:
96
return True
97
else:
98
return False
99
100
101
# Game Loop
102
running = True
103
while running:
104
105
# RGB
106
screen.fill((0, 0, 0))
107
# background image
108
screen.blit(background, (0, 0))
109
for event in pygame.event.get():
110
if event.type == pygame.QUIT:
111
running = False
112
113
# if keystroke is pressed check whether its right or left
114
if event.type == pygame.KEYDOWN:
115
if event.key == pygame.K_LEFT:
116
playerX_change = -0.7 # player speed
117
if event.key == pygame.K_RIGHT:
118
playerX_change = 0.7
119
if event.key == pygame.K_SPACE:
120
if bullet_state == "ready":
121
bullet_Sound = mixer.Sound('laser.wav')
122
bullet_Sound.play()
123
# Get the current X corrdinate of te spaceship
124
bulletX = playerX
125
fire_bullet(playerX, bulletY)
126
127
if event.type == pygame.KEYUP:
128
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
129
playerX_change = 0
130
131
# 5 = 5 + -0.1 -> 5 = 5 - 0.1
132
# 5 = 5 + 0.1
133
134
# Checking for boundries of spaceship
135
playerX += playerX_change
136
if playerX <= 0:
137
playerX = 0
138
elif playerX >= 736:
139
playerX = 736
140
141
# Enemy Movement
142
for i in range(num_of_enemies):
143
144
# Game over
145
if enemyY[i] > 440:
146
for j in range(num_of_enemies):
147
enemyY[j] = 2000
148
game_over_text()
149
break
150
151
enemyX[i] += enemyX_change[i]
152
if enemyX[i] <= 0:
153
enemyX_change[i] = 0.3 # enemy speed
154
enemyY[i] += enemyY_change[i]
155
elif enemyX[i] >= 736:
156
enemyX_change[i] = -0.3
157
enemyY[i] += enemyY_change[i]
158
159
# Collision
160
collision = iscollision(enemyX[i], enemyY[i], bulletX, bulletY)
161
if collision:
162
explosion_Sound = mixer.Sound('explosion.wav')
163
explosion_Sound.play()
164
bulletY = 480
165
bullet_state = "ready"
166
score_value += 100
167
enemyX[i] = random.randint(0, 736)
168
enemyY[i] = random.randint(50, 150)
169
170
enemy(enemyX[i], enemyY[i], i)
171
172
# Bullet Movement
173
if bulletY <= 0:
174
bulletY = 480
175
bullet_state = "ready"
176
177
if bullet_state == "fire":
178
fire_bullet(bulletX, bulletY)
179
bulletY -= bulletY_change
180
181
player(playerX, playerY)
182
show_score(textX, testY)
183
pygame.display.update()
184
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!