【发布时间】:2014-10-01 07:40:10
【问题描述】:
我一直在尝试提高我的 C++ 技能,并通过使用 SDL 等库探索不同的编程方式。
这个特殊的程序是一个粒子系统,我遵循了 youtube 上的指南,可以在这里找到:http://www.youtube.com/watch?v=6Z5FI5180oo&list=UU6A2B9G_y-fzAXEu2hHPlMg。
问题是本指南使用的是 SDL 1.2,而我一直在尝试将此处使用的废弃函数转换为 SDL 2.0。
除了我尝试从 Windowsurface 检索宽度/高度/像素/间距的某些功能外,它基本上可以正常工作。 SDL 1.2 使用函数 GetVideoSurface() 而我相信 SDL2.0 应该使用 GetWindowSurface()。
在我的主函数之外访问此函数时遇到问题,我不确定问题到底是什么。
例如,在我的particle::show() 函数中,我有以下代码:
void particle::show()
{
Uint8* pixels=(Uint8*)SDL_GetWindowSurface(window)->pixels;
Uint8* pixel=pixels+(int)y*SDL_GetWindowSurface(window)->pitch+(int)x;
*pixel=color;
}
在这里我无法访问这些功能,我没有收到错误消息。即使我尝试使用 SDL_GetError()。程序因分段错误而崩溃,没有其他错误(我可以看到。)
这是我的主要功能:
int main(int argc, char** argv)
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window *window = SDL_CreateWindow("My Particles",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
640, 480, SDL_WINDOW_OPENGL);
bool running = true;
const int FPS = 30;
Uint32 start;
srand(time(0));
particleEngine ps (100, SDL_GetWindowSurface(window)->w/2, SDL_GetWindowSurface(window)->h/2);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
while(running)
{
start = SDL_GetTicks();
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
running = false;
break;
}
}
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
ps.refresh();
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
}
SDL_Quit();
return 0;
}
我已在每个函数之外将我的 SDL_Window *window 定义为全局变量。 我正在运行 SDL 2.0 和 Mac OS X 10.10 Yosemite Beta 2
任何想法我应该如何解决这个问题?
【问题讨论】:
-
您应该尝试发布一个简短的完整示例。在您发布的代码中,我看到的唯一
SDL_Window*是 main 的本地变量,它不是全局变量。也许,由于您使用的是particle成员函数,您应该将指针传递给类的实例并将其缓存在那里。 -
请注意,SDL 1.2 的 SDL_GetVideoSurface() 没有替代品。在 SDL 2.0 中,您必须传递您在 main() 中创建的
window。另外,您的particle::show()调用SDL_GetWindowSurface(window)-window来自哪里?它在哪里创建/初始化? -
如上所述,我已将其声明为 SDL_Window *window;然而,这显然不起作用。可能是因为我想我主要重新启动它?我应该尝试将它传递给 ps.refresh 函数吗?像 ps.refresh(window) 一样,然后将其从那里传递给particle::show() 函数?
-
如果你有一个定义为
SDL_Window *window;的全局变量,你必须在某个地方初始化它。也许你在 main() 中的SDL_Window *window = SDL_CreateWindow(...)应该只是window = SDL_CreateWindow(...)