所以我试图让俄罗斯方块也记录玩家的运动,然后播放它,把它想象成一个重放功能。
我试过实现键盘库,但它的问题是,当我尝试record(recorded_events = keyboard.record("esc"))
它整个游戏冻结,直到我按下“esc”,当我尝试播放它,它冻结,什么也不做。
我注意到的是,如果我把 print 语句放在播放旁边,它会在游戏冻结时打印整个键盘输入,但无论如何都无法播放。
IDK 做什么
我的代码片段,它接受输入和滴答,并把它们放在文本文件中。
if event.key == pygame.K_DOWN:
increaseGravity = True
u = " s\n"
time = str(pygame.time.get_ticks())
e = time + "," + u
f.writelines(str(e))
和负责播放的代码部分!
if event.key == pygame.K_h:
f = open("m.txt", "r")
currtick = pygame.time.get_ticks()
for x in f:
b = x.split(',')
cc = int(b[0])
if cc == currtick:
print(" works")
keyboard.press_and_release(b[1].strip)
这是文本文件的外观,第一个是刻度和第二个运动
1453, d
1763, d
2752, a
以下建议:
if event.key == pygame.K_h:
currtick = pygame.time.get_ticks()
for x in keyList:
# Variable that counts
cx = 0
# current tick time combined with the movment tick
cc = (int(keyList[cx][0])) + currtick
# puts key id into xx variable
xx= int(keyList[cx][1])
#prints both
print(keyList[cx][0],keyList[cx][1])
#adds +1 to cx
cx =+ 1
# if current tick + time when pressed is equal to current game tick it executes print and presses the key
if cc == currtick:
print(" works")
if(xx == 1073741904):
keyboard.press_release('a')
我创建了一个例子,可以记录,然后重放事件与事件之间大致相同的时间。
按下鼠标左键时,将启用录制,并将KEYDOWN
事件及其发生时间附加到列表中。再次单击鼠标左键将禁用录制。右键单击将通过scheng要发生的自定义事件开始播放录制的事件。发生该事件时,录制的事件为inserted into the event queue。然后,将计时器设置为刚刚发布的事件与下一个事件之间的时间差。
import time
import random
import pygame
CUSTOM_PLAYBACK_ = pygame.USER + 1
def queue_next_event(event_list, event_index):
"""Set a timer for the next playback event"""
if event_index == 0:
timer_duration = 100 # effectively immediate
else:
elapsed_time = event_list[event_index][1] - event_list[event_index - 1][1]
timer_duration = round(elapsed_time * 1000) # convert to milliseconds
pygame.time.set_timer(CUSTOM_PLAYBACK_, timer_duration)
print(f"{time.time()} Set timer for {timer_duration} ms")
cl Block(pygame.sprite.Sprite):
def __init__(self, size, pos):
pygame.sprite.Sprite.__init__(self)
self.size = size
self.image = pygame.Suce([size[0], size[1]])
self.image.fill(pygame.color.Color("blueviolet"))
self.rect = self.image.get_rect()
self.rect[0] = pos[0]
self.rect[1] = pos[1]
# initially stationary
self.speedx = 0
self.speedy = 0
def update(self):
"""Move, but stay within window bounds"""
width, height = screen.get_size()
if not (self.size[0] // 2) < self.rect.center[0] < (width - self.size[0] // 2):
self.speedx *= -1 # reverse direction
self.rect.x += self.speedx
if not (self.size[1] // 2) < self.rect.center[1] < (height - self.size[1] // 2):
self.speedy *= -1 # reverse direction
self.rect.y += self.speedy
def draw(self, screen):
# Add this draw function so we can draw individual sprites
screen.blit(self.image, self.rect)
def handle_event(self, event):
# update speeds based one keypress
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
self.speedx -= 1
elif event.key == pygame.K_RIGHT:
self.speedx += 1
elif event.key == pygame.K_UP:
self.speedy -= 1
elif event.key == pygame.K_DOWN:
self.speedy += 1
elif event.key == pygame.K_SPACE:
self.speedx = 0
self.speedy = 0
else:
p
# initialise screen
screen = pygame.display.set_mode((800, 800), pygame.RESIZABLE | pygame.NOFRAME)
pygame.init()
sprite_list = pygame.sprite.Group()
# create a cube at a random position
cube = Block((80, 80), (random.randint(100, 700), random.randint(100, 700)))
clock = pygame.time.Clock()
# variables for recording
recording = False
playback = False
playback_index = 0
recorded_events = []
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
run = False
else:
# handle the event
cube.handle_event(event)
if recording:
# save the event and the time
recorded_events.append((event, time.time())) # event
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.on == 1: # Left click
recording = not recording # toggle recording
elif event.on == 3: # Right click toggles playback
playback = not playback
if playback:
if recorded_events:
playback_index = 0 # always start playback at zero
queue_next_event(recorded_events, playback_index)
else:
playback = False # can't playback no events
else: # disable playback timer
pygame.time.set_timer(CUSTOM_PLAYBACK_, 0)
elif event.type == CUSTOM_PLAYBACK_:
pygame.time.set_timer(CUSTOM_PLAYBACK_, 0) # disable playback timer
# post the next event
pygame.event.post(recorded_events[playback_index][0])
playback_index += 1
if playback_index < len(recorded_events):
queue_next_event(recorded_events, playback_index)
else:
playback = False
# clear the screen
screen.fill(pygame.Color("white"))
# update sprites
cube.update()
# draw sprites
cube.draw(screen)
# refresh display
pygame.display.update()
clock.tick(60) # limit to 60 FPS
pygame.quit()
记录的事件不会被清除,所以如果你停止并开始记录会有一个更大的差距,有一个 debugprint
语句来帮助跟踪事情。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(15条)