Как закончить al oop, снаружи l oop in python - PullRequest
2 голосов
/ 25 мая 2020

Я делаю игру pygame с python 3.8.3. В моей игре у меня есть стартовый экран, который находится внутри него, а l oop:

def game_intro(): 
    intro = True 
    mixer.music.load("musicIntro.mp3")
    mixer.music.set_volume(0.02) 
    mixer.music.play(-1) 
    while intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: 
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN:
                    intro = False
        screen.blit(startscherm_img, bordrect) 
        clock.tick(30)
        button("Start",302,517,94,44,donkerOranje,lichtOranje,"start")
        button("Music",553,517,94,44,donkerOranje,lichtOranje,"toggleMusic")
        button("Quit",803,517,94,44,donkerOranje,lichtOranje,"quit")
        pygame.display.flip() 
game_intro()

Я звоню для своего функция кнопки, которую я определил выше:

def button(msg,x,y,w,h,ic,ac,action=None): 
    mousePos = pygame.mouse.get_pos() 
    click = pygame.mouse.get_pressed() 
    if x+w > mousePos[0] > x and y+h > mousePos[1] > y: 
        pygame.draw.rect(screen, ac, (x,y,w,h)) 
        if click[0] == 1 and action != None: 
            if action == "toggleMusic": 
                PAUSE.toggle()
                time.sleep(0.3)
            elif action == "quit": 
                pygame.quit()
                time.sleep(0.3)
            elif action == "start": 
                time.sleep(0.3)
                intro = False
    else:
        pygame.draw.rect(screen, ic, (x,y,w,h)) 

    smallText = pygame.font.SysFont("Bauhaus 93",30)
    textSurf, textRect = text_objecten(msg, smallText)
    textRect.center = ( (x+(w/2)), (y+(h/2)) )
    screen.blit(textSurf, textRect)

Она в основном просто проверяет щелчок мышью в определенной области и, если обнаруживает, что выполняет код.

Теперь на моем начальном экране я есть кнопка запуска, я бы хотел, чтобы она завершила game_intro () l oop, однако попытка intro = False ни к чему не приводит. попытка break не работает, так как это должно быть в самом l oop.

Итак, мой вопрос: как мне заставить эту кнопку запуска действительно завершить game_intro () l oop ?

PS Я новичок в Python

Ответы [ 4 ]

2 голосов
/ 25 мая 2020

Насколько я понимаю, вы устанавливаете intro = False внутри функции button, но у вас также есть переменная с именем intro внутри функции game_intro. Несмотря на то, что они имеют одно и то же имя, Python рассматривает их как отдельные переменные.

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

Вариант 1:

intro = True

def button(msg,x,y,w,h,ic,ac,action=None): 
    global intro
    mousePos = pygame.mouse.get_pos() 
    click = pygame.mouse.get_pressed() 
    if x+w > mousePos[0] > x and y+h > mousePos[1] > y: 
        pygame.draw.rect(screen, ac, (x,y,w,h)) 
        if click[0] == 1 and action != None: 
            if action == "toggleMusic": 
                PAUSE.toggle()
                time.sleep(0.3)
            elif action == "quit": 
                pygame.quit()
                time.sleep(0.3)
            elif action == "start": 
                time.sleep(0.3)
                intro = False

def game_intro(): 
    global intro
    mixer.music.load("musicIntro.mp3")
    mixer.music.set_volume(0.02) 
    mixer.music.play(-1) 
    while intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: 
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN:
                    intro = False
        screen.blit(startscherm_img, bordrect) 
        clock.tick(30)
        button("Start",302,517,94,44,donkerOranje,lichtOranje,"start")
        button("Music",553,517,94,44,donkerOranje,lichtOranje,"toggleMusic")
        button("Quit",803,517,94,44,donkerOranje,lichtOranje,"quit")
        pygame.display.flip() 
game_intro()

Вариант 2:

def button(msg,x,y,w,h,ic,ac, intro, action=None): 
    mousePos = pygame.mouse.get_pos() 
    click = pygame.mouse.get_pressed() 
    if x+w > mousePos[0] > x and y+h > mousePos[1] > y: 
        pygame.draw.rect(screen, ac, (x,y,w,h)) 
        if click[0] == 1 and action != None: 
            if action == "toggleMusic": 
                PAUSE.toggle()
                time.sleep(0.3)
            elif action == "quit": 
                pygame.quit()
                time.sleep(0.3)
            elif action == "start": 
                time.sleep(0.3)
                intro = False
    return intro

def game_intro(): 
    intro = True
    mixer.music.load("musicIntro.mp3")
    mixer.music.set_volume(0.02) 
    mixer.music.play(-1) 
    while intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: 
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN:
                    intro = False
        screen.blit(startscherm_img, bordrect) 
        clock.tick(30)
        intro = button("Start",302,517,94,44,donkerOranje,lichtOranje,intro,"start")
        intro = button("Music",553,517,94,44,donkerOranje,lichtOranje,intro,"toggleMusic")
        intro = button("Quit",803,517,94,44,donkerOranje,lichtOranje,intro,"quit")
            pygame.display.flip() 
game_intro()
2 голосов
/ 25 мая 2020

Вы можете сделать OOP. Попробуйте создать его внутри класса следующим образом:

class Intro:

  def __init__(self):
    self.intro = True

  def game_intro(self): 
    mixer.music.load("musicIntro.mp3")
    mixer.music.set_volume(0.02) 
    mixer.music.play(-1) 
    while self.intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: 
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN:
                    self.intro = False
        screen.blit(startscherm_img, bordrect) 
        clock.tick(30)
        button("Start",302,517,94,44,donkerOranje,lichtOranje,"start")
        button("Music",553,517,94,44,donkerOranje,lichtOranje,"toggleMusic")
        button("Quit",803,517,94,44,donkerOranje,lichtOranje,"quit")
        pygame.display.flip() 

  def button(self, msg,x,y,w,h,ic,ac,action=None): 
    mousePos = pygame.mouse.get_pos() 
    click = pygame.mouse.get_pressed() 
    if x+w > mousePos[0] > x and y+h > mousePos[1] > y: 
        pygame.draw.rect(screen, ac, (x,y,w,h)) 
        if click[0] == 1 and action != None: 
            if action == "toggleMusic": 
                PAUSE.toggle()
                time.sleep(0.3)
            elif action == "quit": 
                pygame.quit()
                time.sleep(0.3)
            elif action == "start": 
                time.sleep(0.3)
                self.intro = False


obj = Intro()
start = obj.gameintro()

intro определяется внутри экземпляра с помощью self, поэтому его можно вызывать где угодно внутри класса.

0 голосов
/ 25 мая 2020

События потоковой передачи

Назначьте глобальную переменную области (вне двух функций) как экземпляр threading.Event.

Затем установите и очистите это событие, когда вы хотите управлять l oop.

import threading


do_intro_loop = threading.Event


def button(action=None):
  if action == "start":
    do_intro_loop.clear()

def into():
  do_intro_loop.set()
  while do_intro_loop.is_set():
    # show do intro stuff here
    pass

intro()
0 голосов
/ 25 мая 2020

Все, хотя я не делал python какое-то время, вы можете попробовать запустить свой l oop как новый поток, а затем убить его один раз fini sh как поток вручную со всей честностью, установка intro на false должна сработать Сначала я бы сделал некоторую отладку, чтобы действительно проверить, установлено ли для intro значение false. Хотя после прочтения вашего кода я заметил, что вы на самом деле дважды вызываете функцию game_intro (), что приведет к l oop, поскольку переменная intro определена сбоку от функции, поэтому вызов функции game_intro () сбросит l oop так что, возможно, удалите вызов в конце, так как он у вас уже есть через некоторое время l oop. Другой вариант - определить переменную intro вне функции приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...