2

我正在使用 SDL 开始一个小型 RTS 游戏,这里有一些问题:

  • 我使用小精灵,有没有办法用扫描线显示屏幕 x2 ?我尝试使用 rotozoom 缩放它,但它会减慢游戏速度,我想避免手动缩放我的精灵。
  • 运行时如何在全屏和窗口之间切换?我找到了该 SDL_WM_ToggleFullScreen功能,但根据 SDL 文档,它似乎不适用于 Windows。
  • 为了放置我自己的光标,我用我的指针加载了一个精灵并让它跟随鼠标。但我也想降低帧率, SDL_Delay这样做会使指针移动不流畅。SDL 光标似乎不受应用程序帧速率的影响,它是使用它的更好解决方案吗?如果是,有没有办法使用图片而不是奇怪的蒙版?
  • 有没有更好的限制帧率的方法?
  • 如何为表面着色(如draw_lit_sprite在 Allegro 中)
4

2 回答 2

3

运行时如何在全屏和窗口之间切换?我找到了该SDL_WM_ToggleFullScreen功能,但根据 SDL 文档,它似乎不适用于 Windows。

是的,文档说明该SDL_WM_ToggleFullScreen功能目前仅适用于 X。

我这样做的方式是这样的:

void SdlGraphics::setupScreenSurface() {
    Uint32 flags = 0;
    flags |= SDL_HWSURFACE;
    flags |= SDL_DOUBLEBUF;

    if(isFullScreen) {
        flags |= SDL_FULLSCREEN;
    }

    screenSurface = boost::shared_ptr<SDL_Surface>( 
        SDL_SetVideoMode(width, height, depth, flags), 
        utility::NullDeleter() 
    );
}

void SdlGraphics::setFullScreen(bool fullScreen) {
    if(isFullScreen != fullScreen) {
        isFullScreen = fullScreen;
        setupScreenSurface();
    }
}

对于这些要点:

  • 我使用小精灵,有没有办法用扫描线显示屏幕 x2 ?我尝试使用 rotozoom 缩放它,但它会减慢游戏速度,我想避免手动缩放我的精灵。

  • 如何为表面着色(如draw_lit_sprite在 Allegro 中)

我几乎会推荐使用带有 SDL 的 OpenGL 模式。它会给你硬件加速的自由来做这些事情。rotozoom都是在软件中完成的(据我所知),这就是它如此缓慢的原因。它总是很慢。

在以 2x 绘制精灵时,您可能还有一个选择是将所有内容绘制为 1x 大小的纹理,然后在绘制完所有内容后,将该纹理缩放 2x。然后你只处理一个表面,而不是每帧一遍又一遍地处理许多小的表面。

至于光标问题,听起来您可能希望尽可能快地绘制,但只能以恒定速率更新您的游戏。这样,您将获得流畅的滚动,但游戏不会失控。

于 2009-05-11T21:39:37.500 回答
2

Sprite 大小 - 对于任何类型的实时缩放或旋转,您最好使用 OpenGL,而不是像 SDL 这样的软件 blitter。其他库(例如SFML)会为您完成此操作。

Fullscreen/Windowed - Zack 的回答看起来不错,只需再次调用 SDL_SetVideoMode。

光标移动 - 通常操作系统将鼠标与底层应用程序分开渲染,以使其保持响应。如果您自己渲染鼠标光标,那么您唯一的办法就是更快地渲染您的游戏。我认为您对光标本身没有太多选择(可能是由于跨平台要求)。

帧率 - 许多人建议将游戏中的运动和物理与帧率分离(例如,请参阅“修复你的时间步长”)。另外,请注意 SDL_Delay 对等待时间施加了一个下限,而不是上限。

着色表面 - 同样,这最好由 OpenGL 执行,因为 SDL 不直接支持这一点。

于 2009-05-13T17:09:58.297 回答