是否可以使用可在运行时使用的SDL在程序中嵌入图像.
例如,我有一个程序在启动时显示包含徽标和版权信息的启动画面.而不是将此图像放在位图文件中,并使用SDL_LoadBMP将其加载到SDL_Surface.我希望将图像嵌入到程序二进制文件中,以阻止某人可能更改启动图像和版权名称.
有没有人对如何做到这一点有任何建议?示例代码会很棒.
我正在寻找将我在GTK2和SDL1.2中编写的模拟器移植到使用QT5和SDL2.0.3.到目前为止,只要模拟器在SDL2中独立工作并且GUI在QT中工作正常,它们都可以互动.我的问题是尝试让SDL2出现在QWidget中.这是使用窗口黑客方法在SDL1.2中正常工作的东西.
从一切我在线阅读,这可以用下来SDL_CreateWindowFrom函数获取winId()从Qt物件,并将其传递到它.但是,这似乎适用于使用openGL的情况.
我想知道的是当我只使用SDL2的标准绘图功能到纹理,没有OpenGL时如何做到这一点.到目前为止,我所有的尝试都失败了,SDL根本没有出现在小部件中.
或者,我知道您可以将SDL_Suface转换为QImage.每当QImage更新(60fps)时,我将如何让QT Widget更新.与此相关的复杂因素是QT和SDL在单独的线程中运行.
如果有人知道指向我的方向或一些可能导致答案的有用示例代码,我会非常感激.我没有提供代码,因为我还不确定如何做,提供任何代码.
EDIT
Run Code Online (Sandbox Code Playgroud)
经过一些SDL和QT的试验.我已经设法使用标准绘图工具将SDL2绘制到QWidget中.但是,这仅在将渲染器设置为时才有效SDL_RENDERER_SOFTWARE.如果我尝试使用SDL_RENDERER_ACCELERATED,我也会这样做.它导致QT窗口完全锁定并且无法绘制任何内容(包括窗口中的所有其他小部件),并最终因操作系统没有响应而终止(在我的测试用例中为Kubuntu).
有没有人知道为什么会这样.SDL_RENDERER_ACCELERATED当SDL2绘制到用SDL_CreateWindow和创建的自己的窗口时,我可以使用SDL_CreateRenderer.绘制到QWidget时它只是一个问题.
这是我到目前为止的代码:
main.cpp中
#include "mainwindow.h"
#include <QApplication>
#include <SDL2/SDL.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = SDL_CreateWindowFrom((void*)w.ptr_gfx->winId());
SDL_Renderer* render = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
SDL_SetRenderDrawColor(render, 255, 0, 0, 255);
SDL_RenderFillRect(render, NULL);
SDL_RenderPresent(render);
return a.exec();
SDL_DestroyWindow(window);
SDL_DestroyRenderer(render);
SDL_Quit();
}
Run Code Online (Sandbox Code Playgroud)
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{ …Run Code Online (Sandbox Code Playgroud) 有谁知道如何让 SDL_GetKeyState 正常工作,而不必设置轮询 SDL 事件的循环?
int *keystates;
keystates = SDL_GetKeyState(NULL);
SDL_PumpEvents();
std::cout << "Test 1\n";
if (keystates[SDLK_F1]) {
std::cout << "Test 1 Okay\n";
key_ac = true;
emu->setPower(true);
}
Run Code Online (Sandbox Code Playgroud)
这段代码每秒运行 100 多次,但是即使我按住 F1 键,我仍然没有得到任何输出表明它成功了。
我没有 SDL 事件循环,所以这可能是因为我没有使用它们而丢弃事件吗?在这种情况下,我怎样才能让 SDL 过滤掉所有事件?
我注意到 Glade 只允许您设置要在 GTK 回调的用户数据部分中传递的对象。
有什么方法可以传递整数值吗?
我有一组菜单项,我想将它们指向同一个回调函数,但是对于一小部分代码,我需要确定哪个菜单项是调用回调的菜单项。
注意:我的所有信号都是使用glade_xml_signal_autoconnect自动设置的,我更愿意保持这种方式。