【发布时间】:2018-04-04 21:55:48
【问题描述】:
您好,我是 python 新手,决定使用 pygame 编写一个简单的 RPG 游戏。 这些命令按预期工作,但我需要为屏幕上的文本添加延迟。 如果你按下“yes”按钮,你的玩家将会发起攻击,如果你按下“no”按钮,你的玩家将什么也不做并受到攻击。杀死第一个老板后,您的玩家将升级。需要在空白黑色矩形上显示的文本是祝贺您升级并显示您的新统计数据的消息。 编辑:我不是在寻找“time.sleep()”。如果你能运行我的程序,你就会明白为什么。我需要添加延迟,因为其目的是将一行文本插入一个黑色矩形,并在每行弹出之间添加延迟,这样它就不会立即发生。如果我在我的函数中添加了一个 time.sleep() ,它将暂停我的 TEXT(A, B, C) 函数一段时间,然后当我只想让 A、B、C 有一些延迟时立即对所有内容进行 blit介于两者之间。 完整代码如下:
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
【问题讨论】:
-
@JacobIRR 我试过了,但不是每个命令只做几秒钟,而是累积了所有的延迟并立即对所有内容进行 blit。 time.sleep() 也不会暂停整个程序吗?我正在后台播放一些音乐,所以完全暂停程序并不是一个好主意。
-
@JacobIRR 使用
time.sleep将锁定整个线程,使所有内容都没有响应。
标签: python python-3.x pygame