有没有一种方法可以每x秒运行一次函数? (DPS)

时间:2020-02-25 21:42:17

标签: python python-3.x time pygame

我最初的解决方案来自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()

2 个答案:

答案 0 :(得分:1)

请勿在事件驱动程序中使用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 )

答案 1 :(得分:0)

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

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