为什么我用 Pygame 制作的游戏突然卡顿了几秒? [英] Why does my game made with Pygame suddenly lag for a few seconds?
问题描述
我用 pygame 制作了一个太空入侵者小游戏,我注意到游戏周期性地滞后几秒钟.我不知道是什么问题.我是初学者.你能告诉我为什么会这样吗?有没有办法解决这个问题?
I made a little space invaders game with pygame, I noticed that the game lags for a few seconds periodically. I do not know what the problem is. I am a beginner. Can you tell me why this happens? Is there any fix to this?
此外,为什么在主游戏循环中添加背景图像后一切都会变慢?
Also, why does everything slow down once you add the background image in the main game loop?
import pygame
from pygame import mixer
import random
import math
# Starting pygame
pygame.init()
# window
screen = pygame.display.set_mode((800, 600))
background = pygame.image.load('background.png')
# title and icon
pygame.display.set_caption("Space Invaders")
icon = pygame.image.load('icon.png')
pygame.display.set_icon(icon)
# background
mixer.music.load('galaxy.ogg')
mixer.music.play(-1)
# player
playerimg = pygame.image.load('rocket.png')
playerX = 370
playerY = 480
playerX_change = 0
# Enemy
enemy_img = []
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
num_of_enemies = 1
for i in range(num_of_enemies):
enemy_img.append(pygame.image.load('Enemy.png'))
enemyX.append(random.randint(0, 735))
enemyY.append(random.randint(50, 300))
enemyX_change.append(4)
enemyY_change.append(40)
# Bullet
bulletimg = pygame.image.load('bullet.png')
bulletX = 0
bulletY = 480
bulletX_change = 0
bulletY_change = 10
bullet_state = "ready"
# ready = you can't see the bullet on the screen
# fire = the bullet is currently moving
# score
score_value = 0
font = pygame.font.Font('freesansbold.ttf', 32)
textX = 10
textY = 10
# gameover text
over_font = pygame.font.Font('freesansbold.ttf', 70)
def show_score(x, y):
score = font.render("Score: " + str(score_value), True, (255, 255, 255))
screen.blit(score, (x, y))
def game_over_text():
over_text = over_font.render("GAME OVER!", True, (255, 0, 0))
screen.blit(over_text, (200, 250))
def player(x, y):
screen.blit(playerimg, (x, y))
def enemy(x, y, i):
screen.blit(enemy_img[i], (x, y))
def fire_bullet(x, y):
global bullet_state
bullet_state = "fire"
screen.blit(bulletimg, (x + 25, y + 10))
def iscollision(enemyX, enemyY, bulletX, bulletY):
distance = math.sqrt(math.pow(enemyX - bulletX, 2) + math.pow(enemyY - bulletY, 2))
if distance < 30:
return True
else:
return False
# gameloop
running = True
while running:
# RGB screen
screen.fill((0, 0, 0))
screen.blit(background, (0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Check keystroke left or right
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
playerX_change = -10
if event.key == pygame.K_RIGHT:
playerX_change = 10
if event.key == pygame.K_SPACE:
if bullet_state is "ready":
bullet_sound = mixer.Sound('shoot.wav')
bullet_sound.play()
# gets the current x cor of the player
bulletX = playerX
fire_bullet(bulletX, bulletY)
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
playerX_change = 0
if event.key == pygame.K_RIGHT:
playerX_change = 0
playerX += playerX_change
if playerX <= 0:
playerX = 0
elif playerX >= 736:
playerX = 736
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] *= -1
enemyY[i] += enemyY_change[i]
elif enemyX[i] >= 736:
enemyX_change[i] *= -1
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 += 1
# print(score)
enemyX[i] = random.randint(0, 735)
enemyY[i] = random.randint(50, 300)
enemy(enemyX[i], enemyY[i], i)
# if enemyY <= 50:
# enemyY_change *= -1
# elif enemyY >= 300:
# enemyY_change *= -1
if bulletY <= 0:
bulletY = 480
bullet_state = "ready"
if bullet_state is "fire":
fire_bullet(bulletX, bulletY)
bulletY -= bulletY_change
player(playerX, playerY)
show_score(textX, textY)
pygame.display.update()
推荐答案
致电 convert()
在背景图像上.这确保图像具有与显示 Surface 相同的像素格式,并将有助于 blit
以最佳性能运行:
Call convert()
on the background image. That ensures that the image has the same pixel format as the display Surface and will help blit
to operate with optimal performance:
screen = pygame.display.set_mode((800, 600))
background = pygame.image.load('background.png').convert()
请注意,如果表面的格式与显示器的格式不同,则 blit
必须在每一帧中动态转换格式.
Note, if the surface has a different format than the display, then blit
has to convert the format on the fly in every frame.
这篇关于为什么我用 Pygame 制作的游戏突然卡顿了几秒?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!