【问题标题】:Scrolling in SDL2, ie, changing integral coordinates of the giu's layoutSDL2中的滚动,即改变giu布局的积分坐标
【发布时间】:2020-08-30 10:37:41
【问题描述】:

我正在尝试在 SDL2 中的应用程序中模拟“滚动”,但是我认为每次滚动事件发生时移动屏幕上的每个单独对象并不是一种高效/优雅的方式。我对 SDL2 的了解是左上角从坐标 0,0 开始。为了让我更容易实现,是否可以更改 GUI 的左上角起点,以便当我滚动时,它会移动到 0,100 和下一个滚动,0,200 等。我该怎么做呢?谢谢

【问题讨论】:

  • 我对图形做的不多,但我确实记得这里有一种方法。使用 SDL,您可以绘制(因为没有更好的词)完整的显示,然后将其 blit 到屏幕上。如果我没记错的话,要创建一个滚动(如电影学分),您可以将图像绘制为屏幕宽度但根据需要高度(许多倍于显示高度)并保存整个图像。然后,您每次增加偏移量以创建滚动效果,一次对已保存图像的一屏进行 blit。这样您就不会每次都创建每个单独的部分,而是显示预先创建的图像的不同部分。

标签: c++ sdl-2


【解决方案1】:

您可以创建偏移变量,而不是更改对象本身的 x,y 位置,或更改 SDL 的参考坐标(无法做到)。

例如,创建一个名为 ViewPointOffset 的 SDL_Point:

SDL_Point ViewPointOffset;

最好的做法是把它放在你的窗口类中(如果你有的话),或者更好的是,把它放在作为窗口类成员的相机类中。

然后,当您绘制时,只需从您绘制的 x 和 y 坐标中减去偏移量:

void draw(SDL_Renderer* renderer, const SDL_Point ViewPointOffset, SDL_Texture* tex, const SDL_Rect* srcrect, const SDL_Rect* dstrect){
    SDL_Rect* drawrect;
    drawrect->w = dstrect->w;
    drawrect->h = dstrect->h;
    drawrect->x = dstrect->x - ViewPortOffset.x;
    drawrect->y = dstrect->y - ViewPortOffset.y;
    SDL_RenderCopy(renderer, tex, srcrect, drawrect);
}

您可以创建第二个函数,或将布尔值附加到该函数的输入,以允许您忽略偏移量;如果您有一个不想应用偏移的 GUI 按钮等怎么办?

https://github.com/Helliaca/SDL2-Game是一个使用类似方法的小型开源游戏。您可以在 base.cpp/.h 中找到此代码

【讨论】:

  • 我不确定我是否完全理解这一点,我可以看到拥有相机类或窗口类的帮助,但我不确定我会如何做到这一点。我目前的结构方式是“主屏幕”和“其他屏幕”,例如,我有一个处理屏幕的静态类,所以它总是被调用,当我需要打开一个屏幕时,我有一个布尔值,我绝对可以改善这一点。如果我要实现一个相机类,如果每个屏幕对于屏幕上的每个图像和对象都有 x 和 y 位置,我该怎么做?因为现在看来,我必须为每个偏移量
  • 单个图像、文本矩形等
  • @PeterWilson 。最好的做法是给你想要绘制的每个单独的东西一个 SDL_Rect,说明它应该在哪里绘制以及它的大小。有了这个,您需要做的就是将图像(SDL_Texture)、位置(SDL_Rect)和您已经拥有的东西传递给上述函数,然后它就会绘制它。花一些时间来剖析和弄乱我发布的 GitHub 游戏(您可以将代码从它直接复制到您自己的项目中,因为它是公共领域);它会为您节省很多时间。
  • 好的,谢谢你说得通。如果我有一个相机类,我是否会有一个静态类,每个需要它的文件都可以访问它并有一个滚动值添加到每个文件中?例如,这可能不是最好的方法,但我有一个静态事件类,我只在我的 int 主函数中调用 Event_Handling() 的方法,但我将文件包含在需要它的每个其他文件中然后访问/更改其中事件类的静态变量?有点像这样,但有一个相机类?这会是个好方法吗
  • @PeterWilson ,您可以将窗口(包含相机类)传递给您的事件处理程序,如下所示:void Event_Handling(GameWindow* win),并将调用它的函数更改为 Event_Handling(win),您可以在其中执行操作它就像你在传递之前一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 2015-11-26
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多