SDL Video Init вызывает исключение в Mac OS X 10.8

Я только что перенес свою игру на C ++ на OS X и при первом запуске я получаю следующее исключение при попытке вызвать SDL_SetVideoMode,

2012-09-28 15: 01: 05.437 SCRAsteroids [28595: 707] * Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Ошибка (1000) при создании CGSWindow в строке 259»
*
Первый вызов стека вызовов:
(
0 CoreFoundation 0x00007fff8b53b716 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff90e30470 objc_exception_throw + 43
2 CoreFoundation 0x00007fff8b53b4ec + [повышение NSException: формат:] + 204
3 AppKit 0x00007fff8a26a579 _NSCreateWindowWithOpaqueShape2 + 655
4 AppKit 0x00007fff8a268d70 — [NSWindow _commonAwake] + 2002
5 AppKit 0x00007fff8a2277e2 — [NSWindow _commonInitFrame: styleMask: backing: defer:] + 1763
6 AppKit 0x00007fff8a22692f — [NSWindow _initContent: styleMask: поддержка: defer: contentView:] + 1568
7 AppKit 0x00007fff8a2262ff — [NSWindow initWithContentRect: styleMask: backing: defer:] + 45
8 libSDL-1.2.0.dylib 0x0000000107c228f6 — [SDL_QuartzWindow initWithContentRect: styleMask: backing: defer:] + 294
9 libSDL-1.2.0.dylib 0x0000000107c20505 QZ_SetVideoMode + 2837
10 libSDL-1.2.0.dylib 0x0000000107c17af5 SDL_SetVideoMode + 917
11 SCRAsteroids 0x0000000107be60fb _ZN11SDLГрафика4initEP6IWorldii + 291
)
libc ++ abi.dylib: завершить вызов, выдав исключение
Ловушка отмены: 6

Мой код инициализации выглядит так:

if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
return false;

const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo();
if (!videoInfo) {
fprintf(stderr, "Video query failed: %s\n",
SDL_GetError());
return false;
}/* the flags to pass to SDL_SetVideoMode */
videoFlags = SDL_OPENGL;       /* Enable OpenGL in SDL */
videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */
videoFlags |= SDL_HWPALETTE;       /* Store the palette in hardware */

/* This checks to see if surfaces can be stored in memory */
if (videoInfo->hw_available)
videoFlags |= SDL_HWSURFACE;
else
videoFlags |= SDL_SWSURFACE;

if (w == 0) {
widthViewport = videoInfo->current_w;
heightViewport = videoInfo->current_h;
cout << "Will use full screen resolution of ";
videoFlags |= SDL_FULLSCREEN;
} else {
cout << "Will use full user supplied resolution of ";
widthViewport = w;
heightViewport = h;
videoFlags |= SDL_RESIZABLE;       /* Enable window resizing */
}

cout << widthViewport << "x" << heightViewport << "\n";
/* This checks if hardware blits can be done */
if (videoInfo->blit_hw)
videoFlags |= SDL_HWACCEL;

/* Sets up OpenGL double buffering */
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
/* get a SDL surface */
surface = SDL_SetVideoMode(widthViewport, heightViewport,
SCREEN_BPP, videoFlags);

Он входит в этот последний вызов SDL и выдает исключение выше. Я пробовал и в полноэкранном режиме, и в режиме изменяемого размера окна, то же самое.

Я строю свое приложение старой школы, в командной строке, в отличие от использования Xcode.

7

Решение

SDL_main был еще раз виновником. Мой C ++ main процедура была в файле, который не включает SDL.hтак что это не было переопределено SDL_main, Код, который включает SDL вместо этого в статической библиотеке многократного использования, вы не видите никакой основной подпрограммы. Я вручную изменил название моей функции на SDL_main и это означает, что SDL обеспечивает основной основной режим. Я не люблю это делать, но на данный момент, на SDL 1.2.15 для Mac это необходимо.

В Windows тот же новый код вызывает конфликты компоновщика. Это новая проблема.

6

Другие решения

Есть проблемы с вызовом видеокарты в какао. Поэтому вам нужно инициализировать его перед вызовом SDL_Setvideomode

Добавьте следующий метод и сначала вызовите его в вашем основном методе

#include <dlfcn.h>  //To make it work on mac

//This must be called before playing with SDL, else it won't work on osx.

void pre_init()
{
void* cocoa_lib;

cocoa_lib = dlopen( "/System/Library/Frameworks/Cocoa.framework/Cocoa", RTLD_LAZY );
void (*nsappload)(void);
nsappload = (void(*)()) dlsym( cocoa_lib, "NSApplicationLoad");
nsappload();
}

`

2

Та же проблема, но решаемая связыванием libSDLmain (а ​​также libSDL). Это, в свою очередь, требует двух структур: основа и какао.

Я не переименовал основную функцию.

0
По вопросам рекламы [email protected]