玩游戏时cpu占用多少正常:Pygame如何在玩游戏时记录键盘移动

所以我试图让俄罗斯方块也记录玩家的运动,然后播放它,把它想象成一个重放功能。

我试过实现键盘库,但它的问题是,当我尝试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')
0

我创建了一个例子,可以记录,然后重放事件与事件之间大致相同的时间。

按下鼠标左键时,将启用录制,并将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")
class 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:
                pass
# 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语句来帮助跟踪事情。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(885)
Cs陪玩:玩GIF“onmouseover”但只玩一次
上一篇
C语言冒泡排序代码:C语言中的冒泡排序算法(bubble sort algorithm in c)
下一篇

相关推荐

  • comeandgetyourlove音乐爱就在你身边

    Come and Get Your Love是一首热门的歌曲,由美国摇滚乐队Redbone演唱。这首歌曲于1974年发行,被收录在他们的专辑《Wovoka》中。歌曲以放克曲风为主,旋律活泼,曲调悠扬,歌词朗朗上口,深受歌迷喜爱。…

    2023-06-29 07:47:31
    0 60 69
  • codeblocks无法编译运行:Codeblocks无法编译运行的解决方案

    codeblocks无法编译运行的原因可能有很多,下面以一段简单的C语言代码为例,来说明codeblocks无法编译运行的情况。…

    2023-07-11 08:01:55
    0 97 86
  • gitlab ci 自动化部署:使用 Gitlab CI 自动化部署提升开发效率

    GitLab CI 自动化部署是一种基于 GitLab CI/CD 的自动化部署方案,可以实现快速、可靠的部署流程。它将代码提交、构建、测试、部署等步骤集成在一起,使得开发者可以更加轻松地完成部署工作。下面是一个示例 .gitlab-ci.yml 文件,可以帮助你实现 GitLab CI 自动化部署:…

    2023-05-20 05:45:38
    0 53 84
  • xl和xe汽车cvt:探索XL和XE汽车的CVT技术优势

    XL和XE汽车CVT是一种变速器,它使用液力变矩器代替传统的机械变速器,以达到更高的效率。它的工作原理是,当发动机输出功率时,液力变矩器就会将这些功率转换为液压能量,然后将能量传递到变速器的输出轴上,从而实现变速。…

    2023-05-16 07:36:03
    0 26 28
  • js添加css:This is a Title

    使用js添加css可以通过修改元素的style属性来实现,具体代码如下:…

    2023-05-27 12:30:24
    0 44 62
  • css 字符间距:### 世界上最美的地方

    示例示例CSS 字符间距是指在文本中的字符之间添加间距,以增强文本的可读性。它可以使文本更容易阅读,也可以使文本看起来更美观。代码示例:…

    2023-04-15 08:45:29
    0 25 22
  • git 删除commit记录:回滚Git Commit记录

    git删除commit记录可以使用git reset命令。使用方法:…

    2023-07-07 04:31:44
    0 94 67
  • java实现tcp:使用Java实现TCP网络编程

    TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。它使用三次握手来建立可靠的连接,并且在数据传输期间可以检测丢失的数据包并重新发送。…

    2023-01-31 10:33:14
    0 85 42

发表评论

登录 后才能评论

评论列表(67条)