почему кнопка выхода из окна работает, а кнопка выхода в игре не работает?

avatar
desrocket
26 марта 2019 в 00:57
117
1
1

Я создаю меню "Пуск" для своей игры, но когда я нажимаю кнопку выхода, которую я сделал в меню "Пуск", оно не закрывается. Что-то не так с моим кодом?

Я пытался сделать функцию для выхода, вставил ее в код выхода из игры с помощью кнопки выхода из окна, но ничего не сработало.

import pygame
import os
pygame.mixer.pre_init()
pygame.mixer.init(44100, 16, 2, 262144)
pygame.init()
from pygame.locals import*


pygame.mixer.music.load(os.path.join(os.getcwd(), 'Sounds', 
'intro.ogg'))
pygame.mixer.music.set_volume(0.3)
pygame.mixer.music.play(-1)  

FPS = 60
white = (255,255,255)
grey = (128,128,128)
black = (0,0,0)
red = (255,0,0)
orange = (255,128,0)
yellow = (255,255,0)
green = (0,255,0)
Lgreen = (128,255,0)
blue = (0,0,255)
Lblue = (0,255,255)
purple = (255,0,255)
pink = (255,0,127)

pygame.display.set_caption('Snake Universe')
Title = pygame.image.load('Graphics/Title.png')
Play = pygame.image.load('Graphics/Play.png')
Option = pygame.image.load('Graphics/Option.png')
Exit = pygame.image.load('Graphics/Exit.png')
LinePX = pygame.image.load('Graphics/LinePX.png')
LineO = pygame.image.load('Graphics/LineO.png')
clock = pygame.time.Clock()
movie = pygame.movie.Movie('Video/bg.mpg')
screen = pygame.display.set_mode((1280, 720))
bgE = pygame.image.load('Graphics/transparent.png')
movie_screen = pygame.Surface(movie.get_size()).convert()


movie.set_display(movie_screen)
movie.play()


y = 235
y1 = 3000



cnt = 0
playing = True
while playing:
    cnt+=1
    if cnt>=1870:
        cnt=0
        movie.rewind()
        movie.play()
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key==pygame.K_RETURN:
                if y == 426:
                    movie.stop()
                    playing = False
                    pygame.quit()
                    quit()      
            if event.key == pygame.K_UP:
                y += 1
                if y == 3236:
                    y = 235
                    y1 = 3000
                if y == 236:
                    y = 425
                    y1 = 3000
                if y == 426:
                    y1 =335
                    y = 3235

            if event.key == pygame.K_DOWN:
                y += 1
                if y == 236:
                    y = 3235
                    y1 = 335
                if y == 3236:
                    y1 = 3000
                    y = 425
                if y == 426:
                    y1 = 3000
                    y = 235

            if event.type == pygame.QUIT:
                movie.stop()
                playing = False
                pygame.quit()
                quit()

   screen.blit(movie_screen,(0, 0))
   screen.blit(Title, (360, 0))
   screen.blit(Play, (460, 250))
   screen.blit(Exit, (460, 450))
   screen.blit(LinePX, (482.5, y))
   screen.blit(LineO, (482.5, y1))
   screen.blit(Option, (460, 350))
   screen.blit(bgE, (-100, 0))
   pygame.display.update()
   clock.tick(FPS)

я ожидал, что он закроет окно, но вместо этого он ничего не делает.

Источник
Kingsley
26 марта 2019 в 01:16
0

Из небольшого участка кода не совсем понятно, что происходит. Как обрабатывается событие нажатия кнопки в основном цикле? Возможно, когда активируется код выхода, post событие pygame.QUIT возвращается в основной цикл, например: pygame.event.post( pygame.QUIT, {} ).

desrocket
26 марта 2019 в 01:45
0

я обновил свой код

import random
26 марта 2019 в 04:38
0

Что делает функция quitgame()? если он устанавливает playing = False аналогично тому, как вы обрабатываете событие pygame.QUIT, он должен работать. Кроме того, вы ловите нажатие клавиши Enter на клавиатуре, вместо этого вам может понадобиться pygame.K_RETURN. Создание минимального воспроизводимого примера облегчит ответ на ваш вопрос.

Ответы (1)

avatar
Rabbid76
26 марта 2019 в 05:54
2

Основной цикл выполняется до тех пор, пока playing равно True.

playing = True
while playing:
    # [...]

При обработке события pygame.QUIT устанавливается playing False условие основного цикла не выполняется:

if event.type == pygame.QUIT:
    playing = False
    # [...]

Примечание: pygame.quit() не прерывает цикл, но деинициализирует все модули pygame, что вызовет исключение в следующем, если это будет сделано в середине приложения.

Если вы хотите выйти из приложения с помощью клавиши ввода на клавиатуре pygame.K_KP_ENTER, вы должны сделать то же самое при обработке события pygame.KEYDOWN:

if event.type == pygame.KEYDOWN:
    if event.key==pygame.K_KP_ENTER:
        playing = False

Или вы должны отправить событие pygame.QUIT от pygame.event.post():

if event.type == pygame.KEYDOWN:
    if event.key==pygame.K_KP_ENTER:
        pygame.event.post(pygame.event.Event(pygame.QUIT))
desrocket
26 марта 2019 в 12:48
0

вы правы, но я удалил некоторый код, который определяет, где находится y, когда я нажимаю Enter, и заставляю его делать то, что я хочу. Я обнаружил, что мой код обнаружения y не работает с клавишей ввода. Например, когда я заставил его напечатать случайный текст. это не напечатало бы это.

desrocket
26 марта 2019 в 13:32
0

нет, даже с y >= 426 это все равно не работает. Почему с детектором y работают только клавиши вверх и вниз, а ввод — нет?

desrocket
26 марта 2019 в 22:22
0

удаление y += 1 заставит прокрутку клавиши со стрелкой двигаться в противоположном направлении. Это связано с тем, что при нажатии клавиши со стрелкой она соответствует всем значениям и заставляет их идти в том порядке, в котором, с точки зрения человека, они идут назад.

desrocket
26 марта 2019 в 22:34
0

это сработало, я нашел проблему и исправил ее, спасибо.