добавить секундомер к игре в Pygame - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу добавить секундомер в мою игру.Я планирую изменить этот код и добавить в мою pygame:

Sec += 1
print(str(Min) + " Mins " + str(Sec) + " Sec ")
if Sec == 60:
    Sec = 0
    Min += 1
    print(str(Min) + " Minute")

Должен ли я добавить поле таймера в мою часть def init и создать новое определение для кода таймера?Я хочу использовать таймер, не используя кодовый тик, так как моя игра запускается clock.tick (60), поэтому он не влияет на тик

ОБНОВЛЕНО Так вот мой код игры:

import sys, pygame, random

class Breakout():

def main(self):

    xspeed_init = 6
    yspeed_init = 6
    max_lives = 5
    bat_speed = 30
    score = 0 
    bgcolour = 0x2F, 0x4F, 0x4F  # darkslategrey        
    size = width, height = 640, 480

    pygame.init()            
    screen = pygame.display.set_mode(size)
    #screen = pygame.display.set_mode(size, pygame.FULLSCREEN)

    bat = pygame.image.load("bat.png").convert()
    batrect = bat.get_rect()

    ball = pygame.image.load("ball.png").convert()
    ball.set_colorkey((255, 255, 255))
    ballrect = ball.get_rect()

    pong = pygame.mixer.Sound('Blip_1-Surround-147.wav')
    pong.set_volume(10)        

    wall = Wall()
    wall.build_wall(width)

    # Initialise ready for game loop
    batrect = batrect.move((width / 2) - (batrect.right / 2), height - 20)
    ballrect = ballrect.move(width / 2, height / 2)       
    xspeed = xspeed_init
    yspeed = yspeed_init
    lives = max_lives
    clock = pygame.time.Clock()
    pygame.key.set_repeat(1,30)       
    pygame.mouse.set_visible(0)       # turn off mouse pointer

    while 1:

        # 60 frames per second
        clock.tick(60)

        # process key presses
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    sys.exit()
                if event.key == pygame.K_LEFT:                        
                    batrect = batrect.move(-bat_speed, 0)     
                    if (batrect.left < 0):                           
                        batrect.left = 0      
                if event.key == pygame.K_RIGHT:                    
                    batrect = batrect.move(bat_speed, 0)
                    if (batrect.right > width):                            
                        batrect.right = width

        # check if bat has hit ball    
        if ballrect.bottom >= batrect.top and \
           ballrect.bottom <= batrect.bottom and \
           ballrect.right >= batrect.left and \
           ballrect.left <= batrect.right:
            yspeed = -yspeed                
            pong.play(0)                
            offset = ballrect.center[0] - batrect.center[0]                          
            # offset > 0 means ball has hit RHS of bat                   
            # vary angle of ball depending on where ball hits bat                      
            if offset > 0:
                if offset > 30:  
                    xspeed = 7
                elif offset > 23:                 
                    xspeed = 6
                elif offset > 17:
                    xspeed = 5 
            else:  
                if offset < -30:                             
                    xspeed = -7
                elif offset < -23:
                    xspeed = -6
                elif xspeed < -17:
                    xspeed = -5     

        # move bat/ball
        ballrect = ballrect.move(xspeed, yspeed)
        if ballrect.left < 0 or ballrect.right > width:
            xspeed = -xspeed                
            pong.play(0)            
        if ballrect.top < 0:
            yspeed = -yspeed                
            pong.play(0)               

        # check if ball has gone past bat - lose a life
        if ballrect.top > height:
            lives -= 1
            # start a new ball
            xspeed = xspeed_init
            rand = random.random()                
            if random.random() > 0.5:
                xspeed = -xspeed 
            yspeed = yspeed_init            
            ballrect.center = width * random.random(), height / 3                                
            if lives == 0:                    
                msg = pygame.font.Font(None,70).render("Game Over", True, (0,255,255), bgcolour)
                msgrect = msg.get_rect()
                msgrect = msgrect.move(width / 2 - (msgrect.center[0]), height / 3)
                screen.blit(msg, msgrect)
                pygame.display.flip()
                # process key presses
                #     - ESC to quit
                #     - any other key to restart game
                while 1:
                    restart = False
                    for event in pygame.event.get():
                        if event.type == pygame.QUIT:
                            sys.exit()
                        if event.type == pygame.KEYDOWN:
                            if event.key == pygame.K_ESCAPE:
                                sys.exit()
                            if not (event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT):                                    
                                restart = True      
                    if restart:                   
                        screen.fill(bgcolour)
                        wall.build_wall(width)
                        lives = max_lives
                        score = 0
                        break

        if xspeed < 0 and ballrect.left < 0:
            xspeed = -xspeed                                
            pong.play(0)

        if xspeed > 0 and ballrect.right > width:
            xspeed = -xspeed                               
            pong.play(0)

        # check if ball has hit wall
        # if yes yhen delete brick and change ball direction
        index = ballrect.collidelist(wall.brickrect)       
        if index != -1: 
            if ballrect.center[0] > wall.brickrect[index].right or \
               ballrect.center[0] < wall.brickrect[index].left:
                xspeed = -xspeed
            else:
                yspeed = -yspeed                
            pong.play(0)              
            wall.brickrect[index:index + 1] = []
            score += 10

        screen.fill(bgcolour)
        scoretext = pygame.font.Font(None,40).render(str(score), True, (0,255,255), bgcolour)
        scoretextrect = scoretext.get_rect()
        scoretextrect = scoretextrect.move(width - scoretextrect.right, 0)
        screen.blit(scoretext, scoretextrect)

        for i in range(0, len(wall.brickrect)):
            screen.blit(wall.brick, wall.brickrect[i])    

        # if wall completely gone then rebuild it
        if wall.brickrect == []:              
            wall.build_wall(width)                
            xspeed = xspeed_init
            yspeed = yspeed_init                
            ballrect.center = width / 2, height / 3

        screen.blit(ball, ballrect)
        screen.blit(bat, batrect)
        pygame.display.flip()

class Wall():

    def __init__(self):
        self.brick = pygame.image.load("brick.png").convert()
        brickrect = self.brick.get_rect()
        self.bricklength = brickrect.right - brickrect.left       
        self.brickheight = brickrect.bottom - brickrect.top             

    def build_wall(self, width):        
        xpos = 0
        ypos = 60
        adj = 0
        self.brickrect = []
        for i in range (0, 52):           
            if xpos > width:
                if adj == 0:
                    adj = self.bricklength / 2
                else:
                    adj = 0
                xpos = -adj
                ypos += self.brickheight

        self.brickrect.append(self.brick.get_rect())    
        self.brickrect[i] = self.brickrect[i].move(xpos, ypos)
        xpos = xpos + self.bricklength

if __name__ == '__main__':
    br = Breakout()
    br.main()

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вы можете использовать, например, pygame.time.get_ticks(), чтобы получить количество миллисекунд с момента вызова pygame.init(), а затем использовать простое деление для получения секунд и минут и т. Д. Из этого числа.

Вот простой пример:

import pygame
import pygame.freetype

def main():
    pygame.init()
    screen=pygame.display.set_mode((400, 300))
    clock=pygame.time.Clock()
    font=pygame.freetype.SysFont(None, 34)
    font.origin=True
    while True:
        for e in pygame.event.get():
            if e.type == pygame.QUIT: return
        screen.fill(pygame.Color('grey12'))
        ticks=pygame.time.get_ticks()
        millis=ticks%1000
        seconds=int(ticks/1000 % 60)
        minutes=int(ticks/60000 % 24)
        out='{minutes:02d}:{seconds:02d}:{millis}'.format(minutes=minutes, millis=millis, seconds=seconds)
        font.render_to(screen, (100, 100), out, pygame.Color('dodgerblue'))
        pygame.display.flip()
        clock.tick(60)

if __name__ == '__main__': main()

enter image description here

Если вы хотите, чтобы ваш секундомер «запускался позже», вы можете сохранить выходные данные pygame.time.get_ticks() в данный моменти просто вычтите его из результата дальнейших вызовов (что-то вроде starttime=pygame.time.get_ticks() и ticks=pygame.time.get_ticks()-starttime позже в цикле, вы поймете идею).

0 голосов
/ 23 ноября 2018

Если ваша игра работает в то время как цикл, с частотой кадров 60, вы можете получить минуты и секунды, выполнив это:

frame_count = 0
frame_rate = 60

... while block of game running 60 fps

    # Every second passes 60 frames, so you get seconds by dividing
    # by 60
    seconds = total_seconds // 60

    # Because 1 second is 60 frames, minute is 60 seconds * 60 frames.
    # So you divide by 60 * 60 = 3600 
    minutes = total_seconds // 3600  # Because every second is 60 fps 

    output_string = "Time: {0:02}:{1:02}".format(minutes, seconds)

    frame_count += 1

Я нашел это решение здесь

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