【问题标题】:Is there a way to run a function every x seconds? (DPS)有没有办法每 x 秒运行一次函数? (每秒输出)
【发布时间】:2020-06-09 17:12:12
【问题描述】:

我最初的解决方案来自this 对类似问题的评论。但是,如果我这样做并实施这个 进入我的代码的不同部分,它会停止计算 CASH 的游戏内计数器。

CASH = 0
DPS = 5
HPofMonster = 10
starttime=time.time()

def handle_monster():
    global HPofMonster, CASH
    if pygame.mouse.get_focused():
        event = pygame.event.poll()
        mouse_x, mouse_y = pygame.mouse.get_pos()
        if GEN1.collidepoint(mouse_x, mouse_y) and event.type == MOUSEBUTTONDOWN and event.button == 1:
            HPofMonster -= 1
            print('click')
            pass
        else:
            print('Not Pushed OR not on Monster')
            pass
    else:
        print('Mouse not focused')
        pass
    if HPofMonster < 0:
        CASH += 5
        HPofMonster = 10
        print('reset')

def handle_dps():
    global HPofMonster
    HPofMonster -= DPS
    print("tick")
    time.sleep(1.0 - ((time.time() - starttime) % 1.0))


def game_loop():
    while True:
        handle_dps()
        handle_monster()
        update_text()
        handle_events()



def main():
    pygame.display.set_caption('Clicker')
    game_loop()


main()

当我不移动鼠标时,我的控制台如下所示:

打勾

不推或不在怪物上

打勾

不推或不在怪物上

打勾

不推或不在怪物上

重置

打勾

不推或不在怪物上

打勾

不推或不在怪物上

打勾

不推或不在怪物上

重置

打勾

不推或不在怪物上

打勾

不推或不在怪物上

打勾

不推或不在怪物上

重置

鼠标没有聚焦

进程以退出代码 0 结束

这是完整的代码:

import pygame, threading, time

from threading import Event, Thread
from pygame.locals import *


pygame.init()

WIDTH = 800
HEIGHT = 600
WINDOW = pygame.display.set_mode((WIDTH, HEIGHT))
CASH = 0
DPS = 5
HPofMonster = 10
BACKGROUND_COLOR = (0, 0, 0)
BUTTON_COLOR = (0, 255, 0)
starttime=time.time()

FONT = pygame.font.SysFont('monospace', 15)

# Main Screen for drawing buttons
DRAW_SCREEN = pygame.Surface((WIDTH, HEIGHT))
DRAW_SCREEN.fill(BACKGROUND_COLOR)

# Buttons
GEN1 = pygame.draw.rect(DRAW_SCREEN, BUTTON_COLOR, pygame.Rect(200, 200, 200, 200), 1)
GEN1_LABEL = FONT.render('Defeat the Monster', 1, (255, 255, 0))


def handle_monster():
    global HPofMonster, CASH
    if pygame.mouse.get_focused():
        event = pygame.event.poll()
        mouse_x, mouse_y = pygame.mouse.get_pos()
        if GEN1.collidepoint(mouse_x, mouse_y) and event.type == MOUSEBUTTONDOWN and event.button == 1:
            HPofMonster -= 1
            print('click')
            pass
        else:
            print('Not Pushed OR not on Monster')
            pass
    else:
        print('Mouse not focused')
        pass
    if HPofMonster < 0:
        CASH += 5
        HPofMonster = 10
        print('reset')


def handle_events():
    event_dict = {
        pygame.QUIT: exit,
    }
    for event in pygame.event.get():
        if event.type in event_dict:
            event_dict[event.type]()


def update_text():
    global CASH_LABEL, DPS_LABEL, GEN1_LABEL, DPS, CASH
    WINDOW.blit(DRAW_SCREEN, (0, 0))
    WINDOW.blit(GEN1_LABEL, (10, 108))
    CASH_LABEL = FONT.render('Total Cash: ${}'.format(CASH), 1, (255, 255, 0))
    DPS_LABEL = FONT.render('Total DPS: ${}'.format(DPS), 1, (255, 65, 0))
    WINDOW.blit(CASH_LABEL, (0, 0))
    WINDOW.blit(DPS_LABEL, (0, 20))
    pygame.display.flip()


def handle_dps():
    global HPofMonster
    HPofMonster -= DPS
    print("tick")


def game_loop():
    while True:
        handle_dps()
        handle_monster()
        update_text()
        handle_events()



def main():
    pygame.display.set_caption('Clicker')
    game_loop()


main()

【问题讨论】:

  • 你不能在 pygame 循环中使用time.sleep。你必须安装一个计时器。 pygame 是基于 SDL 的,所以这可能是可能的

标签: python python-3.x time pygame


【解决方案1】:

使用pygame.time.delay()pygame.time.wait()代替time.sleep

这里是官方pygame时间事件的链接:https://www.pygame.org/docs/ref/time.html

【讨论】:

    【解决方案2】:

    不要在事件驱动程序中使用time.sleep()。它阻塞了事件循环,并且在某些系统上,窗口管理器或外围操作系统会认为程序已停止和/或崩溃。程序必须不断处理传入的事件。

    在 pygame 中执行此操作的一种简单方法是使用实​​时系统时钟函数 pygame.time.get_ticks(),它返回自程序启动以来的毫秒数,并且它会不断增加永远。如果您希望将来触发某些内容,请设置时间戳,例如:

    future_timestamp = pygame.time.get_ticks() + 15000   # 15 seconds from now
    
    ...
    
    # somewhere else in the code, maybe in the main loop
    time_now = pygame.time.get_ticks()
    if ( future_timestamp < time_now ):
        # do the thing that had to happen
        do_that_thing()
        # re-set the timer for next time
        future_timestamp = time_now + 15000
    

    实现周期性发生的事情的另一种简单方法是设置一个 pygame 计时器:

    pygame.time.set_timer( pygame.USEREVENT + 1, 3500 )   # Cash every 3500 milliseconds
    
    # Main Loop 
    while not exiting:
        # Handle user-input
        for event in pygame.event.get():
            if ( event.type == pygame.QUIT ):
               done = True
            elif ( event.type == pygame.USEREVENT + 1 ):
               CASH += 1   
               # reset the event-timer
               pygame.time.set_timer( pygame.USEREVENT + 1, 3500 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 2018-12-19
      • 2012-07-11
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多