2012-09-28 17 views
7

मैं सिर्फ ओएस एक्स और पहली बार यह भाग गया जब SDL_SetVideoMode कॉल करने के लिए कोशिश कर रहा निम्न अपवाद प्राप्त करने के लिए मेरी सी ++ खेल मोड़ा है।एसडीएल वीडियो Init मैक ओएस एक्स पर अपवाद का कारण बनता है 10.8

2012-09-28 15: 01: ०५.४३७ SCRAsteroids [28,595: 707]: 'त्रुटि (1000) लाइन 259 पर CGSWindow बनाने' * पहले फेंक * न आया हुआ अपवाद 'NSInternalInconsistencyException', कारण की वजह से उनका समापन एप्लिकेशन कॉल स्टैक: ( 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,210 5 AppKit 0x00007fff8a2277e2 - [NSWindow _commonInitFrame: styleMask: समर्थन: आस्थगित करें:] 1763 6 AppKit 0x00007fff8a22692f - [NSWindow _initContent: styleMask: समर्थन: आस्थगित करें: contentView:] 1568 7 AppKit 0x00007fff8a2262ff - [NSWindow initWithContentRect: styleMask: समर्थन : आस्थगित करें:] + 45 8 libSDL-1.2.0.dylib 0x0000000107c228f6 - [SDL_QuartzWindow initWithContentRect: styleMask: समर्थन: आस्थगित करें:] 294 9 libSDL-1.2.0.dylib 0x0000000107c20505 QZ_SetVideoMode + 2837 10 libSDL-1.2.0 .dylib 0x0000000107c17af5 SDL_SetVideoMode + 917 11 SCRAsteroids 0x0000000107be60fb _ZN11SDLGraphics4initEP6IWorldii + 291 ) libC++ abi.dylib: एक अपवाद बीच में बंद करें जाल फेंक कहा जाता है समाप्त: 6

मेरे init कोड इस तरह दिखता है:

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); 

यह है कि पिछले एसडीएल कॉल में हो जाता है और इसके बाद के संस्करण अपवाद फेंकता है। मैंने इसे पूर्ण स्क्रीन और आकार बदलने योग्य विंडो मोड में एक ही चीज़ की कोशिश की है।

मैं अपने ऐप पुराने स्कूल का निर्माण, कमांड लाइन पर, के रूप में Xcode का उपयोग करने का विरोध किया।

उत्तर

6

एसडीएल_मेन अभी भी अपराधी था। मेरा सी ++ main दिनचर्या उस फ़ाइल में थी जिसमें SDL.h शामिल नहीं है, इसलिए इसे SDL_main पर फिर से परिभाषित नहीं किया जा रहा था। कोड जिसमें SDL शामिल है, बदले में एक पुन: प्रयोज्य स्थैतिक पुस्तकालय में है, कोई मुख्य दिनचर्या आप नहीं देखते हैं। मैंने मैन्युअल रूप से मेरे फ़ंक्शन का नाम SDL_main पर बदल दिया और इसका मतलब है कि एसडीएल आवश्यक मुख्य दिनचर्या प्रदान करता है। मुझे यह पसंद नहीं है, लेकिन इस पल के लिए, मैक के लिए SDL 1.2.15 पर, यह आवश्यक है।

Windows पर, एक ही नए कोड लिंकर संघर्ष का कारण बनता है। यह एक नई समस्या है।

0

एक ही मुद्दा है, लेकिन (libSDL के रूप में भी) libSDLmain जोड़ने के द्वारा हल किया। इसके बदले में दो ढांचे की आवश्यकता होती है: फाउंडेशन और कोको।

मैंने मुख्य कार्य का नाम नहीं बदला।

+1

आपका मुख्य फ़ाइल SDL.h शामिल हैं की जरूरत है? यदि ऐसा है, तो आपका मुख्य() आपके लिए बदला जा रहा है! – ScrollerBlaster

2

कोको में वीडियोकार्ड को कॉल करने में समस्याएं हैं।तो तुम बुला SDL_Setvideomode

निम्नलिखित विधि जोड़ें इससे पहले कि यह initalize, और यह पहले फोन अपने मुख्य विधि में

#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(); 
} 

`

संबंधित मुद्दे