微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当鼠标不移动时,Pygame 窗口会冻结

如何解决当鼠标不移动时,Pygame 窗口会冻结

我正在制作一个游戏,你是一只猫,你必须在太空中躲避小行星(别问)。游戏运行得非常好,我什至实施了评分系统。但是出于某种原因,每当我停止在 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)}',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!',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!',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!',255))
            game_over_rect1 = game_over_surface1.get_rect(center = (320,350))
            sc.blit(game_over_surface1,game_over_rect1)
        p.display.update()

解决方法

这是Indentation的问题。您必须在应用程序循环而不是事件循环中绘制场景:

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())

    # INDENTATION

    #<--|

    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!',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!',255))
        game_over_rect1 = game_over_surface1.get_rect(center = (320,350))
        sc.blit(game_over_surface1,game_over_rect1)
    p.display.update()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。