Articles of 窗口管理

OpenGL调整问题

我正在开发一个扫雷游戏。 我正在重新调整窗口的大小。 我正在使用Ubuntu Linux。 以下是代码片段,整个代码在这里 : 这是我在main()的起始处编写的初始化代码, glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (400, 300); glutCreateWindow ("MineSweeper"); glClearColor (1.0, 1.0, 1.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); 这是我的display()函数,我通过glutDisplayFunc(),实际上绘制网格需要扫雷游戏。 glClear (GL_COLOR_BUFFER_BIT); glColor3f (0.0, 0.0, 0.0); glLineWidth (3); float i; for(i = step; i< 1; i+=step) { glBegin(GL_LINES); glVertex3f(i,0,0); glVertex3f(i,1.0,0); […]

LWJGL调整窗口大小和glTranslate中断屏幕分辨率

我正在尝试使用LWJGL制作2D贴图RPG游戏,但是我遇到了显示大小调整的问题。 我希望用户能够将窗口大小重新调整为任意大小,只需展开它(而不是让它们从列表中select一个分辨率选项)。 有关问题,请参阅下面的图像。 默认分辨率: 在重新分辨大小的时候: 正如你可以看到瓷砖在第一张图片中正确绘制。 但是,移动相机并重新调整显示大小后,瓷砖会从屏幕的左下角移开。 默认的屏幕分辨率是800×600。 我有一个使用WASD键的播放器移动的相机对象。 我决定使用glTransaltef(camera.x,camera.y,0)来画什么。 我应该在游戏循环中使用if(Display.wasResized()),然后得到新的分辨率,并以某种方式在glTranslatef函数中使用它? 任何帮助或建议将是伟大的! 编辑:我在Fletcher D的答案中添加了代码,但它产生了这样的: 瓷砖不会被切断,但在瓷砖上方的图像被绘制在1×1像素的大小。 另外,当屏幕分辨率改变屏幕上的所有内容的分辨率改变,这不是我想要的。 我想让屏幕简单地显示更多的世界。 正如我所说我正在使用摇摄相机,随着玩家的WASD键移动。 因此,如果当前的世界显示在0,0到800,600,玩家将窗口重新设置为1080×720,我希望显示器从-140,-60到940,660显示世界。 (在重新resize的同时保持屏幕的中心。

OpenGL渲染到多个窗口,每个窗口有一个主循环

我在过去的一年中写了一个OpenGL框架,我想在不久的将来支持多窗口。 我对我想做什么有了一个想法,但我不确定这是否可能。 我简单介绍一下我的框架的内部工作如下: 一个窗口被创建。 该窗口的渲染上下文被创建。 从接口派生的应用程序被创建。 调用window.run(),传递在窗口中运行的应用程序和用作参数的渲染上下文。 sglr::W32Window w(nCmdShow); w.create(L"DemoApp", sglr::DISPLAY_MODE::ENUM::WINDOWED, sglr::Resolution(800, 800)); sglr::W32Rendercontext r; r.create(w, 4, 0, sglr::CONTEXT_TYPE::ENUM::DEBUG); TestApp app; return w.run(app, r); Win32实现的运行方法如下所示(只是一些代码): mRunningApp->onInit(); // start message loop while (1) { while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } // if message is WM_QUIT, exit loop if (msg.message == WM_QUIT) break; […]

在LibGDX中将可resize设置为false

我有一个小型的工作游戏原型。 我想要做类似的事情 LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration(); cfg.resizable = false; 但是我得到“LwjglApplicationConfiguration无法parsing到一个types” 我能做什么? 还是有不同的方法? 谢谢。

不能中心黑屏之间的屏幕

当我试图使我的游戏适应不同的设备分辨率时,我在调整“黑条”之间的游戏画面时遇到了一个问题。 在我的情况下,我使用LibGdx库中的FitViewport类为我添加黑条。 一切工作正常,黑色的酒吧(在我的情况下是一个酒吧)正在有效地创造必要时。 然而,我的问题是,我的屏幕没有居中,我的游戏的顶部,底部,右侧或左侧都有一个丑陋的黑色条。 例如: 我怎样才能解决这个问题,所以看起来像这样: 这是我的代码: public class NordicMadness extends Game implements ApplicationListener{ private Camera camera; public static FitViewport viewport; @Override public void create () { camera = new PerspectiveCamera(); viewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), camera); AssetLoader.loadAssets(); setScreen(new SplashScreen(this)); System.out.println(Gdx.graphics.getWidth() + ", " + Gdx.graphics.getHeight()); } @Override public void dispose(){ super.dispose(); AssetLoader.dispose(); } @Override […]

OpenGL / SDL2如何用窗口调整渲染区域的大小?

调用SDL_SetWindowSize ,渲染的区域不会随着窗口而改变,所以如果窗口变大,则会在顶部和右侧留下黑色区域。 我正在调整OpenGL视口到新的窗口尺寸。 我正在绘制的所有东西都可以正确缩放,但当窗口变大时会被切断。 我一直在寻找解决scheme整天,我发现所有创建一个新的OpenGL上下文,但这会导致崩溃,除非我重新加载所有我的graphics数据,这似乎只是为了调整窗口大小。 它是默认的帧缓冲区,需要resize? 根据OpenGL wiki , 所有默认的帧caching图像会自动resize,以适应输出窗口的大小。 所以如果默认的framebuffer被resize,为什么只渲染到相同的小区域? 我可以初始化它到尽可能大的分辨率,然后缩小它,但不会导致OpenGL处理​​窗口外的一堆碎片?

如何从我的渲染库中抽象GLFW?

我想在不同的库中分割我的游戏引擎,所以它更容易维护,但是我有一个问题:例如窗口创建是由GLFW处理的,所以我将它封装到一个类中,以便能够与我的图书馆的其余部分。 问题是我不想让使用我的库的应用程序也依赖于GLFW开发头文件,否则当我将用户input传递给应用程序时,它必须知道GLFW及其数据types,并且必须做这样的事情: //Application.cpp #include<mylibrary.h> int main() { myLibrary::window w("Title", 640, 480) myLibrary::event e; while(w.pollEvents(&e)) { if(e.key == GLFW_KEY_ESCAPE) //Unnecessary GLFW dependancy w.close(); } } 因为我的标题是这样的: //mylibrary.h #include <glfw/glfw3.h> namespace myLibrary { class window { public: //Blah-blah-blah private: //Blah-blah-blah GLFWwindow* mWindow; //Blah-blah-blah }; } 我应该如何去从应用程序中抽象GLFW? 而且我不能使用GLFW,因为使其与我的图书馆生态系统的其余部分交互将看起来非常丑陋和不合适,这意味着其他库不仅必须知道渲染库,而且GLFW 。 TL; DR:我怎样才能隐藏我的图书馆用户的GLFW?

这种方式使得XNA游戏窗口无边框安全地用于各种Windows PC?

我find了一个简单的XNA 4.0游戏窗口的无边框的方法 。 以下是文章中的代码: IntPtr hWnd = this.Window.Handle; var control = System.Windows.Forms.Control.FromHandle( hWnd ); var form = control.FindForm(); form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; form.WindowState = System.Windows.Forms.FormWindowState.Maximized; 您将其添加到游戏的构造函数,它完美的作品。 我在几台Windows电脑上进行了testing,效果非常好:即使将游戏的分辨率设置得低于或高于桌面分辨率,游戏也能以全屏模式运行。 我唯一的问题是,你需要在桌面分辨率中提供XNA的SpriteBatch方法(Draw和DrawString)的位置,而不是在游戏的分辨率,而从GraphicsDevice中获取宽度/高度给你后者。 与此同时,DOTA 2具有无边框窗口选项,但如果您的游戏内分辨率低于桌面分辨率,游戏会缩小窗口。 我想知道他们是否有这样做的好理由? 我想问一下,这种方法在个人电脑上使用是否安全,或者偶尔会出现问题? 我特别想知道它是否能与Windows XP一起工作,因为我没有用这个系统的电脑来testing它。

GUI缩放:基于视口的缩放或单个逻辑

我想使用scene2d为libGDX游戏创建一个GUI。 在scene2d中,所有尺寸都以像素为单位(而不是百分比)提供。 所以我想知道处理不同屏幕分辨率的最佳方法是什么? 我想到了两个解决scheme,我想知道如何进行: 使用GUI的固定分辨率(例如1920×1080),优化所有小部件的尺寸,并让视口完成剩下的工作(所以会有超采样或二次采样) 或者为gui写一个resize的逻辑,以适当地调整widget的大小和位置到屏幕的分辨率 有没有什么已知的最佳做法如何处理这个问题?

opengl:用不同的Drawcallback至less运行25个窗口

我需要同时运行至less25个窗口,每个窗口呈现不同的游戏状态。 我将所有25个游戏状态存储在GameState allGameStates [25]types的数组中。 对于每个窗口,我目前正在为25个窗口中的每一个注册一个不同的绘制callback。 glutCreateWindow(title); glutDisplayFunc(allGameStates[i].Draw); 这里的问题是,glutDisplayFunc需要一个参数types的函数ptr,我不能传入一个成员函数ptr。(我使用的是在C中的GLUT) 使Draw函数为静态是不可行的,因为我需要Draw函数根据游戏状态对象中的其他variables进行不同的渲染。 我如何克服这个问题?