Попытка отложить заданную c функцию для появления врага через определенное время - PullRequest
3 голосов
/ 24 апреля 2020

Я делаю игру в стрелялки с использованием pygame. Я хочу, чтобы моя родинка появлялась в случайном положении каждые 1 секунду. Я попытался использовать time.sleep (1.0), но это задерживает весь мой код, и поэтому игра не работает должным образом из-за задержек ответов. Я перемещаю цель с помощью мыши (которая также зависит от времени. Сна), к которой я буду добавлять щелчок, чтобы стрелять. Мне нужна помощь с задержкой и нерестом родинки. Я также хотел бы высказать несколько мнений о том, как организовать свой код для обеспечения различных уровней сложности, а также главное меню в дальнейшем.

import pygame
import random
import time
from threading import Timer

pygame.font.init()



win_width = 1000
win_height = 710

FPS = 60


screen = pygame.display.set_mode((win_width, win_height))

pygame.display.set_caption("Mole Shooter")



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



counter, text = 30, 'Time Left: 30'.rjust(3)
pygame.time.set_timer(pygame.USEREVENT, 1000)

font = pygame.font.Font('freesansbold.ttf', 32)



run = True
clock = pygame.time.Clock()
background = pygame.transform.scale(pygame.image.load('back_land.png'), (win_width, win_height))

aim = pygame.image.load("aim.png")
mole = pygame.image.load("mole.png")


def mole_spawn_easy():

    molex = random.randint(50, 950)
    moley = random.randint(450, 682)

    screen.blit(mole, (molex, moley))


while run:
    screen.blit(background, [0,0])
    ax, ay = pygame.mouse.get_pos()

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

        if event.type == pygame.USEREVENT:
            counter -= 1
            text = ("Time Left: " + str(counter)).rjust(3)
            if counter > 0:
                time.sleep(1.0);mole_spawn_easy()

            else:
                print("game over")
                break



    screen.blit(aim, ((ax - 32 ),(ay - 32)))



    screen.blit(font.render(text, True, (0, 0, 0)), (32, 48))

    clock.tick(FPS)

    pygame.display.flip()

1 Ответ

3 голосов
/ 24 апреля 2020

Создайте список из moles и добавьте случайную позицию в список в mole_spawn_easy:

moles = []

def mole_spawn_easy():
    molex = random.randint(50, 950)
    moley = random.randint(450, 682)
    moles.append((molex, moley))

Нарисуйте moles в главном приложении l oop:

while run:
    # [...]

    for pos in moles:
        screen.blit(mole, pos)

pygame.time.set_timer для многократного создания события в очереди событий. Время должно быть задано в миллисекундах:

pygame.time.set_timer(pygame.USEREVENT, 1000) # 1 second

См. Пример:

moles = []

def mole_spawn_easy():
    molex = random.randint(50, 950)
    moley = random.randint(450, 682)
    moles.append((molex, moley))

pygame.time.set_timer(pygame.USEREVENT, 1000)

while run:

    ax, ay = pygame.mouse.get_pos()

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

        if event.type == pygame.USEREVENT:
            counter -= 1
            text = ("Time Left: " + str(counter)).rjust(3)
            if counter > 0:
                mole_spawn_easy()
            else:
                print("game over")

    screen.blit(background, [0,0])

    for pos in moles:
        screen.blit(mole, pos)
    screen.blit(aim, ((ax - 32 ),(ay - 32)))
    screen.blit(font.render(text, True, (0, 0, 0)), (32, 48))

    pygame.display.flip()
    clock.tick(FPS)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...