等待而不冻结一切
waiting without freezing everything
我正在尝试撰写胜利声明。我想在满足胜利要求时快速屏蔽蓝色和黄色闪光灯,但不要太快,现在是左键单击。问题是如果不根据计算机 运行 程序更改游戏,我找不到实现此目的的方法。我试着让它重新运行颜色几次,这样颜色在改变之前会持续更长时间,但在更快或更慢的系统上,这种效果很可能会有所不同。
if V == 2:
if Blue == 1:
D.fill(BLUE)
Blue = 2
elif Blue == 2:
D.fill(BLUE)
Blue = 3
elif Blue == 3:
D.fill(BLUE)
Blue = 4
elif Blue == 4:
D.fill(BLUE)
Blue = 5
elif Blue == 5:
D.fill(YELLOW)
Blue = 6
elif Blue == 6:
D.fill(YELLOW)
Blue = 7
elif Blue == 7:
D.fill(YELLOW)
Blue = 8
elif Blue == 8:
D.fill(YELLOW)
Blue = 1
这只是在更改之前重新运行颜色四次,这并不理想。我曾尝试使用等待功能,但这会在这段时间内冻结整个程序,这使得所有其他事情显然都没有反应。有没有一种方法可以让它在没有这种重申想法的情况下闪现,也不会在多长时间内冻结整个程序?谢谢
在使用你们给出的其中一个答案后,我已经设法让它工作了。问题是现在,每当我使用任何形式的输入(例如箭头键)时,闪烁都会停止。理想情况下,闪烁不会停止,直到 V = 0,即游戏重置时。
if V == 2:
if event.type == event_500ms:
if Blue == 1:
D.fill(BLUE)
Blue = 2
elif Blue == 2:
D.fill(YELLOW)
Blue = 1
这是之前显示的代码的新版本。以防万一,这是整个循环。
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_speed =- 3
x2_speed = 3
y3_speed =- 3
y4_speed = 3
elif event.key == pygame.K_RIGHT:
x_speed = 3
x2_speed =- 3
y3_speed = 3
y4_speed =- 3
elif event.key == pygame.K_UP:
y_speed =- 3
y2_speed = 3
x3_speed =- 3
x4_speed = 3
elif event.key == pygame.K_DOWN:
y_speed = 3
y2_speed =- 3
x3_speed = 3
x4_speed =- 3
elif event.key == pygame.K_TAB:
GMT += 1
CIP = 2
if GMT % 2:
GM = 2
else:
GM = 1
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
x_speed=0
x2_speed=0
y3_speed=0
y4_speed=0
elif event.key == pygame.K_RIGHT:
x_speed=0
x2_speed=0
y3_speed=0
y4_speed=0
elif event.key == pygame.K_UP:
y_speed=0
y2_speed=0
x3_speed=0
x4_speed=0
elif event.key == pygame.K_DOWN:
y_speed=0
y2_speed=0
x3_speed=0
x4_speed=0
elif event.type == MOUSEBUTTONDOWN:
x_coord = 300
y_coord = 300
x2_coord = 300
y2_coord = 300
x3_coord = 300
y3_coord = 300
x4_coord = 300
y4_coord = 300
X5_coord = 30
Y5_coord = 10
direction = 'right'
D.fill(BLACK)
G = random.randrange(1, 10)
CO = 2
V = 2
elif event.type == MOUSEBUTTONUP:
X5_coord = 30
Y5_coord = 10
direction = 'right'
if direction == 'right':
X5_coord += 10
if X5_coord == 670:
direction = 'down'
elif direction == 'down':
Y5_coord += 10
if Y5_coord == 460:
direction = 'left'
elif direction == 'left':
X5_coord -= 10
if X5_coord == 10:
direction = 'up'
elif direction == 'up':
Y5_coord -= 10
if Y5_coord == 10:
direction = 'right'
x_coord = x_coord + x_speed
y_coord = y_coord + y_speed
x2_coord = x2_coord + x2_speed
y2_coord = y2_coord + y2_speed
x3_coord = x3_coord + x3_speed
y3_coord = y3_coord + y3_speed
x4_coord = x4_coord + x4_speed
y4_coord = y4_coord + y4_speed
if GM == 2 and CIP == 2:
D.fill(BLACK)
CIP = 1
if GM == 1:
D.fill(MEXON)
if G >= 6:
B(L6, (80, 150))
if G == 1 and CO == 2:
x_coord = 366
y_coord = 201
x2_coord = 234
y2_coord = 399
x3_coord = 201
y3_coord = 366
x4_coord = 399
y4_coord = 234
CO = 1
elif G == 2 and CO == 2:
x_coord = 240
y_coord = 312
x2_coord = 360
y2_coord = 288
x3_coord = 312
y3_coord = 240
x4_coord = 288
y4_coord = 360
CO = 1
elif G == 3 and CO == 2:
x_coord = 405
y_coord = 228
x2_coord = 195
y2_coord = 372
x3_coord = 228
y3_coord = 405
x4_coord = 372
y4_coord = 195
CO = 1
elif G == 4 and CO == 2:
x_coord = 179
y_coord = 309
x2_coord = 421
y2_coord = 291
x3_coord = 309
y3_coord = 179
x4_coord = 291
y4_coord = 421
CO = 1
elif G == 5 and CO == 2:
x_coord = 315
y_coord = 450
x2_coord = 285
y2_coord = 150
x3_coord = 450
y3_coord = 315
x4_coord = 150
y4_coord = 285
CO = 1
elif G == 6 and CO == 2:
x_coord = 180
y_coord = 390
x2_coord = 420
y2_coord = 210
x3_coord = 390
y3_coord = 180
x4_coord = 210
y4_coord = 420
CO = 1
elif G == 7 and CO == 2:
x_coord = 267
y_coord = 204
x2_coord = 333
y2_coord = 396
x3_coord = 204
y3_coord = 267
x4_coord = 396
y4_coord = 333
CO = 1
elif G == 8 and CO == 2:
x_coord = 363
y_coord = 390
x2_coord = 237
y2_coord = 210
x3_coord = 390
y3_coord = 363
x4_coord = 210
y4_coord = 237
CO = 1
elif G == 9 and CO == 2:
x_coord = 234
y_coord = 273
x2_coord = 366
y2_coord = 327
x3_coord = 273
y3_coord = 234
x4_coord = 327
y4_coord = 366
CO = 1
elif G == 10 and CO == 2:
x_coord = 102
y_coord = 267
x2_coord = 498
y2_coord = 333
x3_coord = 267
y3_coord = 102
x4_coord = 333
y4_coord = 498
CO = 1
if V == 2:
if event.type == event_500ms:
if Blue == 1:
D.fill(BLUE)
Blue = 2
elif Blue == 2:
D.fill(YELLOW)
Blue = 1
B(L1, (47, 45))
B(L2, (47, 60))
B(L2C, (65, 75))
B(L3, (47, 90))
B(L4, (47, 105))
B(L5, (47, 120))
L(D, PINDLER, (40, 5), (695, 5), 10)
L(D, PINDLER, (3, 42), (3, 495), 10)
L(D, PINDLER, (3, 495), (695, 495), 10)
L(D, PINDLER, (695, 495), (695, 5), 10)
L(D, PINDLER, (3, 41), (658, 42), 10)
L(D, PINDLER, (40, 5), (40, 458), 10)
L(D, PINDLER, (40, 458), (658, 458), 10)
L(D, PINDLER, (658, 458), (658, 42), 10)
FINISH(D, Fx, Fy)
MOLINE1(D, x_coord, y_coord)
MOLINE2(D, x2_coord, y2_coord)
MOLINE3(D, x3_coord, y3_coord)
MOLINE4(D, x4_coord, y4_coord)
MOLINE5(D, X5_coord, Y5_coord)
pygame.draw.line(D, PINDLER, (303, 302), (307, 306), 1)
pygame.draw.line(D, PINDLER, (307, 302), (303, 306), 1)
pygame.display.flip()
clock.tick(60)
我会显示所有代码,但它不喜欢正确缩进以使站点将其识别为代码。有一次,我在所有 500 行中手动放置了四个空格。一点都不好玩。
应要求提供更多信息,我冒昧地提供了所有代码。希望这可以帮助。谢谢
import pygame, sys, random
from pygame.locals import *
pygame.init()
BLACK = ( 0, 0, 0)
ABINO = ( 34, 45, 102)
PINDLER = (255, 123, 90)
MEXON = (200, 190, 220)
WHITE = (255, 255, 255)
YELLOW = (255, 255, 0)
RED = (255, 0, 0)
BLUE = ( 0, 0, 255)
size = [700, 500]
D = pygame.display.set_mode(size)
L = pygame.draw.aaline
R = pygame.draw.rect
G = random.randrange(1, 10)
GM = 1
GMT = 2
CIP = 1
CO = 2
V = 0
Blue = 1
event_500ms = pygame.USEREVENT + 1
pygame.time.set_timer(event_500ms, 500)
pygame.display.set_caption("Moline")
myfont = pygame.font.SysFont("monospace", 15)
T = myfont.render
M1S = "RULES:"
M2S = "1. To start, press each arrow key in a random sequence"
M2F = " for roughly one second."
M3S = "2. To win, re-merge the four men on the crossmark."
M4S = "3. Complete before the running man completes a lap."
M5S = "4. Mouse movement is illegal and causes a severe time penalty."
L1 = T(M1S, 1, (255, 255, 0))
L2 = T(M2S, 1, (255, 255, 0))
L2C = T(M2F, 1, (255, 255, 0))
L3 = T(M3S, 1, (255, 255, 0))
L4 = T(M4S, 1, (255, 255, 0))
L5 = T(M5S, 1, (255, 255, 0))
B = D.blit
Fx = 10
Fy = 10
L6 = T("cheeeeeeeeese", 1, (255, 255, 0))
def MOLINE1(D, x, y):
pygame.draw.ellipse(D, BLACK, [1 + x, y, 10, 10], 0)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [10 + x, 27 + y], 2)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [x, 27 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 17 + y], [5 + x, 7 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [9 + x, 17 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [1 + x, 17 + y], 2)
def MOLINE2(D, x, y):
pygame.draw.ellipse(D, BLACK, [1 + x, y, 10, 10], 0)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [10 + x, 27 + y], 2)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [x, 27 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 17 + y], [5 + x, 7 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [9 + x, 17 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [1 + x, 17 + y], 2)
def MOLINE3(D, x, y):
pygame.draw.ellipse(D, BLACK, [1 + x, y, 10, 10], 0)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [10 + x, 27 + y], 2)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [x, 27 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 17 + y], [5 + x, 7 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [9 + x, 17 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [1 + x, 17 + y], 2)
def MOLINE4(D, x, y):
pygame.draw.ellipse(D, BLACK, [1 + x, y, 10, 10], 0)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [10 + x, 27 + y], 2)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [x, 27 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 17 + y], [5 + x, 7 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [9 + x, 17 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [1 + x, 17 + y], 2)
def MOLINE5(D, x, y):
pygame.draw.ellipse(D, BLACK, [1 + x, y, 10, 10], 0)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [10 + x, 27 + y], 2)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [x, 27 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 17 + y], [5 + x, 7 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [9 + x, 17 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [1 + x, 17 + y], 2)
def FINISH(D, x, y):
R(D, BLACK, ( 4, 42, 6, 6))
R(D, WHITE, (10, 42, 6, 6))
R(D, BLACK, (16, 42, 6, 6))
R(D, WHITE, (22, 42, 6, 6))
R(D, BLACK, (28, 42, 6, 6))
R(D, WHITE, (34, 42, 6, 6))
R(D, WHITE, ( 4, 48, 6, 6))
R(D, BLACK, (10, 48, 6, 6))
R(D, WHITE, (16, 48, 6, 6))
R(D, BLACK, (22, 48, 6, 6))
R(D, WHITE, (28, 48, 6, 6))
R(D, BLACK, (34, 48, 6, 6))
R(D, BLACK, ( 4, 54, 6, 6))
R(D, WHITE, (10, 54, 6, 6))
R(D, BLACK, (16, 54, 6, 6))
R(D, WHITE, (22, 54, 6, 6))
R(D, BLACK, (28, 54, 6, 6))
R(D, WHITE, (34, 54, 6, 6))
x_speed = 0
y_speed = 0
x2_speed = 0
y2_speed = 0
x3_speed = 0
y3_speed = 0
x4_speed = 0
y4_speed = 0
x_coord = 300
y_coord = 300
x2_coord = 300
y2_coord = 300
x3_coord = 300
y3_coord = 300
x4_coord = 300
y4_coord = 300
X5_coord = 30
Y5_coord = 10
direction = 'right'
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_speed =- 3
x2_speed = 3
y3_speed =- 3
y4_speed = 3
elif event.key == pygame.K_RIGHT:
x_speed = 3
x2_speed =- 3
y3_speed = 3
y4_speed =- 3
elif event.key == pygame.K_UP:
y_speed =- 3
y2_speed = 3
x3_speed =- 3
x4_speed = 3
elif event.key == pygame.K_DOWN:
y_speed = 3
y2_speed =- 3
x3_speed = 3
x4_speed =- 3
elif event.key == pygame.K_TAB:
GMT += 1
CIP = 2
if GMT % 2:
GM = 2
else:
GM = 1
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
x_speed=0
x2_speed=0
y3_speed=0
y4_speed=0
elif event.key == pygame.K_RIGHT:
x_speed=0
x2_speed=0
y3_speed=0
y4_speed=0
elif event.key == pygame.K_UP:
y_speed=0
y2_speed=0
x3_speed=0
x4_speed=0
elif event.key == pygame.K_DOWN:
y_speed=0
y2_speed=0
x3_speed=0
x4_speed=0
elif event.type == MOUSEBUTTONDOWN:
x_coord = 300
y_coord = 300
x2_coord = 300
y2_coord = 300
x3_coord = 300
y3_coord = 300
x4_coord = 300
y4_coord = 300
X5_coord = 30
Y5_coord = 10
direction = 'right'
D.fill(BLACK)
G = random.randrange(1, 10)
CO = 2
V = 2
elif event.type == MOUSEBUTTONUP:
X5_coord = 30
Y5_coord = 10
direction = 'right'
if direction == 'right':
X5_coord += 10
if X5_coord == 670:
direction = 'down'
elif direction == 'down':
Y5_coord += 10
if Y5_coord == 460:
direction = 'left'
elif direction == 'left':
X5_coord -= 10
if X5_coord == 10:
direction = 'up'
elif direction == 'up':
Y5_coord -= 10
if Y5_coord == 10:
direction = 'right'
x_coord = x_coord + x_speed
y_coord = y_coord + y_speed
x2_coord = x2_coord + x2_speed
y2_coord = y2_coord + y2_speed
x3_coord = x3_coord + x3_speed
y3_coord = y3_coord + y3_speed
x4_coord = x4_coord + x4_speed
y4_coord = y4_coord + y4_speed
if GM == 2 and CIP == 2:
D.fill(BLACK)
CIP = 1
if GM == 1:
D.fill(MEXON)
if G >= 6:
B(L6, (80, 150))
if G == 1 and CO == 2:
x_coord = 366
y_coord = 201
x2_coord = 234
y2_coord = 399
x3_coord = 201
y3_coord = 366
x4_coord = 399
y4_coord = 234
CO = 1
elif G == 2 and CO == 2:
x_coord = 240
y_coord = 312
x2_coord = 360
y2_coord = 288
x3_coord = 312
y3_coord = 240
x4_coord = 288
y4_coord = 360
CO = 1
elif G == 3 and CO == 2:
x_coord = 405
y_coord = 228
x2_coord = 195
y2_coord = 372
x3_coord = 228
y3_coord = 405
x4_coord = 372
y4_coord = 195
CO = 1
elif G == 4 and CO == 2:
x_coord = 179
y_coord = 309
x2_coord = 421
y2_coord = 291
x3_coord = 309
y3_coord = 179
x4_coord = 291
y4_coord = 421
CO = 1
elif G == 5 and CO == 2:
x_coord = 315
y_coord = 450
x2_coord = 285
y2_coord = 150
x3_coord = 450
y3_coord = 315
x4_coord = 150
y4_coord = 285
CO = 1
elif G == 6 and CO == 2:
x_coord = 180
y_coord = 390
x2_coord = 420
y2_coord = 210
x3_coord = 390
y3_coord = 180
x4_coord = 210
y4_coord = 420
CO = 1
elif G == 7 and CO == 2:
x_coord = 267
y_coord = 204
x2_coord = 333
y2_coord = 396
x3_coord = 204
y3_coord = 267
x4_coord = 396
y4_coord = 333
CO = 1
elif G == 8 and CO == 2:
x_coord = 363
y_coord = 390
x2_coord = 237
y2_coord = 210
x3_coord = 390
y3_coord = 363
x4_coord = 210
y4_coord = 237
CO = 1
elif G == 9 and CO == 2:
x_coord = 234
y_coord = 273
x2_coord = 366
y2_coord = 327
x3_coord = 273
y3_coord = 234
x4_coord = 327
y4_coord = 366
CO = 1
elif G == 10 and CO == 2:
x_coord = 102
y_coord = 267
x2_coord = 498
y2_coord = 333
x3_coord = 267
y3_coord = 102
x4_coord = 333
y4_coord = 498
CO = 1
if V == 2:
if event.type == event_500ms:
if Blue == 1:
D.fill(BLUE)
Blue = 2
elif Blue == 2:
D.fill(YELLOW)
Blue = 1
B(L1, (47, 45))
B(L2, (47, 60))
B(L2C, (65, 75))
B(L3, (47, 90))
B(L4, (47, 105))
B(L5, (47, 120))
L(D, PINDLER, (40, 5), (695, 5), 10)
L(D, PINDLER, (3, 42), (3, 495), 10)
L(D, PINDLER, (3, 495), (695, 495), 10)
L(D, PINDLER, (695, 495), (695, 5), 10)
L(D, PINDLER, (3, 41), (658, 42), 10)
L(D, PINDLER, (40, 5), (40, 458), 10)
L(D, PINDLER, (40, 458), (658, 458), 10)
L(D, PINDLER, (658, 458), (658, 42), 10)
FINISH(D, Fx, Fy)
MOLINE1(D, x_coord, y_coord)
MOLINE2(D, x2_coord, y2_coord)
MOLINE3(D, x3_coord, y3_coord)
MOLINE4(D, x4_coord, y4_coord)
MOLINE5(D, X5_coord, Y5_coord)
pygame.draw.line(D, PINDLER, (303, 302), (307, 306), 1)
pygame.draw.line(D, PINDLER, (307, 302), (303, 306), 1)
pygame.display.flip()
clock.tick(60)
pygame.quit()
请注意,这不是成品,因此在某些方面可能看起来很尴尬,因为这个程序已经发展了很多。因此可能有一些未使用的全局变量或一些不准确的文本。
也许你可以试试:
import time
time.sleep(5)
问题是,当您使用 PyGame time
模块。
为避免此问题,您可以创建您自己的事件,每隔给定的毫秒数,该事件就会出现在事件队列中。您可以使用 pygame.time.set_timer()
创建一个事件:
import pygame
pygame.init()
#color tupels
BLUE = (55,155,255)
YELLOW = (255,255,0)
#create a new event id called event_500ms
event_500ms = pygame.USEREVENT + 1
#set timer event to appear on the event queue every 500 milliseconds
pygame.time.set_timer(event_500ms, 500)
screen = pygame.display.set_mode((800,800))
#global variable V for state-machine
V = 0
while True:
#get events from the event queue
for ev in pygame.event.get():
if ev.type == pygame.KEYDOWN and ev.key == pygame.K_ESCAPE:
pygame.quit()
exit()
#left (ev.button == 3) mousbutton down -> set variable V = 1
if ev.type == pygame.MOUSEBUTTONDOWN and ev.button == 3:
V = 1
#check for the event_500ms event
if ev.type == event_500ms:
if V == 1:
screen.fill(BLUE)
V = 2
elif V == 2:
screen.fill(YELLOW)
V = 0
pygame.display.flip() #update whole screen
在这段代码中,我们使用了一种所谓的 state-machine,具有 3 个不同的阶段:
- 设置
V = 1
,如果一个pygame.MOUSEBUTTONDOWN
事件accurse,(下一状态:2)
- 填充
screen
蓝色并递增 V
,如果变量 V
等于 1
。 (下一状态:3)
- 填充
screen
黄色,其余V
到0
,如果变量V
等于2
. (下一状态:1)
希望对您有所帮助:)
您的问题有两种解决方案,代表您尝试过的两种方法:要么等待特定时间等待下一次报价,要么每次报价都做一些事情,但是您遇到的问题是报价取决于速度计算机是(以及其他因素,例如后台程序 运行ning)。 (我通过你的主循环引用每个 运行,你可能会使用它。)
现在你说 "okay, I want to change the background every fourth tick",问题是这可能是每毫秒,每秒或任何时候。所以我们不需要依赖于发生的滴答声的数量,而是依赖于时间的长短。我们可以使用 time.perf_counter() 来获取当前时间。这给了我们:
#Initialize old_time somewhere
new_time = time.perf_counter()
if new_time - old_time > 0.05:
change_background()
old_time = new_time
通常情况下,您不想对所有与时间相关的事情都这样做。相反,作为 while 循环中的第一件事,计算增量时间,通常称为 dt
while True:
dt = time.perf_counter() - old_time
old_time = time.perf_counter()
change_background(dt)
然后像之前一样处理dt
:
def change_background(dt):
cumulative_time += dt
if cumulative_time > 0.05:
#do things
cumulative_time = 0
另一种方法是使用某种 sleep
。正如您已经看到的那样,这将冻结整个线程——但您可以创建多个线程(当然您不需要使用线程,您可以使用进程或 greenlets 或所有其他花哨的多处理东西)。整个事情有点复杂,所以我不会在这里详细介绍,但一般来说,使用不同的线程进行输入和处理是个好主意。相对较新asyncio
module deals with exactly that kind of problem. There are also different solutions like greenlets or threads。一开始使用异步操作可能会让人感到困惑,第一个解决方案可以让你走得更远。
编辑:
我的答案独立于 pygame,另一个答案中使用的事件会在后台为您完成此操作。理解这个增量时间的想法并使用它仍然是一个好主意,例如在物理计算中。通常依赖于滴答声(而不是时间)是一个坏主意,并且会给你带来意想不到的行为。据说最初的 space 入侵者确实依赖 ticks 进行物理和图形计算。因此,每当您射击足够多的敌人时,它就会加速。这是一个意想不到的结果(然后保留下来,因为它是增加难度的好机制)。仿真器也面临着同样的问题:旧游戏(依赖于滴答而不是时间)通常 运行 速度快得令人难以置信,因为现代计算机具有更强的处理能力。模拟器必须考虑到这一点 "slow processing down".
我正在尝试撰写胜利声明。我想在满足胜利要求时快速屏蔽蓝色和黄色闪光灯,但不要太快,现在是左键单击。问题是如果不根据计算机 运行 程序更改游戏,我找不到实现此目的的方法。我试着让它重新运行颜色几次,这样颜色在改变之前会持续更长时间,但在更快或更慢的系统上,这种效果很可能会有所不同。
if V == 2:
if Blue == 1:
D.fill(BLUE)
Blue = 2
elif Blue == 2:
D.fill(BLUE)
Blue = 3
elif Blue == 3:
D.fill(BLUE)
Blue = 4
elif Blue == 4:
D.fill(BLUE)
Blue = 5
elif Blue == 5:
D.fill(YELLOW)
Blue = 6
elif Blue == 6:
D.fill(YELLOW)
Blue = 7
elif Blue == 7:
D.fill(YELLOW)
Blue = 8
elif Blue == 8:
D.fill(YELLOW)
Blue = 1
这只是在更改之前重新运行颜色四次,这并不理想。我曾尝试使用等待功能,但这会在这段时间内冻结整个程序,这使得所有其他事情显然都没有反应。有没有一种方法可以让它在没有这种重申想法的情况下闪现,也不会在多长时间内冻结整个程序?谢谢
在使用你们给出的其中一个答案后,我已经设法让它工作了。问题是现在,每当我使用任何形式的输入(例如箭头键)时,闪烁都会停止。理想情况下,闪烁不会停止,直到 V = 0,即游戏重置时。
if V == 2:
if event.type == event_500ms:
if Blue == 1:
D.fill(BLUE)
Blue = 2
elif Blue == 2:
D.fill(YELLOW)
Blue = 1
这是之前显示的代码的新版本。以防万一,这是整个循环。
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_speed =- 3
x2_speed = 3
y3_speed =- 3
y4_speed = 3
elif event.key == pygame.K_RIGHT:
x_speed = 3
x2_speed =- 3
y3_speed = 3
y4_speed =- 3
elif event.key == pygame.K_UP:
y_speed =- 3
y2_speed = 3
x3_speed =- 3
x4_speed = 3
elif event.key == pygame.K_DOWN:
y_speed = 3
y2_speed =- 3
x3_speed = 3
x4_speed =- 3
elif event.key == pygame.K_TAB:
GMT += 1
CIP = 2
if GMT % 2:
GM = 2
else:
GM = 1
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
x_speed=0
x2_speed=0
y3_speed=0
y4_speed=0
elif event.key == pygame.K_RIGHT:
x_speed=0
x2_speed=0
y3_speed=0
y4_speed=0
elif event.key == pygame.K_UP:
y_speed=0
y2_speed=0
x3_speed=0
x4_speed=0
elif event.key == pygame.K_DOWN:
y_speed=0
y2_speed=0
x3_speed=0
x4_speed=0
elif event.type == MOUSEBUTTONDOWN:
x_coord = 300
y_coord = 300
x2_coord = 300
y2_coord = 300
x3_coord = 300
y3_coord = 300
x4_coord = 300
y4_coord = 300
X5_coord = 30
Y5_coord = 10
direction = 'right'
D.fill(BLACK)
G = random.randrange(1, 10)
CO = 2
V = 2
elif event.type == MOUSEBUTTONUP:
X5_coord = 30
Y5_coord = 10
direction = 'right'
if direction == 'right':
X5_coord += 10
if X5_coord == 670:
direction = 'down'
elif direction == 'down':
Y5_coord += 10
if Y5_coord == 460:
direction = 'left'
elif direction == 'left':
X5_coord -= 10
if X5_coord == 10:
direction = 'up'
elif direction == 'up':
Y5_coord -= 10
if Y5_coord == 10:
direction = 'right'
x_coord = x_coord + x_speed
y_coord = y_coord + y_speed
x2_coord = x2_coord + x2_speed
y2_coord = y2_coord + y2_speed
x3_coord = x3_coord + x3_speed
y3_coord = y3_coord + y3_speed
x4_coord = x4_coord + x4_speed
y4_coord = y4_coord + y4_speed
if GM == 2 and CIP == 2:
D.fill(BLACK)
CIP = 1
if GM == 1:
D.fill(MEXON)
if G >= 6:
B(L6, (80, 150))
if G == 1 and CO == 2:
x_coord = 366
y_coord = 201
x2_coord = 234
y2_coord = 399
x3_coord = 201
y3_coord = 366
x4_coord = 399
y4_coord = 234
CO = 1
elif G == 2 and CO == 2:
x_coord = 240
y_coord = 312
x2_coord = 360
y2_coord = 288
x3_coord = 312
y3_coord = 240
x4_coord = 288
y4_coord = 360
CO = 1
elif G == 3 and CO == 2:
x_coord = 405
y_coord = 228
x2_coord = 195
y2_coord = 372
x3_coord = 228
y3_coord = 405
x4_coord = 372
y4_coord = 195
CO = 1
elif G == 4 and CO == 2:
x_coord = 179
y_coord = 309
x2_coord = 421
y2_coord = 291
x3_coord = 309
y3_coord = 179
x4_coord = 291
y4_coord = 421
CO = 1
elif G == 5 and CO == 2:
x_coord = 315
y_coord = 450
x2_coord = 285
y2_coord = 150
x3_coord = 450
y3_coord = 315
x4_coord = 150
y4_coord = 285
CO = 1
elif G == 6 and CO == 2:
x_coord = 180
y_coord = 390
x2_coord = 420
y2_coord = 210
x3_coord = 390
y3_coord = 180
x4_coord = 210
y4_coord = 420
CO = 1
elif G == 7 and CO == 2:
x_coord = 267
y_coord = 204
x2_coord = 333
y2_coord = 396
x3_coord = 204
y3_coord = 267
x4_coord = 396
y4_coord = 333
CO = 1
elif G == 8 and CO == 2:
x_coord = 363
y_coord = 390
x2_coord = 237
y2_coord = 210
x3_coord = 390
y3_coord = 363
x4_coord = 210
y4_coord = 237
CO = 1
elif G == 9 and CO == 2:
x_coord = 234
y_coord = 273
x2_coord = 366
y2_coord = 327
x3_coord = 273
y3_coord = 234
x4_coord = 327
y4_coord = 366
CO = 1
elif G == 10 and CO == 2:
x_coord = 102
y_coord = 267
x2_coord = 498
y2_coord = 333
x3_coord = 267
y3_coord = 102
x4_coord = 333
y4_coord = 498
CO = 1
if V == 2:
if event.type == event_500ms:
if Blue == 1:
D.fill(BLUE)
Blue = 2
elif Blue == 2:
D.fill(YELLOW)
Blue = 1
B(L1, (47, 45))
B(L2, (47, 60))
B(L2C, (65, 75))
B(L3, (47, 90))
B(L4, (47, 105))
B(L5, (47, 120))
L(D, PINDLER, (40, 5), (695, 5), 10)
L(D, PINDLER, (3, 42), (3, 495), 10)
L(D, PINDLER, (3, 495), (695, 495), 10)
L(D, PINDLER, (695, 495), (695, 5), 10)
L(D, PINDLER, (3, 41), (658, 42), 10)
L(D, PINDLER, (40, 5), (40, 458), 10)
L(D, PINDLER, (40, 458), (658, 458), 10)
L(D, PINDLER, (658, 458), (658, 42), 10)
FINISH(D, Fx, Fy)
MOLINE1(D, x_coord, y_coord)
MOLINE2(D, x2_coord, y2_coord)
MOLINE3(D, x3_coord, y3_coord)
MOLINE4(D, x4_coord, y4_coord)
MOLINE5(D, X5_coord, Y5_coord)
pygame.draw.line(D, PINDLER, (303, 302), (307, 306), 1)
pygame.draw.line(D, PINDLER, (307, 302), (303, 306), 1)
pygame.display.flip()
clock.tick(60)
我会显示所有代码,但它不喜欢正确缩进以使站点将其识别为代码。有一次,我在所有 500 行中手动放置了四个空格。一点都不好玩。
应要求提供更多信息,我冒昧地提供了所有代码。希望这可以帮助。谢谢
import pygame, sys, random
from pygame.locals import *
pygame.init()
BLACK = ( 0, 0, 0)
ABINO = ( 34, 45, 102)
PINDLER = (255, 123, 90)
MEXON = (200, 190, 220)
WHITE = (255, 255, 255)
YELLOW = (255, 255, 0)
RED = (255, 0, 0)
BLUE = ( 0, 0, 255)
size = [700, 500]
D = pygame.display.set_mode(size)
L = pygame.draw.aaline
R = pygame.draw.rect
G = random.randrange(1, 10)
GM = 1
GMT = 2
CIP = 1
CO = 2
V = 0
Blue = 1
event_500ms = pygame.USEREVENT + 1
pygame.time.set_timer(event_500ms, 500)
pygame.display.set_caption("Moline")
myfont = pygame.font.SysFont("monospace", 15)
T = myfont.render
M1S = "RULES:"
M2S = "1. To start, press each arrow key in a random sequence"
M2F = " for roughly one second."
M3S = "2. To win, re-merge the four men on the crossmark."
M4S = "3. Complete before the running man completes a lap."
M5S = "4. Mouse movement is illegal and causes a severe time penalty."
L1 = T(M1S, 1, (255, 255, 0))
L2 = T(M2S, 1, (255, 255, 0))
L2C = T(M2F, 1, (255, 255, 0))
L3 = T(M3S, 1, (255, 255, 0))
L4 = T(M4S, 1, (255, 255, 0))
L5 = T(M5S, 1, (255, 255, 0))
B = D.blit
Fx = 10
Fy = 10
L6 = T("cheeeeeeeeese", 1, (255, 255, 0))
def MOLINE1(D, x, y):
pygame.draw.ellipse(D, BLACK, [1 + x, y, 10, 10], 0)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [10 + x, 27 + y], 2)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [x, 27 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 17 + y], [5 + x, 7 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [9 + x, 17 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [1 + x, 17 + y], 2)
def MOLINE2(D, x, y):
pygame.draw.ellipse(D, BLACK, [1 + x, y, 10, 10], 0)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [10 + x, 27 + y], 2)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [x, 27 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 17 + y], [5 + x, 7 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [9 + x, 17 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [1 + x, 17 + y], 2)
def MOLINE3(D, x, y):
pygame.draw.ellipse(D, BLACK, [1 + x, y, 10, 10], 0)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [10 + x, 27 + y], 2)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [x, 27 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 17 + y], [5 + x, 7 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [9 + x, 17 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [1 + x, 17 + y], 2)
def MOLINE4(D, x, y):
pygame.draw.ellipse(D, BLACK, [1 + x, y, 10, 10], 0)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [10 + x, 27 + y], 2)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [x, 27 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 17 + y], [5 + x, 7 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [9 + x, 17 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [1 + x, 17 + y], 2)
def MOLINE5(D, x, y):
pygame.draw.ellipse(D, BLACK, [1 + x, y, 10, 10], 0)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [10 + x, 27 + y], 2)
pygame.draw.line(D, BLACK, [5 + x, 17 + y], [x, 27 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 17 + y], [5 + x, 7 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [9 + x, 17 + y], 2)
pygame.draw.line(D, PINDLER, [5 + x, 7 + y], [1 + x, 17 + y], 2)
def FINISH(D, x, y):
R(D, BLACK, ( 4, 42, 6, 6))
R(D, WHITE, (10, 42, 6, 6))
R(D, BLACK, (16, 42, 6, 6))
R(D, WHITE, (22, 42, 6, 6))
R(D, BLACK, (28, 42, 6, 6))
R(D, WHITE, (34, 42, 6, 6))
R(D, WHITE, ( 4, 48, 6, 6))
R(D, BLACK, (10, 48, 6, 6))
R(D, WHITE, (16, 48, 6, 6))
R(D, BLACK, (22, 48, 6, 6))
R(D, WHITE, (28, 48, 6, 6))
R(D, BLACK, (34, 48, 6, 6))
R(D, BLACK, ( 4, 54, 6, 6))
R(D, WHITE, (10, 54, 6, 6))
R(D, BLACK, (16, 54, 6, 6))
R(D, WHITE, (22, 54, 6, 6))
R(D, BLACK, (28, 54, 6, 6))
R(D, WHITE, (34, 54, 6, 6))
x_speed = 0
y_speed = 0
x2_speed = 0
y2_speed = 0
x3_speed = 0
y3_speed = 0
x4_speed = 0
y4_speed = 0
x_coord = 300
y_coord = 300
x2_coord = 300
y2_coord = 300
x3_coord = 300
y3_coord = 300
x4_coord = 300
y4_coord = 300
X5_coord = 30
Y5_coord = 10
direction = 'right'
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_speed =- 3
x2_speed = 3
y3_speed =- 3
y4_speed = 3
elif event.key == pygame.K_RIGHT:
x_speed = 3
x2_speed =- 3
y3_speed = 3
y4_speed =- 3
elif event.key == pygame.K_UP:
y_speed =- 3
y2_speed = 3
x3_speed =- 3
x4_speed = 3
elif event.key == pygame.K_DOWN:
y_speed = 3
y2_speed =- 3
x3_speed = 3
x4_speed =- 3
elif event.key == pygame.K_TAB:
GMT += 1
CIP = 2
if GMT % 2:
GM = 2
else:
GM = 1
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
x_speed=0
x2_speed=0
y3_speed=0
y4_speed=0
elif event.key == pygame.K_RIGHT:
x_speed=0
x2_speed=0
y3_speed=0
y4_speed=0
elif event.key == pygame.K_UP:
y_speed=0
y2_speed=0
x3_speed=0
x4_speed=0
elif event.key == pygame.K_DOWN:
y_speed=0
y2_speed=0
x3_speed=0
x4_speed=0
elif event.type == MOUSEBUTTONDOWN:
x_coord = 300
y_coord = 300
x2_coord = 300
y2_coord = 300
x3_coord = 300
y3_coord = 300
x4_coord = 300
y4_coord = 300
X5_coord = 30
Y5_coord = 10
direction = 'right'
D.fill(BLACK)
G = random.randrange(1, 10)
CO = 2
V = 2
elif event.type == MOUSEBUTTONUP:
X5_coord = 30
Y5_coord = 10
direction = 'right'
if direction == 'right':
X5_coord += 10
if X5_coord == 670:
direction = 'down'
elif direction == 'down':
Y5_coord += 10
if Y5_coord == 460:
direction = 'left'
elif direction == 'left':
X5_coord -= 10
if X5_coord == 10:
direction = 'up'
elif direction == 'up':
Y5_coord -= 10
if Y5_coord == 10:
direction = 'right'
x_coord = x_coord + x_speed
y_coord = y_coord + y_speed
x2_coord = x2_coord + x2_speed
y2_coord = y2_coord + y2_speed
x3_coord = x3_coord + x3_speed
y3_coord = y3_coord + y3_speed
x4_coord = x4_coord + x4_speed
y4_coord = y4_coord + y4_speed
if GM == 2 and CIP == 2:
D.fill(BLACK)
CIP = 1
if GM == 1:
D.fill(MEXON)
if G >= 6:
B(L6, (80, 150))
if G == 1 and CO == 2:
x_coord = 366
y_coord = 201
x2_coord = 234
y2_coord = 399
x3_coord = 201
y3_coord = 366
x4_coord = 399
y4_coord = 234
CO = 1
elif G == 2 and CO == 2:
x_coord = 240
y_coord = 312
x2_coord = 360
y2_coord = 288
x3_coord = 312
y3_coord = 240
x4_coord = 288
y4_coord = 360
CO = 1
elif G == 3 and CO == 2:
x_coord = 405
y_coord = 228
x2_coord = 195
y2_coord = 372
x3_coord = 228
y3_coord = 405
x4_coord = 372
y4_coord = 195
CO = 1
elif G == 4 and CO == 2:
x_coord = 179
y_coord = 309
x2_coord = 421
y2_coord = 291
x3_coord = 309
y3_coord = 179
x4_coord = 291
y4_coord = 421
CO = 1
elif G == 5 and CO == 2:
x_coord = 315
y_coord = 450
x2_coord = 285
y2_coord = 150
x3_coord = 450
y3_coord = 315
x4_coord = 150
y4_coord = 285
CO = 1
elif G == 6 and CO == 2:
x_coord = 180
y_coord = 390
x2_coord = 420
y2_coord = 210
x3_coord = 390
y3_coord = 180
x4_coord = 210
y4_coord = 420
CO = 1
elif G == 7 and CO == 2:
x_coord = 267
y_coord = 204
x2_coord = 333
y2_coord = 396
x3_coord = 204
y3_coord = 267
x4_coord = 396
y4_coord = 333
CO = 1
elif G == 8 and CO == 2:
x_coord = 363
y_coord = 390
x2_coord = 237
y2_coord = 210
x3_coord = 390
y3_coord = 363
x4_coord = 210
y4_coord = 237
CO = 1
elif G == 9 and CO == 2:
x_coord = 234
y_coord = 273
x2_coord = 366
y2_coord = 327
x3_coord = 273
y3_coord = 234
x4_coord = 327
y4_coord = 366
CO = 1
elif G == 10 and CO == 2:
x_coord = 102
y_coord = 267
x2_coord = 498
y2_coord = 333
x3_coord = 267
y3_coord = 102
x4_coord = 333
y4_coord = 498
CO = 1
if V == 2:
if event.type == event_500ms:
if Blue == 1:
D.fill(BLUE)
Blue = 2
elif Blue == 2:
D.fill(YELLOW)
Blue = 1
B(L1, (47, 45))
B(L2, (47, 60))
B(L2C, (65, 75))
B(L3, (47, 90))
B(L4, (47, 105))
B(L5, (47, 120))
L(D, PINDLER, (40, 5), (695, 5), 10)
L(D, PINDLER, (3, 42), (3, 495), 10)
L(D, PINDLER, (3, 495), (695, 495), 10)
L(D, PINDLER, (695, 495), (695, 5), 10)
L(D, PINDLER, (3, 41), (658, 42), 10)
L(D, PINDLER, (40, 5), (40, 458), 10)
L(D, PINDLER, (40, 458), (658, 458), 10)
L(D, PINDLER, (658, 458), (658, 42), 10)
FINISH(D, Fx, Fy)
MOLINE1(D, x_coord, y_coord)
MOLINE2(D, x2_coord, y2_coord)
MOLINE3(D, x3_coord, y3_coord)
MOLINE4(D, x4_coord, y4_coord)
MOLINE5(D, X5_coord, Y5_coord)
pygame.draw.line(D, PINDLER, (303, 302), (307, 306), 1)
pygame.draw.line(D, PINDLER, (307, 302), (303, 306), 1)
pygame.display.flip()
clock.tick(60)
pygame.quit()
请注意,这不是成品,因此在某些方面可能看起来很尴尬,因为这个程序已经发展了很多。因此可能有一些未使用的全局变量或一些不准确的文本。
也许你可以试试:
import time
time.sleep(5)
问题是,当您使用 PyGame time
模块。
为避免此问题,您可以创建您自己的事件,每隔给定的毫秒数,该事件就会出现在事件队列中。您可以使用 pygame.time.set_timer()
创建一个事件:
import pygame
pygame.init()
#color tupels
BLUE = (55,155,255)
YELLOW = (255,255,0)
#create a new event id called event_500ms
event_500ms = pygame.USEREVENT + 1
#set timer event to appear on the event queue every 500 milliseconds
pygame.time.set_timer(event_500ms, 500)
screen = pygame.display.set_mode((800,800))
#global variable V for state-machine
V = 0
while True:
#get events from the event queue
for ev in pygame.event.get():
if ev.type == pygame.KEYDOWN and ev.key == pygame.K_ESCAPE:
pygame.quit()
exit()
#left (ev.button == 3) mousbutton down -> set variable V = 1
if ev.type == pygame.MOUSEBUTTONDOWN and ev.button == 3:
V = 1
#check for the event_500ms event
if ev.type == event_500ms:
if V == 1:
screen.fill(BLUE)
V = 2
elif V == 2:
screen.fill(YELLOW)
V = 0
pygame.display.flip() #update whole screen
在这段代码中,我们使用了一种所谓的 state-machine,具有 3 个不同的阶段:
- 设置
V = 1
,如果一个pygame.MOUSEBUTTONDOWN
事件accurse,(下一状态:2) - 填充
screen
蓝色并递增V
,如果变量V
等于1
。 (下一状态:3) - 填充
screen
黄色,其余V
到0
,如果变量V
等于2
. (下一状态:1)
希望对您有所帮助:)
您的问题有两种解决方案,代表您尝试过的两种方法:要么等待特定时间等待下一次报价,要么每次报价都做一些事情,但是您遇到的问题是报价取决于速度计算机是(以及其他因素,例如后台程序 运行ning)。 (我通过你的主循环引用每个 运行,你可能会使用它。)
现在你说 "okay, I want to change the background every fourth tick",问题是这可能是每毫秒,每秒或任何时候。所以我们不需要依赖于发生的滴答声的数量,而是依赖于时间的长短。我们可以使用 time.perf_counter() 来获取当前时间。这给了我们:
#Initialize old_time somewhere
new_time = time.perf_counter()
if new_time - old_time > 0.05:
change_background()
old_time = new_time
通常情况下,您不想对所有与时间相关的事情都这样做。相反,作为 while 循环中的第一件事,计算增量时间,通常称为 dt
while True:
dt = time.perf_counter() - old_time
old_time = time.perf_counter()
change_background(dt)
然后像之前一样处理dt
:
def change_background(dt):
cumulative_time += dt
if cumulative_time > 0.05:
#do things
cumulative_time = 0
另一种方法是使用某种 sleep
。正如您已经看到的那样,这将冻结整个线程——但您可以创建多个线程(当然您不需要使用线程,您可以使用进程或 greenlets 或所有其他花哨的多处理东西)。整个事情有点复杂,所以我不会在这里详细介绍,但一般来说,使用不同的线程进行输入和处理是个好主意。相对较新asyncio
module deals with exactly that kind of problem. There are also different solutions like greenlets or threads。一开始使用异步操作可能会让人感到困惑,第一个解决方案可以让你走得更远。
编辑: 我的答案独立于 pygame,另一个答案中使用的事件会在后台为您完成此操作。理解这个增量时间的想法并使用它仍然是一个好主意,例如在物理计算中。通常依赖于滴答声(而不是时间)是一个坏主意,并且会给你带来意想不到的行为。据说最初的 space 入侵者确实依赖 ticks 进行物理和图形计算。因此,每当您射击足够多的敌人时,它就会加速。这是一个意想不到的结果(然后保留下来,因为它是增加难度的好机制)。仿真器也面临着同样的问题:旧游戏(依赖于滴答而不是时间)通常 运行 速度快得令人难以置信,因为现代计算机具有更强的处理能力。模拟器必须考虑到这一点 "slow processing down".