关于SDL的一系列问题

时间:2009-05-11 21:26:32

标签: video sdl

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

  • 我和小精灵一起工作,是 有一种显示屏幕的方法 x2与扫描线?我试过缩放 它与rotozoom但它减慢了 游戏,我想避免手工缩放我的精灵。
  • 如何切换 在全屏和窗口之间 跑?我找到了 SDL_WM_ToggleFullScreen功能但是 它似乎不适用于Windows 根据SDL doc。
  • 为了放置我自己的光标,我用指针加载一个精灵 让它跟随鼠标。但我愿意 也喜欢降低帧率 SDL_Delay并且这样做了 指针动作不顺畅。 SDL 光标似乎没有受到影响 应用程序帧率是一个 更好的解决方案是使用它,如果是这样,有没有办法使用图片而不是奇怪的面具?
  • 是否有更好的限制帧率的方法?
  • 我怎样才能表面(就像draw_lit_sprite一样 快板)

2 个答案:

答案 0 :(得分:3)

  

如何在跑步时在全屏和窗口之间切换?我找到了SDL_WM_ToggleFullScreen函数,但根据SDL doc,它似乎在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但它减慢了游戏速度   我想避免缩放我的   手工精神。

  •   
  • 如何表面(如Allegro中的draw_lit_sprite

  •   

我几乎建议在SDL中使用OpenGL模式。它将为您提供硬件加速自由来完成这些事情。 rotozoom都是用软件完成的(据我所知),这就是为什么它太慢了。它总是很慢。

在2x处绘制精灵时,您可能拥有的另一个选项是将所有内容绘制为1x大小的纹理,然后在绘制完所有内容后,将该纹理缩放2x。然后,你只需要处理单个表面,而不是每帧处理多个小表面。

至于光标问题,听起来你可能想成为drawing as fast as possible, but only updating your game at a constant rate。这样你就可以顺利滚动,但游戏玩法不会失控。

答案 1 :(得分:2)

精灵大小 - 对于任何类型的实时缩放或旋转,您最好使用OpenGL而不是像SDL这样的软件阻击器。其他库如SFML为你包装了这个。

全屏/窗口 - Zack的答案看起来不错,只需再次调用SDL_SetVideoMode。

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

帧率 - 许多人建议将你的帧速率与游戏中的运动和物理分离(例如,参见'Fix Your Timestep')。另外,请注意SDL_Delay对等待时间施加下限,而不是上限。

着色表面 - 再次,这最好由OpenGL执行,因为SDL不直接支持它。