当前位置: 首页 > 知识库问答 >
问题:

在pygame中将秒表添加到游戏中

佘飞鸣
2023-03-14

我想在我的游戏中添加秒表。我计划修改此代码并添加到我的pygame中:

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

我是否应该在def init部分中添加一个计时器框,并为计时器代码创建一个新的def?我想让计时器不使用代码,因为我的游戏正在运行时钟。勾选(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个答案

栾钟展
2023-03-14

如果你的游戏是运行的同时循环,fps为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

我在这里找到了这个解决方案

陆洲
2023-03-14

例如,您可以使用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()

如果您想让秒表“稍后启动”,可以存储pygame的输出。时间此时获取_ticks(),只需从进一步调用的结果中减去它(类似于starttime=pygame.time.get _ticks()ticks=pygame.time.get _ticks()-starttime,稍后在循环中,您就会明白了)。

 类似资料:
  • 问题内容: 好的,所以我在下面包含了我项目的代码,我只是在做一些平台游戏方面对pygame做一些试验。我试图弄清楚如何按照播放器进行一些非常简单的滚动,因此播放器是相机的中心,它会弹跳/跟随他。谁能帮我? 问题答案: 绘制实体时,你需要将偏移量应用于实体的位置。我们称这个偏移量为 ,因为这是我们想要达到的效果。 首先,我们无法使用群组的功能,因为需要知道其位置并非要在屏幕上绘制的位置(最后,我们l

  • 所以我对Python、PyGame和任何编程都是全新的。我遵循了在PyGame中制作蛇游戏的教程。现在一切都结束了,但为了给自己一个挑战,我正试图改变一下比赛。首先我想添加边界,但我真的迷路了。我试过看其他教程,但它们的图像似乎有所不同。这是我的代码(因为我不知道什么可以帮助你帮助我,所以我把它全部发送了): 基本上,我希望当我的蛇撞到边界时发生的事情和它撞到自己时发生的事情是一样的。如果你能帮助

  • 基本上,我已经为我的游戏创建了一个pyplay菜单,当我点击它们时,它会加载所有其他pyplay窗口,但是对于一些方面,如添加用户等,我在Tkinter GUI中创建。当我点击加载他们在我的pyplay它不会加载Tkinter图形用户界面,有人知道我如何解决这个问题,或者如果有什么我需要添加到使其工作。 它的行为就像它要加载某个东西,但不加载。第一个名为“mathsvaders”的程序加载得很好,

  • 本文向大家介绍Javascript实现秒表计时游戏,包括了Javascript实现秒表计时游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了javascript实现秒表计时游戏的具体代码,供大家参考,具体内容如下 一、说明 本游戏页面设计分为左右两栏。左上为跑马灯,左下为计时器和”START”按钮;右上为排行榜,右下为游戏规则说明。 跑马灯用的是定时器,循环走一遍。计时器是从”00

  • 本文向大家介绍pygame实现打字游戏,包括了pygame实现打字游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了pygame实现打字游戏的具体代码,供大家参考,具体内容如下 1.基本代码 下面的代码完成了每一秒在界面的顶部随机生成一个新的字母 2.移动字母 先增加一个定时器,设定字母20毫秒移动一格 在主循环中加入移动的代码 3.消除字母 在事件的处理代码中加入对键盘字母的判断

  • 本文向大家介绍python pygame实现2048游戏,包括了python pygame实现2048游戏的使用技巧和注意事项,需要的朋友参考一下 实现2048相对来说比较简单,用4*4的二维数组保存地图,pygame.key.get_pressed()获取键盘操作,详见代码。 效果图 代码 后续可以考虑实现动画和AI。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程