当鼠标在屏幕上移动时,角色仅保持移动?

2024-04-23

我的 while 循环仅在光标在屏幕内移动时维持精灵的移动。我尝试重新组织一些 screen.blits 和 display.update() 和 display.flip()。我似乎无法弄清楚为什么角色在一个像素发生变化后停止,而不是像我预期的那样继续。

    background_image = 'Terrain_Grass_First.png'
    import pygame, sys
    from pygame.locals import *
    pygame.init()
    pygame.display.set_caption('Hans')
    screen_width = 600
    screen_height = 400
    screen = pygame.display.set_mode((screen_width, screen_height),0,32)
    pygame.mouse.set_visible(False)
    sprite = pygame.image.load('Hans_front_still.png').convert_alpha()
    x,y = (0,0)
    movex, movey = (0,0)
    while True:
        for event in pygame.event.get():
                if event.type == QUIT:
                        pygame.quit()
                        sys.exit()

                if event.type == KEYDOWN:
                        if event.key == K_ESCAPE:
                                pygame.quit()
                                sys.exit()
                        if event.key == K_w:
                                y = -1

                        elif event.key == K_a:
                                x = -1

                        elif event.key == K_s:
                                y = +1

                        elif event.key == K_d:
                                x = +1

                elif event.type == KEYUP:
                        if event.key == K_w:
                                y = 0

                        elif event.key == K_a:
                                x = 0

                        elif event.key == K_s:
                                y = 0

                        elif event.key == K_d:
                                x = 0
                movex += x
                movey += y


        screen.fill((0,0,0))
        screen.blit(sprite,(movex,movey))
        pygame.display.flip()

你的循环阻塞pygame.event.get http://www.pygame.org/docs/ref/event.html#pygame.event.get.

您不安排自己的任何活动。

因此,在操作系统向您提供事件(鼠标移动、重画等)之前,您什么也不做。


而且,即使你解决了这个问题,你还是在打电话movex += x每个事件一次。因此,当操作系统向您抛出大量事件时,您的精灵会在屏幕上疯狂地移动,但当事件来得更慢时,它会爬行。这几乎从来都不是你想要的。


解决这两个问题的一个简单方法就是安排您自己的活动。例如,与pygame.time.set_timer() http://www.pygame.org/docs/ref/time.html#pygame.time.set_timer,您可以确保每隔(例如 250 毫秒)收到一个事件,并且您只能在这些事件上移动精灵。例如:

timer_event = pygame.USEREVENT + 1
pygame.time.set_timer(timer_event, 250)
while True:
    for event in pygame.event.get():
        # ...
        elif event.type == timer_event:
            movex += x
            movey += y

另一种选择是设计具有固定帧速率的游戏。

一个简单的例子如下所示:

FRAME_TIME = 50 # 50ms = 20fps
next_frame_time = pygame.time.get_ticks() + FRAMES
while True:
    while True:
        event = pygame.event.poll()
        if event.type == pygame.NOEVENT:
            break
        elif # ...
    pygame.display.flip()
    now = pygame.time.get_ticks()
    if now < next_frame_time:
        pygame.time.wait(next_frame_time - now)
    next_frame_time += FRAMES

现在您可以每 5 帧移动一次。

一个现实的例子必须处理丢失的帧、队列中的事件太多、在以下情况之间进行选择:wait and delay适当地等等

但在大多数情况下,我会选择带有计时器的事件驱动版本,而不是固定帧速率版本,特别是如果您已经沿着这条线走下去的话。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当鼠标在屏幕上移动时,角色仅保持移动? 的相关文章

随机推荐

  • UIApplication.registerForRemoteNotifications() 必须仅从主线程调用

    Xcode 9 iOS 11 在注册推送 远程 通知时向我显示错误 警告 这是错误消息 这是我尝试过的代码 let center UNUserNotificationCenter current center delegate self c
  • getAllCellInfo - 重复值

    我正在使用 getAllCellInfo 从我的手机获取服务和相邻小区信息 未root的LG G5 对于它的价值 但该函数返回所有相邻测量塔的重复数据 在我所在的地区 我的测试数据大部分时间是3G WCDMA 下面是我的 WCDMA 结果的
  • 撤消 chown 和 chmod [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是 Ubuntu 新手 我运行以下命令将文件保存在 htdocs 文件夹中 以便方便地使用 XAMPP 进行编程 但不了解其安全后果 s
  • 允许连接到完整性级别不匹配的 .NET COM 服务器

    我在基于 COM 的客户端 服务器设置方面遇到问题 COM 服务器是用 C NET 4 0 编写的 并作为 注册的 本地服务器运行 根据连接到服务器的应用程序 其他客户端将收到服务器执行失败 HRESULT 异常 0x80080005 CO
  • 我可以强制 TypeScript 编译器使用名义类型吗?

    TypeScript 使用结构子类型 https www typescriptlang org docs handbook type compatibility html 所以这实际上是可能的 there is a class class
  • RoutingError 未初始化常量

    我想在我的应用程序中使用 token authenticatable 使用 Devise Using this https stackoverflow com questions 4627703 using devise tokens to
  • 在 I/O 中使用 char16_t 和 char32_t

    C 11介绍char16 t and char32 t以便于处理 UTF 16 和 UTF 32 编码的文本字符串 但是
  • 这在 imacros javascript 中可能吗?尝试了很多方法都没有成功

    我已经处理了所有事情 但不幸的是它返回了 未定义 的数据 我尝试了许多不同的方法来从该网站获取数据 不成功 我在其他论坛上发布了这个问题 没有人能够解决这个问题来处理完整的数据提取 我需要像这样保存数据 91 228 53 28 8089
  • VS Code 刷新集成终端环境变量,无需重新启动/注销

    如果您在 Windows 上添加 更改某些环境变量 例如 PATH 即使重新启动 VS Code 后 它也不会在 VS Code 集成终端中可用 但是 如果您从 Windows 命令提示符 Powershell 打开该终端 它将具有这些新的
  • 获取设备屏幕分辨率

    我使用以下方法来获取屏幕尺寸 public static Point getScreenSize Context context WindowManager wm WindowManager context getSystemService
  • Laravel 5 Blade 在出现错误时显示空白页而不是抛出异常

    在 laravel 4 中 当你尝试渲染一个不存在的视图时应用程序 视图或者带有未定义变量的视图 laravel 将抛出异常或显示有助于调试的错误 我全新安装了 laravel 5 0 13 并且在对刀片模板进行故障排除时遇到了困难 该模板
  • useCallBack 和 useEffect 无限循环

    根据下面的代码 我需要在任何时候调用一个函数inView是真的 但是使用 useEffect and useCallback列出依赖项 我会导致无限循环 我设法避免它的唯一方法是不列出依赖项 但我收到一条警告 要求我列出它们 我只尝试过us
  • RGB 值作为变量

    如何在 rgb 中存储变量值 我使用这个不起作用的代码 我希望它是这样的 但不知怎的 它没有正确存储 R 将引号放在 200 左右 否则 R 也不起作用 我假设你正在使用 JavaScript 结果在 colval rgb 200 10 1
  • 运行“应用程序时出错:未找到目标设备”。 Android Studio 3.6 预览版

    初学者 无法在 Android Studio 3 6 上运行我的第一个 Android 应用程序 如何进行正确的设置才能在模拟器中查看预览设备 I tried the same question and discussion but fai
  • USR1 信号后可靠地终止睡眠进程

    我正在编写一个 shell 脚本 它定期执行任务并从另一个进程接收 USR1 信号 该脚本的结构类似于这个答案 https stackoverflow com a 27694965 1402511 bin bash trap echo do
  • Pygame 中按钮内的进度条

    期望的行为是 当用户将鼠标放在按钮上时 会出现深灰色进度条并开始以恒定的速度递增 我希望能够确定它完全充满需要多长时间 比如 2 秒 如果在进度条达到 100 之前鼠标移出按钮 进度条应直接变为 0 如果条达到 100 程序应在终端中打印一
  • 将重定向运算符与 Java Runtime Exec 一起使用

    我有这个字符串 在 Windows XP 的 JVM 中与 Runtime exec 一起使用 String cmd encoderFull i originalFull bitrate bitrateVBR i bvhq avi outp
  • 将全屏宽度和高度部分分为 3 行

    我有一个完整的宽度和高度部分 html 主页 我怎样才能将这个部分分成 3 行 div 每个 div 都是全宽并具有响应式背景图像 请建议我如何使用 css 和响应式页面来做到这一点 下面是解决方案 对于背景 2 在 css 代码或媒体查询
  • 在 Objective-c 问题中访问委托静态方法

    我在 Objective c 中遇到了一个奇怪的问题 这是代码 STViewController h import
  • 当鼠标在屏幕上移动时,角色仅保持移动?

    我的 while 循环仅在光标在屏幕内移动时维持精灵的移动 我尝试重新组织一些 screen blits 和 display update 和 display flip 我似乎无法弄清楚为什么角色在一个像素发生变化后停止 而不是像我预期的那