Как я могу заставить объект исчезнуть в пигме через определенное время? - PullRequest
1 голос
/ 25 апреля 2020

Я пытаюсь сделать простую игру-стрелялку в python с использованием pygame. Логика моей игры c проста, цель появляется на три секунды в случайном месте и затем исчезает. За это время мы должны переместить указатель в сторону цели и нажать пробел. Если координаты бота из них совпадают, тогда мы наберем очко. Вот код

import pygame, sys, time, random
from pygame.locals import *
pygame.init()
disp = pygame.display
win = disp.set_mode((450, 450))
disp.set_caption("Shooter")

#-----------------------------------------------------------------------------------------#
pointer = pygame.image.load('sprites/sprite0.png')
target = pygame.image.load('sprites/sprite1.png')

ptrx = 225
ptry = 225

locx = random.randint(0, 29)
locy = random.randint(0, 29)
points = 0
shot = False
green = (000, 255, 000)

array = [0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150,
         165, 180, 195, 210, 225, 240, 255, 270, 285, 300,
         310, 330, 345, 360, 375, 390, 105, 420, 435]
score = 0
#-----------------------------------------------------------------------------------------#
def showTargetInRandomLoaction():
    global locx
    global locy
    global array

    win.blit(target, (array[locx], array[locy]))

    # Here's the problem

def shoot():
    global shot
    shot = True
    checkIfBulletHasHitTheTarget()


def checkIfBulletHasHitTheTarget():
    global score
    if shot == True:
        bulletPos = (ptrx, ptry)
        targPos = (array[locx], array[locy])
        if bulletPos == targPos:
            print("target hit success !")
            score += 1
            print(f"Your Score - {score}")
            return True

        else:
            print("target hit uncess !")
            return False


def main():
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

            win.fill(green)

            global ptrx
            global ptry
            global shot
            global array
            showTargetInRandomLoaction()

            key = pygame.key.get_pressed()
            left = key[pygame.K_LEFT]
            right=  key[pygame.K_RIGHT]
            up = key[pygame.K_UP]
            down = key[pygame.K_DOWN]
            space = key[pygame.K_SPACE]
            win.blit(pointer, (ptrx, ptry))

            if left and ptrx >= 0:
                ptrx -= 15
            if right and ptrx <= 435:
                ptrx += 15
            if up and ptry >= 0:
                ptry -= 15
            if down and ptry <= 435:
                ptry += 15
            if space:
                shot = True
                shoot()

            disp.update()
#----------------------------------------------------------------------------------------#

if __name__ == '__main__':
    main()

1 Ответ

1 голос
/ 25 апреля 2020

Рекомендую использовать событие таймера. Используйте pygame.time.set_timer() для многократного создания USEREVENT. Например:

time_delay = 3000 # 3 seconds
timer_event = pygame.USEREVENT + 1
pygame.time.set_timer(timer_event, time_delay)

Обратите внимание, в Pygame могут быть определены события клиента. Каждому событию нужен уникальный идентификатор. Идентификаторы для пользовательских событий должны быть между pygame.USEREVENT (24) и pygame.NUMEVENTS (32). В этом случае pygame.USEREVENT+1 является идентификатором события таймера.

Получить события в событии l oop и определить новую случайную позицию при возникновении timer_event:

def main():
    global locx, locy

    time_delay = 3000 # 3 seconds
    timer_event = pygame.USEREVENT + 1
    pygame.time.set_timer(timer_event, time_delay)

    while True:
        for event in pygame.event.get():

            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == timer_event:
                locx = random.randint(0, 29)
                locy = random.randint(0, 29)

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