簡體   English   中英

如何在python中為命令增加延遲?

[英]How can you add delay to commands in python?

您好,我是python新手,決定使用pygame編寫一個簡單的RPG游戲。 這些命令按預期工作,但是我需要在屏幕上被遮住的文本上添加一個延遲。 如果您按下“是”按鈕,則您的播放器將開始攻擊;如果您按下“否”按鈕,則播放器將不執行任何操作而遭到攻擊。 殺死第一個老板后,您的玩家將升級。 需要在黑色矩形上塗上陰影的文字是祝賀您升級並顯示新統計信息的消息。 編輯:我不是在尋找“ time.sleep()”。 如果您可以運行我的程序,您將理解原因。 我需要添加該延遲,因為其目的是將一行文本改成黑色矩形,並在彈出的每一行之間添加延遲,以使它不會立即發生。 如果我在函數中添加了time.sleep(),它將暫停我的TEXT(A,B,C)函數一會兒,然后當我只希望它延遲A,B,C的內容時立即對所有內容進行偏移在兩者之間。 完整的代碼如下:

from pygame import *
#from userInterface import Title, Dead
WIN_WIDTH = 640
WIN_HEIGHT = 400
HALF_WIDTH = int(WIN_WIDTH / 2)
HALF_HEIGHT = int(WIN_HEIGHT / 2)
DISPLAY = (WIN_WIDTH, WIN_HEIGHT)
DEPTH = 32
FLAGS = 0

init()
screen = display.set_mode(DISPLAY, FLAGS, DEPTH)
saveState = False

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (30, 30, 30)
FONT = font.SysFont("Courier New", 15)



heroHP = 1000

hero={'name' : 'Hero',
      'height':4,
      'lvl': 1,
      'xp' : 0,
      'reward' : 0,
      'lvlNext':25,
      'stats': {'str' : 12, # strength
                'dex' : 4, # dexterity
                'int' : 15, # intelligence
                'hp'  : heroHP, # health
                'atk' : [250,350]}} # range of attack values


boss1={'name' : 'Imp',
       'xp' : 0,
       'lvlNext':25,
       'reward' : 25,
       'stats': {'hp'  :400,
                'atk' : [300,350]}}


ONE = None
TWO = None
THREE = None
FOUR = None
text = False
counter =0

def TEXT(A, B, C):
    global ONE, TWO, THREE, FOUR, counter, text
    text = True
    if text:
        if counter == 20:
            ONE  = A
        elif counter == 40:
            TWO = B
        elif counter == 60:
            THREE = C
        elif counter == 200:
            ONE = None
            TWO = None
            THREE = None
            FOUR = None
            counter = 0
            text = False
        counter += 1






def level(char): # level up system
    #nStr, nDex, nInt=0,0,0
    while char['xp'] >= char['lvlNext']:
        char['lvl']+=1
        char['xp']=char['xp'] - char['lvlNext']
        char['lvlNext'] = round(char['lvlNext']*1.5)
        nStr=0.5*char['stats']['str']+1
        nDex=0.5*char['stats']['dex']+1
        nInt=0.5*char['stats']['int']+1
        print(f'{char["name"]} levelled up to level {char["lvl"]}!') # current level
        A = (f'{char["name"]} levelled up to level {char["lvl"]}!') # current level

        print(f'( INT {round((char["stats"]["int"] + nInt))} - STR {round(char["stats"]["str"] + nStr)} - DEX {round(char["stats"]["dex"] + nDex)} )') # print new stats
        B = (f'( INT {round((char["stats"]["int"] + nInt))} - STR {round(char["stats"]["str"] + nStr)} - DEX {round(char["stats"]["dex"] + nDex)} )') # print new statsm

        char['stats']['str'] += nStr
        char['stats']['dex'] += nDex
        char['stats']['int'] += nInt

        TEXT(A,B,None)

from random import randint

def takeDmg(attacker, defender): # damage alorithm
    dmg = randint(attacker['stats']['atk'][0], attacker['stats']['atk'][1])
    defender['stats']['hp'] = defender['stats']['hp'] - dmg
    print(f'{defender["name"]} takes {dmg} damage!')
    #TEXT(f'{defender["name"]} takes {dmg} damage!')

    if defender['stats']['hp'] <= 0:
            print(f'{defender["name"]} has been slain...')
            #TEXT(f'{defender["name"]} has been slain...')

            attacker['xp'] += defender['reward']
            level(attacker)
            if defender==hero:
                #Dead()
                pass
            else:
                hero['stats']['hp']=heroHP
                #Title()
                pass


def Battle(player, enemy):
    global ONE, TWO, THREE, FOUR
    mouse.set_visible(1)
    clock = time.Clock()
    YES = Rect(100, 100, 50, 50)
    NO = Rect(500, 100, 50, 50)
    Text = Rect(70, 300, 500, 75)

    #while ((enemy['stats']['hp']) > 0):
    while True:
        for e in event.get():
            if e.type == QUIT:
                exit("Quit") # if X is pressed, exit program
            elif e.type == KEYDOWN:
                if e.key == K_ESCAPE:
                    exit()
            elif e.type == MOUSEBUTTONDOWN:
                # 1 is the left mouse button, 2 is middle, 3 is right.
                if e.button == 1:
                    # `event.pos` is the mouse position.
                    if YES.collidepoint(e.pos):
                        takeDmg(player, enemy)
                        print(f'{enemy["name"]} takes the opportunity to attack!')
                        #TEXT(f'{enemy["name"]} takes the opportunity to attack!')

                        takeDmg(enemy, player)
                    elif NO.collidepoint(e.pos):
                        print(f'{enemy["name"]} takes the opportunity to attack!')
                        #TEXT(f'{enemy["name"]} takes the opportunity to attack!')

                        takeDmg(enemy, player)


        screen.fill(WHITE)
        draw.rect(screen, BLACK, YES)
        draw.rect(screen, BLACK, NO)
        draw.rect(screen, GRAY, Text)



        YES_surf = FONT.render(("YES"), True, WHITE)
        NO_surf = FONT.render(("NO"), True, WHITE)
        Text1_surf = FONT.render(ONE, True, WHITE)
        Text2_surf = FONT.render(TWO, True, WHITE)
        Text3_surf = FONT.render(THREE, True, WHITE)
        Text4_surf = FONT.render(FOUR, True, WHITE)



        screen.blit(YES_surf, YES)
        screen.blit(NO_surf, NO)
        screen.blit(Text1_surf, (80, 305))
        screen.blit(Text2_surf, (80, 320))
        screen.blit(Text3_surf, (80, 335))
        screen.blit(Text4_surf, (80, 350))





        display.update()

        clock.tick(60)

Battle(hero, boss1)

我使用def TEXT(A,B,C)函數通過使用計數器添加延遲,然后在設置的時間量后刪除文本。 到目前為止,我僅在字符升級以對其進行測試時才實現了TEXT函數,但似乎無法正常工作。

ONE = None
TWO = None
THREE = None
FOUR = None
text = False
counter =0

def TEXT(A, B, C):
    global ONE, TWO, THREE, FOUR, counter, text
    text = True
    if text:
        if counter == 20:
            ONE  = A
        elif counter == 40:
            TWO = B
        elif counter == 60:
            THREE = C
        elif counter == 200:
            ONE = None
            TWO = None
            THREE = None
            FOUR = None
            counter = 0
            text = False
        counter += 1

在游戲中使用time.sleep並不是一個好主意(此功能僅適用於少數情況,實時應用不是其中之一)。

相反,您的游戲應基於事件驅動,這意味着在滿足某些條件(游戲狀態)時應產生新的動作。

我看到您正在使用pygame,因此對於時間事件,您應該查看其模塊時間 ,尤其是set_timer函數可以幫助您。

另外,建議您閱讀此線程。 為什么全局變量有害?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM