Как остановить цикл событий в Pygame после достижения максимального количества целей? - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь завершить цикл событий, когда количество выбранных целей достигло того же значения, что и переменная NoOfTargets (в данном примере 10).

Я думал, что с момента цикла событийобрабатывает все события Pygame, я решил проверить, чтобы увидеть, совпадает ли количество с NoOfTargets.счетчик изначально установлен на 0. При нажатии новой цели добавляется +1 к счету.

            import pygame
            import random
            import math
            pygame.init()

            display_width = 800
            display_height = 600
            NoOfTargets = 10
            Target_radius = 10
            Frames_Per_Second = 60

            black = (0,0,0)
            white = (255,255,255)
            red = (255,0,0)

            def Target(Targetx, Targety , Targetr, colour):
                pygame.draw.circle(gameDisplay, colour, [Targetx, Targety], Targetr)
                pygame.display.update()

            def Pythagoras_Calculator(Target_x, Target_y, Mouse_X, Mouse_Y, Radius):
                Side = pow((Target_x-Mouse_X), 2) + pow((Target_y-Mouse_Y), 2)
                Distance = math.sqrt(Side)
                if Distance > Radius:
                    return False
                else:
                    return True

            def Get_Event_Time(GameTime):
                ListOfClickTime = []
                ListOfClickTime.append(GameTime)
                for x in range(len(ListOfClickTime)):
                    print(ListOfClickTime[x])

            ##    ListOfTime = []
            ##    TimeAtEventClick = pygame.time.get_ticks()
            ##    print("Time at event click", TimeAtEventClick)
            ##    print("Game Time:", GameTime)
            ##    TimeBetweenEvent = TimeAtEventClick-GameTime
            ##    print("Time between event", TimeBetweenEvent)
            ##    ListOfTime.append(int(TimeBetweenNewEvent))

            def Test(GameTime):
                print("Time Between EVENTS:",GameTime)

            gameDisplay = pygame.display.set_mode((display_width, display_height))
            pygame.display.set_caption("XD machine")
            clock = pygame.time.Clock()
            x = (display_width * 0.45)
            y = (display_height * 0.8)


            gameDisplay.fill(white)
            pygame.display.update()

            Random_x = random.randrange(0, display_width-Target_radius)
            Random_y = random.randrange(0, display_height-Target_radius)

            GameEnded = False
            while not GameEnded:
                count = 0
                Target(Random_x, Random_y, Target_radius, red)

                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        pygame.quit
                        quit()

                    elif count == NoOfTargets:
                        GameEnded = False
                        pygame.quit()

                    elif event.type == pygame.MOUSEBUTTONDOWN:
                        Mouse_X, Mouse_Y = event.pos
                        #GameTime = pygame.time.get_ticks()#Gets the time in milliseconds.
                        #Test(GameTime)
                        OnTarget = Pythagoras_Calculator(Random_x, Random_y, Mouse_X, Mouse_Y, Target_radius)
                        print(Mouse_X, Mouse_Y, OnTarget)
                        print(Random_x, Random_y)
                        if OnTarget == True:
                            count =+ 1
                            Random_x = random.randrange(0, display_width)
                            Random_y = random.randrange(0, display_height)
                            gameDisplay.fill(white)
                            pygame.display.update()
                            Target(Random_x, Random_y, Target_radius, red)
                            GameTime = pygame.time.get_ticks()
                            Get_Event_Time(GameTime)



            """if __name__ == "__Main__":
                pygame.init()
                Main()
                pygame.quit()
                quit()"""

Я хочу, чтобы при подсчете, который записывает, сколько целей было нажато,быть таким же, как NoOfTargets, так что EventLop будет сломан, и игра остановится.Пожалуйста, помогите мне я новичок в Pygame.

1 Ответ

0 голосов
/ 10 февраля 2019

Внутри цикла count постоянно установлен 0. count = 0 должно быть сделано до основного цикла, а не внутри цикла:

count = 0
while not GameEnded:
    Target(Random_x, Random_y, Target_radius, red)

count =+ 1 не делает то, что вы ожидаетеэто делать.= + 1 назначит 1 на count.Примечание = - это присвоение, а + - просто положительный знак для значения.Инкрементное присваивание равно +=, а не =+:

if OnTarget == True:
    count += 1

Оценка того, превысил ли count предел, лучше выполнять вне цикла обработки событий.Обратите внимание, что цикл событий выполняется только в том случае, если событие происходит.
Если игра должна закончиться, тогда GameEnded должно быть установлено True вместо False.

if count == NoOfTargets:
    GameEnded = True

Кроме того, не выполняйте рисование в цикле событий:

GameEnded = False
count = 0
while not GameEnded:
    Target(Random_x, Random_y, Target_radius, red)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit
            quit() 

        elif event.type == pygame.MOUSEBUTTONDOWN:
            Mouse_X, Mouse_Y = event.pos
            OnTarget = Pythagoras_Calculator(Random_x, Random_y, Mouse_X, Mouse_Y, Target_radius)
            print(Mouse_X, Mouse_Y, OnTarget)
            print(Random_x, Random_y)
            if OnTarget == True:
                count += 1
                Random_x = random.randrange(0, display_width)
                Random_y = random.randrange(0, display_height)
                GameTime = pygame.time.get_ticks()
                Get_Event_Time(GameTime)

    if count == NoOfTargets:
        GameEnded = True

    gameDisplay.fill(white)
    Target(Random_x, Random_y, Target_radius, red)
    pygame.display.update()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...