【发布时间】:2021-03-24 17:51:08
【问题描述】:
我正在制作一个游戏,你是猫,你必须在太空中躲避小行星(不要问)。游戏运行得非常好,我什至实现了评分系统。但是由于某种原因,每当我停止在 pygame 窗口中移动光标(我没有在游戏窗口中左右移动鼠标)时,它都会冻结并变得非常滞后。有谁知道怎么回事!?帮助! - 请!!
这是一个例子: https://www.youtube.com/watch?v=QJJDxZE_kbU
代码:
# Import modules and initialize
import pygame as p
import sys
import random
p.init()
# Define variables
player_movement = 0
GRAVITY = 0.25
asteroid_height = [300, 100, 400, 200]
score = 0
high_score = 0
game_font = p.font.Font('fonts/PressStart2P-Regular.ttf',20)
game_active = True
# Make some functions
def create_asteroid():
random_asteroid_pos = random.choice(asteroid_height)
new_asteroid = asteroid_surface.get_rect(midtop = (650, random_asteroid_pos))
return new_asteroid
def move(asteroids):
for asteroid in asteroids:
asteroid.centerx -= 5
return asteroids
def draw(asteroids):
for asteroid in asteroids:
sc.blit(asteroid_surface, asteroid)
def collision(asteroids):
for asteroid in asteroids:
if player_rect.colliderect(asteroid):
hit_sound.play()
return False
if player_rect.top <= -100 or player_rect.bottom >= 750:
return False
return True
def display_score(game_state):
if game_state == 'in_game':
score_surface = game_font.render(f'Score: {int(score)}',True, (255,255,255))
score_rect = score_surface.get_rect(center = (110, 30))
sc.blit(score_surface, score_rect)
elif game_state == 'game_over':
high_score_surface = game_font.render(f'High Score: {int(high_score)}',True, (255,255,255))
high_score_rect = high_score_surface.get_rect(center = (320, 370))
sc.blit(high_score_surface, high_score_rect)
def update_score(score, high_score):
if score > high_score:
high_score = score
return high_score
# Make a screen
sc = p.display.set_mode((700, 700))
# Make a backround
bg = p.image.load('images/backround.png')
bg = p.transform.scale2x(bg)
# Import character
ship = p.image.load('images/ship.png').convert()
# Import asteroid
asteroid_surface = p.image.load('images/asteroid.png').convert()
# Asteroid logic
asteroid_list = []
SPAWN = p.USEREVENT
p.time.set_timer(SPAWN, 2500)
# Hitbox variables
player_rect = ship.get_rect(center = (100, 350))
# Sound FX
jump_sound = p.mixer.Sound('sound/jump.wav')
hit_sound = p.mixer.Sound('sound/impact.wav')
# Begin code logic
while True:
# Make the game exit cleanly
for event in p.event.get():
if event.type == p.QUIT:
p.quit()
sys.exit()
if event.type == p.KEYDOWN:
if event.key == p.K_SPACE and game_active:
player_movement = 0
player_movement -= 6
jump_sound.play()
if event.type == p.KEYDOWN:
if event.key == p.K_SPACE and game_active == False:
game_active = True
asteroid_list.clear()
player_movement = 0
score = 0
player_rect.center = (100, 350)
if event.type == SPAWN:
asteroid_list.append(create_asteroid())
sc.blit(bg, (0, 0))
if game_active:
player_movement += GRAVITY
player_rect.centery += player_movement
# Draw asteroids and player
sc.blit(ship,player_rect)
asteroid_list = move(asteroid_list)
draw(asteroid_list)
game_active = collision(asteroid_list)
# Score system
score += 0.01
display_score('in_game')
# Game info
info_surface = game_font.render('SPACE to move!',True, (255,255,255))
info_rect = info_surface.get_rect(center = (550, 30))
sc.blit(info_surface, info_rect)
else:
high_score = update_score(score, high_score)
display_score('game_over')
# Make the main menu/game over screen
game_over_surface = game_font.render('Game Over!',True, (255,255,255))
game_over_rect = game_over_surface.get_rect(center = (320, 330))
sc.blit(game_over_surface, game_over_rect)
game_over_surface1 = game_font.render('SPACE to play again!',True, (255,255,255))
game_over_rect1 = game_over_surface1.get_rect(center = (320, 350))
sc.blit(game_over_surface1, game_over_rect1)
p.display.update()
【问题讨论】:
-
您必须将相关代码添加到问题中。怎样才能帮助您在没有看到代码的情况下找到错误?
-
这个问题很可能与Indentation 有关。您需要在应用程序循环而不是事件循环中绘制场景。
-
NateDogg 就像@Rabbid76 所说,你必须在事件循环之外绘制所有内容
-
所以我有一个游戏循环,只有在你不与小行星碰撞时才会绘制角色和小行星。我应该做一个while循环并连续绘制背景吗?我只是在游戏循环中运行后台。
-
非常感谢大家!现在是黄油般的光滑。 :) :) :)
标签: python python-3.x pygame