Как закодировать заглушку таймера игры после попадания в спрайт в pygame? Почему мой таймер работает, хотя я все еще в главном меню? - PullRequest
1 голос
/ 09 февраля 2020

У меня 2 проблемы. Во-первых, я не знаю, что кодировать, чтобы таймер останавливался после нажатия на спрайт. Я хотел бы, чтобы таймер оставался в указанное время, когда я нажал на спрайт, но код, который я создал ранее, установил таймер go в ноль. Во-вторых, таймер уже работает в «главном меню» моей игры, поэтому, когда я начинаю игру поздно, таймер не запускается с нуля. вот весь код, который я сделал

# initialization of pygame
import pygame
import random
import math


pygame.init()

# creating the display
display = pygame.display.set_mode((500, 500))

# title & icon
spaceship = pygame.image.load("Space Blitz Sprites/spaceship.png")
pygame.display.set_icon(spaceship)
pygame.display.set_caption("SpaceBlitz")

# main menu sprites
spaceblitz = pygame.image.load("Space Blitz Sprites/spaceblitz.png")
play = pygame.image.load("Space Blitz Sprites/play.png")
howtoplay = pygame.image.load("Space Blitz Sprites/howtoplay.png")
about = pygame.image.load("Space Blitz Sprites/about.png")
quit = pygame.image.load("Space Blitz Sprites/quit.png")

# inside main menu
instruction = pygame.image.load("Space Blitz Sprites/instruction.png")
back = pygame.image.load("Space Blitz Sprites/back.png")
aboutdev = pygame.image.load("Space Blitz Sprites/aboutdev.png")

# main menu music
music = pygame.mixer.music.load("Space Blitz Sprites/mountaintrails.mp3")

# PlayerSpriteMovement
playerimg = pygame.image.load("Space Blitz Sprites/spaceship.png")
playerX = 250
playerY = 400
velocity = 3
clock = pygame.time.Clock()

# Bullet
bulletimg = pygame.image.load("Space Blitz Sprites/bullet.png")
bulletX = 0
bulletY = playerY
bulletx_change = 0
bulletY_change = 8
bullet_state = "ready"

# Asteroid
asteroidimg = []
asteroidX = []
asteroidY = []
asteroidX_change = []
asteroidY_change = []
no_of_enemies = 10

score = 0

# Game Over Text
overfont = pygame.font.Font('freesansbold.ttf',32)


def mainmenu():
    global menuselect
    global spaceblitz
    menu = True
    pygame.mixer.music.play(50)
    pygame.mixer.music.set_volume(0.2)
    while menu:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    pos = pygame.mouse.get_pos()
                    if start.collidepoint(pos):
                        menu = False
                        menuselect = 1
                        pygame.mixer.music.stop()
                    if controls.collidepoint(pos):
                        menu = False
                        menuselect = 2
                        pygame.mixer.music.stop()
                    if developer.collidepoint(pos):
                        menu = False
                        menuselect = 3
                        pygame.mixer.music.stop()
                    if exit.collidepoint(pos):
                        menu = False
                        menuselect = 4

        display.fill((0, 0, 0))
        display.blit(spaceblitz, (170,150))
        start = display.blit(play, (170,250))
        controls = display.blit(howtoplay, (170,300))
        developer = display.blit(about, (170,350))
        exit = display.blit(quit, (170,400))
        pygame.display.flip()
        pygame.display.update()

def controls():
    global menuselect
    global menu
    controls = True
    while controls:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    pos = pygame.mouse.get_pos()
                    if balik.collidepoint(pos):
                        controls = False
                        menu = True
                        menuselect = 0
        balik = display.blit(back, (0,450))
        display.blit(instruction, (0,0))
        pygame.display.flip()
        pygame.display.update()
        display.fill((0, 0, 0))

def developers():
    global menuselect
    global menu
    dev = True
    while dev:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    pos = pygame.mouse.get_pos()
                    if balik.collidepoint(pos):
                        dev = False
                        menu = True
                        menuselect = 0
        balik = display.blit(back, (0, 450))
        display.blit(aboutdev, (0, 0))
        pygame.display.flip()
        pygame.display.update()
        display.fill((0, 0, 0))
# Asteroid
for r in range(no_of_enemies):
    asteroidimg.append(pygame.image.load("Space Blitz Sprites/asteroid.png"))
    asteroidX.append(random.randint(0, 468))
    asteroidY.append(random.randint(-300, -30))
    asteroidX_change.append(0)
    asteroidY_change.append(2)


# Sprite image
def player(x, y):
    display.blit(playerimg, (x, y))

def fire_bullet(x, y):
    global bullet_state
    bullet_state = "fire"
    display.blit(bulletimg, (x + 9, y + -7))


def asteroid(x, y, r):
    display.blit(asteroidimg[r], (x, y))


def BulCollision(asteroidX, asteroidY, bulletX, bulletY):
    buldistance = math.sqrt((math.pow(bulletX - asteroidX, 2)) + (math.pow(bulletY - asteroidY, 2)))
    if buldistance < 27:
        return True
    else:
        return False
def PlayCollision(asteroidX, asteroidY, playerX, playerY):
    playdistance = math.sqrt((math.pow(playerX - asteroidX, 2)) + (math.pow(playerY - asteroidY, 2)))
    if playdistance < 27:
        return True
    else:
        return False

def gameover_screen():
    overtext = overfont.render("GAME OVER",True,(255,255,255))
    display.blit(overtext, (150,250))


# mainloop
def gamewindow():
    global menuselect
    global playerX
    global playerY
    global velocity
    global clock
    global bulletX
    global bulletY
    global bulletY_change
    global bullet_state
    global asteroidX
    global asteroidY
    global asteroidY_change
    global no_of_enemies
    global score
    global dev
    global menu
    running = True
    while running:
        clock.tick(60)
        display.fill((0, 0, 0))
        # movement
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    pos = pygame.mouse.get_pos()
                    if balik.collidepoint(pos):
                        running = False
                        menu = True
                        menuselect = 0
        balik = display.blit(back, (0, 450))

        # player movement
        keys = pygame.key.get_pressed()
        if keys[pygame.K_a]:
            playerX -= velocity

        if keys[pygame.K_d]:
            playerX += velocity

        if keys[pygame.K_s]:
            playerY += velocity

        if keys[pygame.K_w]:
            playerY -= velocity
        if keys[pygame.K_SPACE]:
            if bullet_state is "ready":
                bulletX = playerX
                fire_bullet(bulletX, bulletY)
        # Border
        if playerX <= 0:
            playerX = 0
        elif playerX >= 468:
            playerX = 468
        if playerY <= 0:
            playerY = 0
        elif playerY >= 468:
            playerY = 468

        # bullet movement

        if bullet_state is "fire":
            fire_bullet(bulletX, bulletY)
            bulletY -= bulletY_change

        if bulletY <= 0:
            bulletY = playerY
            bullet_state = "ready"

        # Bullet Collision
        for r in range(no_of_enemies):
            asteroidY[r] += asteroidY_change[r]
            if asteroidY[r] >= 500:
                asteroidY[r] = random.randint(-300, -30)
                asteroidX[r] = random.randint(0, 468)
            Bulletcollision = BulCollision(asteroidX[r], asteroidY[r], bulletX, bulletY)

            if Bulletcollision:
                bulletY = playerY
                bullet_state = "ready"
                asteroidX[r] = random.randint(0, 468)
                asteroidY[r] = random.randint(-300, -30)
                score += 1
                print(score)
            asteroid(asteroidX[r], asteroidY[r], r)
            # Game over
            PlayerCollision = PlayCollision(asteroidX[r], asteroidY[r], playerX, playerY)

            if PlayerCollision:
                for j in range(no_of_enemies):
                    asteroidY_change[j] = 0
                velocity = 0

                gameover_screen()
                break

        font = pygame.font.Font(None, 54)
        font_color = pygame.Color('springgreen')
        passed_time = 0
        timer_started = True
        if timer_started:
            passed_time = pygame.time.get_ticks()

        text = font.render(str(passed_time / 1000), True, font_color)
        display.blit(text, (50, 50))

        player(playerX, playerY)
        pygame.display.update()

mainmenu()
while True:
        if menuselect == 0:
            mainmenu()
        elif menuselect == 1:
            gamewindow()
        elif menuselect == 2:
            controls()
        elif menuselect == 3:
            developers()
        elif menuselect == 4:
            pygame.quit()

Вот код о таймере.

font = pygame.font.Font(None, 54)
font_color = pygame.Color('springgreen')
passed_time = 0
timer_started = True
if timer_started:
    passed_time = pygame.time.get_ticks()

text = font.render(str(passed_time / 1000), True, font_color)
display.blit(text, (50, 50))

player(playerX, playerY)
pygame.display.update()

Вот код, который я пробовал, но он просто вернул таймер go к нулю .

font = pygame.font.Font(None, 54)
font_color = pygame.Color('springgreen')
passed_time = 0
timer_started = True
if timer_started:
    passed_time = pygame.time.get_ticks()
if PlayerCollision:
    passed_time = False
text = font.render(str(passed_time / 1000), True, font_color)
display.blit(text, (50, 50))

player(playerX, playerY)
pygame.display.update()

1 Ответ

0 голосов
/ 09 февраля 2020

pygame.time.get_ticks():

Возвращает количество миллисекунд с момента вызова pygame.init().

Вы должны получить время, когда игра начинается (start_time). В основной игре l oop вы должны получить текущее время (current_time) и вычесть время начала из текущего времени, чтобы получить время, прошедшее с начала игры. Прекратите вычислять прошедшее время, когда игра закончится:

def gamewindow():
    # [...]

    start_time = pygame.time.get_ticks()
    run_timer = True
    running = True
    while running:
        # [...]

        for r in range(no_of_enemies):
            # [...]

            if PlayerCollision:

                # stop timer
                run_timer = False

                # [...]

        # [...]

        if run_timer:
            current_time = pygame.time.get_ticks()
            passed_time = current_time - start_time

        text = font.render(str(passed_time / 1000), True, font_color)
        display.blit(text, (50, 50))

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