草庐IT

c++ - 使我的游戏独立于 C++ 中的图形 API

我想让我的游戏独立于所使用的底层图形API(以便在我想将其移植到另一个平台时减少耦合)。我目前正在使用SDL,最初我想将SDL_Renderer封装在GraphicAPI_SDL类中,实现我的通用GraphicAPI接口(interface)。此API会创建Image_SDL(封装SDL_Texture),它实现了我的通用图像接口(interface)。我的问题是,当我想使用我的GraphicAPI实例渲染图像时,底层的GraphicAPI_SDL必须将图像转换为Image_SDL,以获得SDL_Texture。而且这样的造型很丑。处理这种情况的最佳方法是什么?我已经将每个SDL_Te

c++ - 没有 SDL 的 Emscripten

我正在尝试开始使用emscripten,但我似乎找不到那么多关于它的信息。我关注了tutorial,并得到一个简单的helloworld工作。据我所知,正常的GL调用会自动转换为WebGL,但我想知道的是如何设置渲染目标、上下文以及所有没有code>SDL或GLUT或类似的任何内容。有没有办法在没有SDL\GLUT(包括鼠标/键盘输入等)的情况下在emscripten上使用WebGL?我在哪里可以获得有关emscripten的更多信息、示例等? 最佳答案 我建议您使用Cheerp-emscripten的替代品-Cheerp有一个有效

c++ - SDL 不渲染 truetype 字体

我不完全确定这是最好的地方,但我想不出更好的地方我“制作”了一个低分辨率font.(如果您知道它的实际来源,可加分)该字体在gedit中工作正常:但是,当尝试使用SDL_ttf渲染字体时,它主要工作,除了一些多字节unicode字符(特别是“æ”和“℃”),而其他非ASCII字符工作正常。但是(!),所有这些字符都可以与其他字体一起使用(我一直在使用DejaVuSans)其他字体工作正常的事实表明代码不应该受到指责,但以防万一:SDL_Surface*surf=TTF_RenderUTF8_Solid(this->font,(constchar*)text,col);if(surf==

c++ - SDL_GL_SwapBuffers() 间歇性变慢

我正在开发一款sdl/opengl游戏,只是为了好玩。我平均得到了一个不错的fps,但是运动真的很不稳定,因为SDL_GL_SwapBuffers()会随机地花费大量的时间来处理。加载纹理并将其写入缓冲区有时会花费超过100毫秒!我删掉了很多代码,试图弄清楚这是否是我做错了什么,但我运气不佳。当我运行这个基本程序时,它有时仍会阻塞长达70毫秒。主要内容://Don'tforgettolinktoopengl32,glu32,SDL_image.lib//includes#include//SDL#include#include//Video#include"videoengine.h"

c++ - 可变参数模板的单独定义

(底部的最后一个问题)最近,我问了aquestion关于我将如何修复链接器错误(关于涉及模板无效的多个定义的重复符号。因为我在多个源文件中使用函数,所以建议我使用关键字inline允许在header中声明或将声明放在已编译的源文件中。在我意识到inline有一些不好的影响后,我将我的声明放在源文件中。现在这没问题了,除了可变参数模板:templatevoidcleanup(T*t,Args&&...args);我找到了一些明显的解决方案——但不是可变参数模板——使用.tpp文件(但它再次开始声明重复符号)或保留源文件并添加显式实例化。但是voidcleanup有可能使用数百种参数组合,

c++ - 使用 GL_TRIANGLE_STRIP 或索引 GL_TRIANGLES 绘制动态数量的四边形是否更有效

我正在使用C++开发一个基于sprite的简单2D游戏,该游戏使用OpenGL进行硬件加速渲染,并使用SDL进行窗口管理和用户输入处理。由于它是一款2D游戏,我只需要绘制四边形,但由于Sprite的数量是动态的,我永远不能依赖于四边形的数量是恒定的。因此,我需要在每一帧通过我的VBO重新缓冲所有顶点数据(因为四边形可能比上一帧多或少,因此缓冲区的大小可能不同)。到目前为止,我的原型(prototype)程序会创建一个窗口,并允许用户使用向上和向下箭头键在对角线行中添加和删除四边形。现在我画的四边形是简单的、没有纹理的白色方block。这是我正在使用的代码(在OSX10.6.8和Ubun

c++ - 更新 Sprite 位置的奇怪行为

我正在使用SDL库用C++编写一个简单的roguelike游戏,但在屏幕上移动我的角色时遇到了一些问题。每次需要渲染一帧时,我都会使用update()函数更新Sprite的位置,如果玩家静止不动,该函数不会执行任何操作。为了发出移动命令,从而启动动画,我使用了step()函数,每个玩家从一个图block移动到另一个图block时只调用一次。收到“向上”命令后,游戏运行良好,角色在一秒钟内平稳移动到新位置。不过,当“向下”的命令下达后,他的移动速度会减半,而且显然在一秒过去后,瞬间就被“传送”到了最终的位置,身形骤然一闪。运动的代码基本上是相同的,但事实上,在一种情况下增量运动被加到y位

c++ - 为什么我的 unique_ptr 认为它有一个空函数指针删除器?

这个问题在这里已经有了答案:Cannotmovestd::unique_ptrwithNULLdeletertostd::shared_ptr?(2个答案)关闭3年前。我正在尝试使用C++学习SDL。我创建了一个window.hheader和一个window.cpp源文件来存储Window类。在window.h中,它看起来像这样:ClassWindow{public:Window();...private:std::unique_ptrwindow;std::unique_ptrrenderer;...}省略了类中的一些代码。然后,在我的源文件中,在默认构造函数的定义中,我这样做:Wi

c++ - SDL2 & GDB : program received signal ?,未知信号

让我们从描述发生的事情开始:我正在Windows上使用SDL2库。我可以使用它编译程序,当我运行.exe时,它​​工作得很好。当我尝试使用GDB调试它时出现问题-当代码进入SDL_Init或SDL_OpenAudio函数(可能创建新线程)时,GDB停止,显示“程序收到信号?,未知信号”消息,当我恢复执行时程序崩溃。显然GDB(https://www.mail-archive.com/cygwin@cygwin.com/msg149735.html)中存在与线程命名相关的错误,应该在GDB版本7.11.1-1中修复。起初我使用GCC5.1.0(TDM)和GDB7.6.1,所以我决定更新到

c++ - 将外部 C++ 库添加到 CLion 项目

我在Mac上使用CLion,但我无法理解如何将外部库添加到我的项目中。那么,如何将外部库添加到C++项目? 最佳答案 手动编辑CMakeLists.txt,在末尾添加以下行,并为您的系统提供正确的路径和正确的项目名称。此配置适用于Ubuntu17.04工作站。include_directories("/usr/include/SDL2")target_link_libraries(ProjectName"/usr/lib/x86_64-linux-gnu/libSDL.so")希望这对您有所帮助。您可以使用以下方法对其进行测试:#i