我一直试图为我的游戏生成一个静态链接的"单二进制"版本的Windows.我想链接sdl,sdl_image和sdl_mixer,这反过来又引入了一些支持库.不幸的是我还没有找到一种方法来使用cygwin/mingw/gcc来编译和链接.据我所知,所有现有的公共版本只是共享库/ dll.
请注意,我不是在谈论许可.源将是开放的,因此sdl的GPL/LGPLness无关紧要.
我是一名C++程序员,拥有丰富的服务器编程经验.然而,我现在很无聊,我决定解决一个新领域:3D游戏编程,用于学习目的.另外,我认为如果我决定在这个领域工作,这个学习项目可能会成为未来的好简历材料.
我没有从头开始创建一个3D引擎,而是决定仿效我现有的一个:魔兽世界.如果你对原因感到好奇(随意跳过这个):
好的,这是一个很长的序言..现在,我的主要问题如下:我应该使用DirectX,OpenGL,sdl等包装库,还是什么?
在现实世界中最常用的是什么?
而且,让我感到困惑的其他事情:魔兽世界似乎正在使用两者!实际上,通常它使用DirectX,但您可以通过命令行使用"-opengl"开关启动它来使用opengl.
这在游戏中是常见的吗?他们为什么这么做?我想这是很多工作,根据我的理解,无论如何都没有人使用OpenGL(很少有人知道秘密切换).
如果这是通常做的事情,程序员通常会创建自己的3D引擎"包装器",如内部制作的SDL,并基于开关/ #defines/whatnot决定最终调用哪个API函数(DirectX或OpenGL)?或者这个功能是否已经内置在sdl中(您可以随意在DirectX和OpenGL之间切换)?
最后,你有任何书籍建议吗?
谢谢!
有人知道一个有标准小部件的好的SDL GUI库吗?它们中有很多都出现在谷歌中,但大多数看起来都像是在1992年才出现.
使用我的所有SDL/OpenGL程序,帧速率保持在60fps,因此看起来像vsync是启用,但不是我,也不是我的代码或我的设置.所以我想现在如果有办法禁用它,可能在一些深度macOS设置?
曾经有一个SDL_EnableKeyRepeat()在SDL中命名的函数,但在SDL2中不再存在.
我在SDL2-wiki中搜索过但未能找到任何相关内容.
有任何想法吗?
我有一个使用 SDL2 编写的游戏,以及用于绘图的 SDL2 渲染器(硬件加速)。有没有绘制填充四边形或三角形的技巧?
目前,我只是通过绘制大量线条(SDL_Drawlines)来填充它们,但性能很差。
我不想进入OpenGL。
我过去几个月一直在使用sdl 1.2(在Windows上).我正在考虑迁移到1.3.所以我使用cmake和codeblocks来创建静态和动态的libray.now我很困惑如何编译一个程序.我包含了sdl.h header..added链接器中的静态库.但是当我尝试编译很多未定义的错误不断发生:
D:\using font\sdl_2test\main.c||In function 'SDL_main':|
D:\using font\sdl_2test\main.c|9|warning: passing argument 6 of 'SDL_CreateWindow' makes integer from pointer without a cast|
D:\GameDev\SDL-2.0\SDL-2.0.0-6799\include\SDL_video.h|405|note: expected 'Uint32' but argument is of type 'void *'|
D:\using font\sdl_2test\main.c|11|warning: control reaches end of non-void function|
..\..\GameDev\SDL_2\static\libSDL2.a(SDL_windowsmodes.c.obj)||In function `WIN_GetDisplayMode':|
D:\GameDev\SDL-2.0\SDL-2.0.0-6799\src\video\windows\SDL_windowsmodes.c|62|undefined reference to `CreateDCW@16'|
D:\GameDev\SDL-2.0\SDL-2.0.0-6799\src\video\windows\SDL_windowsmodes.c|71|undefined reference to `CreateCompatibleBitmap@12'|
D:\GameDev\SDL-2.0\SDL-2.0.0-6799\src\video\windows\SDL_windowsmodes.c|72|undefined reference to `GetDIBits@28'|
D:\GameDev\SDL-2.0\SDL-2.0.0-6799\src\video\windows\SDL_windowsmodes.c|73|undefined reference to `GetDIBits@28'|
D:\GameDev\SDL-2.0\SDL-2.0.0-6799\src\video\windows\SDL_windowsmodes.c|74|undefined reference to `DeleteObject@4'|
D:\GameDev\SDL-2.0\SDL-2.0.0-6799\src\video\windows\SDL_windowsmodes.c|75|undefined reference to `DeleteDC@4'|
..\..\GameDev\SDL_2\static\libSDL2.a(SDL_windowswindow.c.obj)||In function `WIN_GetWindowGammaRamp':|
D:\GameDev\SDL-2.0\SDL-2.0.0-6799\src\video\windows\SDL_windowswindow.c|530|undefined reference to `CreateDCW@16'|
D:\GameDev\SDL-2.0\SDL-2.0.0-6799\src\video\windows\SDL_windowswindow.c|532|undefined reference to `GetDeviceGammaRamp@8'|
D:\GameDev\SDL-2.0\SDL-2.0.0-6799\src\video\windows\SDL_windowswindow.c|536|undefined reference to …Run Code Online (Sandbox Code Playgroud) 我想在显示器上绘制像素,这些像素在某些参数后经常变化.EG如果红色和绿色像素发生碰撞,它们都会消失,等等.
在每一帧中,我必须操纵大约100-1000像素.我这里有一个多线程的方法,它不会给我30FPS(我想要的).目前我在RAM中存储了一个像素阵列,其中包含所有像素并且具有SDL_Surface.当数组中的像素发生变化时,它也会在Surface中发生变化,然后在完成所有操作后,会对屏幕进行blitting.我目前的做法太慢了,我对如何提高速度做了一些思考.
我目前的想法是:
SDL_Surface或SDL_Texture关于如何以快速方式操作像素,还有其他方法吗?
我使用SDL2在C++中拼凑了一个非常基本的游戏循环,我注意到每隔几秒,SDL_PollEvent似乎异常缓慢,即使什么也没发生.
我发送deltaTime来控制每个循环,它在SDL_PollEvent滞后的周期上差不多100ms.我已经通过移动我的计时器确认了这个功能,但我不确定在哪里进一步诊断问题.
我的循环:
while (!quit) {
uint32_t startTime = SDL_GetTicks();
while (SDL_PollEvent(&e) != 0) {
std::cout << "Event: "<< e.type << std::endl; // Added later, read update
if (e.type == SDL_QUIT) {
quit = true;
}
}
if (engine.AllowUpdate()) { // Restricts updates to every 20ms
GameState::Update();
}
engine.rMan.BeginRender();
//^v Literally just SDL_RenderClear and SDL_RenderPresent
engine.rMan.FinishRender();
engine.deltaTime = SDL_GetTicks() - startTime;
std::cout << std::setw(10) << engine.deltaTime;
}
Run Code Online (Sandbox Code Playgroud)
我也注意到即使我没有调试也会发生这个问题,而且至少还有一台其他机器没有.任何有关如何进行的建议都将非常受欢迎.
编辑1:尝试打印以控制通过队列的所有事件,以查看其中一个是否导致问题.在上面的代码中添加了打印行.在有滞后的时候似乎没有发生任何事件,而我却无所事事.
编辑2:根据要求,一些可运行的代码,使用SDL 14在VS2017上使用SDL2-2.0.9构建:
#include <iostream>
#include <SDL.h>
void InitSDL();
void …Run Code Online (Sandbox Code Playgroud) 当通过pysdl2与sdl2一起玩时,我注意到了一个奇怪的副作用,即一旦sdl脚本运行了不相关的窗口,这些窗口通常在移动时会变成半透明,现在却变得不透明。
如果不是因为the的感觉表明我在做根本上是错误的事情,我不会那么介意。
有人能启发我这里发生了什么吗?
这是我的脚本:
import sdl2
import sdl2.ext as se
import time
def main():
k = 2
event_buffer = (k * sdl2.SDL_Event)()
se.init()
window = se.Window("what the ?", size=(400, 300))
window.show()
while True:
window.refresh()
time.sleep(0.01)
sdl2.SDL_PumpEvents()
sdl2.SDL_PeepEvents(event_buffer, k, sdl2.SDL_GETEVENT,
sdl2.SDL_FIRSTEVENT, sdl2.SDL_LASTEVENT)
for event in event_buffer:
if not event.type:
continue
elif event.type == sdl2.SDL_QUIT:
se.quit()
break
else:
pass
event.type = 0
else:
continue
break
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
这是一个前后屏幕抓取:
KDE 5.45.0没有运行sdl脚本的桌面的“系统设置”窗口,显示了相关的设置桌面Effects>Translucency。注意,窗口是半透明的,因为在拍照时我正在拖动它。
相同,但运行的是sdl脚本。请注意,尽管我大力拖动窗口,但窗口仍然顽固不透明。