这些论据有什么用?还有其他方法可以在不使用 main 中的参数的情况下运行 SDL 吗?
int main( int argc, char* args[] )
Run Code Online (Sandbox Code Playgroud) 我想制作一个包含 SDL_Surface 、 SDL_Rect 、表面宽度和高度的结构,
这是原型:
typedef struct wall wall;
struct wall {
SDL_Surface *wall;
SDL_Rect wallpos;
int x;
int y;
};
Run Code Online (Sandbox Code Playgroud)
问题是我不想手动生成 wall.x 和 wall.y。
是否有任何 SDL_function 可以根据加载的图像的尺寸确定 SDL_surface 的宽度/高度?
我正在使用 SDL_SetTextureColorMod 函数来修改纹理。正如在这个问题的答案中看到的,该函数本身不修改纹理,只在绘制时进行颜色修改。
问题是,在调用 SDL_SetTextureColorMod 时,我无法重置效果,而且我在网上找不到任何东西。简而言之,我想为纹理添加例如变暗效果。但是,我希望能够绘制原始纹理。在应用程序中按 G 时,会应用效果。我也试过
SDL_SetTextureColorMod(texture, 1, 1, 1);
Run Code Online (Sandbox Code Playgroud)
但这并没有重置效果
代码
#include <SDL.h>
#include <SDL_image.h>
#include <iostream>
using namespace std;
int main2();
int WinMain()
{
main2();
}
SDL_Texture* LoadTexture( const string& Filename, SDL_Renderer * renderer )
{
if(renderer == nullptr)
return nullptr;
SDL_Texture* texture = IMG_LoadTexture( renderer, Filename.c_str() );
if ( texture == nullptr )
{
std::cout << __FUNCTION__ << "(...): " << "Failed to load texture " << Filename << " error …Run Code Online (Sandbox Code Playgroud) 我是 SDL 和游戏开发的新手。我想制作一个游戏,我需要在游戏窗口中放置一个“开始”按钮。所以请任何人都可以帮助我如何做到这一点?整个屏幕没有鼠标事件我只想创建一个按钮来点击它,我可以在哪里插入按钮的代码?这是我的代码:
int main (int argc, char *argv[]){
int quit = 0;
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = NULL;
window = SDL_CreateWindow("Snaykie v1.0",350, 150, 800, 500, SDL_WINDOW_SHOWN);
if (window == NULL){
std::cout << "Can not open the game" << std::endl;
return 0;
}
SDL_Renderer* renderer = NULL;
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Event* evt = new SDL_Event();
SDL_Texture* txt = NULL;
txt = IMG_LoadTexture(renderer, "mainview.bmp");
SDL_Rect rct;
rct.x = 0 ;
rct.y = 0;
rct.h = 500;
rct.w = 800;
SDL_Surface …Run Code Online (Sandbox Code Playgroud) $ make
g++ main.cpp -I/mingw/include -L/mingw/lib -w -Wall -lSDL2main -lSDL2 -o test
/usr/lib/../lib/libmsys-2.0.a(libcmain.o): In function `main':
/msys_scripts/msys2-runtime/src/msys2-runtime/winsup/cygwin/lib/libcmain.c:37: undefined reference to `WinMain'
/msys_scripts/msys2-runtime/src/msys2-runtime/winsup/cygwin/lib/libcmain.c:37:(.text.startup+0x94): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `WinMain'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
Mingw 教程和我的教程之间的区别是 '-lmingw32' 选项。
但是 MSYS2 中没有“mingw32”文件。
如何解决?
我想用 RenderDoc 调试我的程序。我使用标准函数创建了上下文SDL_GL_CreateContext。使用 RenderDoc 运行应用程序时出现此错误:
捕获 OpenGL。上下文不是通过 CreateContextAttribs 创建的。捕获已禁用。仅支持 OpenGL 3.2+ 上下文。
我在创建上下文之前添加了这个参数:
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
Run Code Online (Sandbox Code Playgroud)
这应该会强制执行核心配置文件,但错误仍然存在。
我在这里做错了什么?
- - -编辑 - - -
即使在强制使用 3.2 版本(需要确切的版本)之后,事情仍然会抱怨。
这是我的窗口类的初始化块:
//System init
if(!SDL_WasInit(SDL_INIT_EVERYTHING))
SDL_Init(SDL_INIT_EVERYTHING);
this->SDL_window = SDL_CreateWindow(title,10,10,w,h,SDL_WINDOW_OPENGL);
if(this->SDL_window!=NULL)
{
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
this->context = SDL_GL_CreateContext(SDL_window);
if(!this->context)
{
SDL_DestroyWindow(SDL_window);
COUT<<"FAILED TO CREATE CONTEXT. PRINTING ERROR AND THROWING EXCEPTION"<<ENDL;
COUT<<SDL_GetError()<<ENDL;
throw "ENGINE::WINDOW::GLCONTEXTERR";
}
glewExperimental = GL_TRUE;
glewInit();
}
else
{
COUT<<"FAILED TO CREATE WINDOW. PRINTING ERROR AND THROWING EXCEPTION"<<ENDL;
COUT<<SDL_GetError()<<ENDL;
throw "ENGINE::WINDOW::SDLWINDOWERR"; …Run Code Online (Sandbox Code Playgroud) 我想在 3D 之上做一些 2D,这样我就可以做一个像样的 GUI。所以我创建了纹理等等。
我可以编译代码,它不会产生任何错误。但是当我运行程序时一切正常,直到我调用以下命令:
glGenFramebuffers(1, &fb);
Run Code Online (Sandbox Code Playgroud)
然后出现这样的情况:
error 139 segmentation fault (core dumped).
Run Code Online (Sandbox Code Playgroud)
有人知道代码有什么问题吗?
std::cout << "test1" << std::endl;
unsigned int fb;
glGenFramebuffers(1, &fb);
std::cout << "test2" << std::endl;
glBindRenderbuffer(GL_RENDERBUFFER, fb);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTexture.getId(), 0);
Run Code Online (Sandbox Code Playgroud)
显示“test1”文本,但不显示“test2”。
代码:
游戏.cpp
#include "game.h"
game::game(){
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface* screen = SDL_SetVideoMode(1000, 600, 32, SDL_SWSURFACE|SDL_OPENGL);
glClearColor(0.5, 0.5, 0.5, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, 1000.0/600.0, 1.0, 500.0);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
}
game::~game(){
SDL_Quit();
}
void game::start(){
Uint32 start;
SDL_Event event;
texture renderTexture = texture();
glTexImage2D(GL_TEXTURE_2D, …Run Code Online (Sandbox Code Playgroud) 我开始在 SDL 2.0 中编程。我希望能够将 .PNG 文件加载到我的程序中,因为 .bmp 文件没有 .png 文件的所有简洁功能。
我有来自http://www.sdltutorials.com/sdl-image的以下代码:
SDL_Surface* loadSurf(char* File) {
SDL_Surface* Surf_Temp = NULL;
SDL_Surface* Surf_Return = NULL;
if((Surf_Temp = IMG_Load(File)) == NULL) {
return NULL;
}
Surf_Return = SDL_DisplayFormatAlpha(Surf_Temp);
SDL_FreeSurface(Surf_Temp);
return Surf_Return;
}
Run Code Online (Sandbox Code Playgroud)
该函数的重点是加载图像,您可以通过执行以下操作来调用它:
SDL_Surface* character = loadSurf("sprite.png");
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时,“Surf_Return = SDL_DisplayFormatAlpha(Surf_Temp);”行出现错误。错误是:使用未声明的标识符“SDL_DisplayFormatAlpha”
我认为这是因为代码是为 SDL 1.2 编写的,而我使用的是 SDL 2.0。有没有办法将此功能转换为 SDL 2.0?
如果适用,我正在运行 Mac OSX 10.13.2。
所以最近我在 Windows 10 上下载了 Linux 子系统和 Ubuntu。
我可以使用该命令将 SDL2 应用程序编译到 Linux g++,但每当我尝试使用i686-w64-mingw32-g++此命令执行此操作时,都会收到一条错误消息main.cpp:5:9: fatal error: SDL2/SDL.h: No such file or directory。
我使用的命令是i686-w64-mingw32-g++ main.cpp -w -lSDL2 -o main.exe.
https://i.stack.imgur.com/TlZmQ.jpg
有人知道如何解决这个问题吗?:(
[编辑]
所以现在我尝试使用以下命令指定必要文件的目录:g++ main.cpp -I/usr/include/SDL -L/usr/lib/x86_64-linux-gnu -w -Wall -Wextra -std=c++17 -lSDL2 -o main
这有效,但是当我将它与 mingw 一起使用时,它不起作用i686-w64-mingw32-g++ main.cpp -I/usr/include/SDL -L/usr/lib/x86_64-linux-gnu -w -Wall -Wextra -std=c++17 -lSDL2 -o main