SDL_Quit() function is effectively ignored by Emscripten and does not do
anything. If you want to fully quit the application, you can do exit(0)
like you're now doing, or if you want to just temporarily pause running the
main loop, you can call the emscripten_cancel_main_loop function. That has
the option that you can later on resume it. With exit(0), the application
quits and you will have to reload the page to rerun the app.


2014-04-07 8:26 GMT+03:00 <[email protected]>:

>
> <https://lh5.googleusercontent.com/-g4Pi0NcSSCE/U0I0i9ff4XI/AAAAAAAAAAs/aAOV86ZP_yE/s1600/sdlquit+ignored.JPG>
> Thanks that really made things clearer for me. The only thing is now I'm
> wondering why calling SDL_Quit() fails and spits out *"SDL_Quit called
> (and ignored)" *(thus the need for exit(0) after it):
> Here's the code now:
>
>
> #include <stdio.h>
>>
>> #include <stdlib.h>
>> #include <SDL/SDL.h>
>> #include <emscripten.h>
>>
>> SDL_Surface* bitmap = SDL_LoadBMP("bat.bmp");
>> SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 0, SDL_HWSURFACE |
>> SDL_DOUBLEBUF );
>> SDL_Rect source;
>> SDL_Rect destination;
>> bool gameRunning = true;
>>
>> void renderStuff() {
>>
>>
>>        SDL_BlitSurface(bitmap, &source, screen, &destination);
>>        SDL_Flip(screen);
>>
>> }
>>
>> void one_iter() {
>>
>>
>>        SDL_Event event;
>>
>>           if (SDL_PollEvent(&event))
>>           {
>>              if (event.type == SDL_KEYUP)
>>              {
>>                 gameRunning = false;
>>                 printf("Game Stopping!!!!!!\n");
>>                 SDL_Quit();
>>                 exit(0);
>>              }
>>           }
>>           printf("Game Running..\n");
>>
>>
>>
>>           renderStuff();
>>
>>
>> }
>>
>> int main(int argc, char **argv)
>> {
>>     SDL_Init( SDL_INIT_VIDEO );
>>
>>
>>
>>
>>        // Part of the bitmap that we want to draw
>>
>>        source.x = 24;
>>        source.y = 63;
>>        source.w = 65;
>>        source.h = 44;
>>
>>        // Part of the screen we want to draw the sprite to
>>
>>        destination.x = 100;
>>        destination.y = 100;
>>        destination.w = 65;
>>        destination.h = 44;
>>
>>     emscripten_set_main_loop(one_iter, 60, 1);
>>
>>    return 0;
>> }
>>
>>
> I'm sure I must be using it wrong or something. I'm aware that it's not
> the same thing as the real SDL_Quit() but I'm not familiar with how it
> works with emscripten_set_main_loop.
>
>
> On Sunday, April 6, 2014 8:18:59 PM UTC-5, Alon Zakai wrote:
>
>> Looks like that code is calling SDL_Init and InitVideo in each frame?
>> That is going to be slow, and also allocates memory which is not freed
>> without SDL_Quit.
>>
>> You should do init once, before calling the main loop function.
>>
>> - Alon
>>
>>
>>
>> On Sun, Apr 6, 2014 at 4:43 PM, <[email protected]> wrote:
>>
>>>
>>> <https://lh6.googleusercontent.com/-K5u_LGOXmLk/U0HjTLBYVtI/AAAAAAAAAAc/LJ-fIy-Rqo4/s1600/cannot+enlarge+memory.JPG>
>>> Thanks for the help. I'm not sure if I really fixed the issue or just
>>> created a more dominant one.
>>> From running the new generated page I get* "Cannot enlarge memory
>>> arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the
>>> current value 16777216, (2) compile with ALLOW_MEMORY_GROWTH which adjusts
>>> the size at runtime but prevents some optimizations, or (3) set
>>> Module.TOTAL_MEMORY before the program runs."*
>>>
>>> Also, here's what my code looks like now.
>>>
>>>
>>> #include <stdlib.h>
>>>> #include <SDL/SDL.h>
>>>> #include <emscripten.h>
>>>>
>>>> void renderStuff() {
>>>>        SDL_Init( SDL_INIT_VIDEO );
>>>>
>>>>        SDL_Surface* bitmap = SDL_LoadBMP("bat.bmp");
>>>>        SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 0,
>>>>           SDL_HWSURFACE | SDL_DOUBLEBUF );
>>>>
>>>>
>>>>        // Part of the bitmap that we want to draw
>>>>        SDL_Rect source;
>>>>        source.x = 24;
>>>>        source.y = 63;
>>>>        source.w = 65;
>>>>        source.h = 44;
>>>>
>>>>        // Part of the screen we want to draw the sprite to
>>>>        SDL_Rect destination;
>>>>        destination.x = 100;
>>>>        destination.y = 100;
>>>>        destination.w = 65;
>>>>        destination.h = 44;
>>>>
>>>>        SDL_BlitSurface(bitmap, &source, screen, &destination);
>>>>
>>>>        SDL_Flip(screen);
>>>> }
>>>>
>>>> void one_iter() {
>>>>
>>>>
>>>>
>>>>        SDL_Event event;
>>>>        bool gameRunning = true;
>>>>
>>>>
>>>>           if (SDL_PollEvent(&event))
>>>>           {
>>>>              if (event.type == SDL_QUIT)
>>>>              {
>>>>                 gameRunning = false;
>>>>              }
>>>>           }
>>>>
>>>>           renderStuff();
>>>>
>>>>
>>>> }
>>>>
>>>> int main(int argc, char **argv)
>>>> {
>>>>
>>>>     emscripten_set_main_loop(one_iter, 60, 1);
>>>>
>>>>    return 0;
>>>> }
>>>>
>>>> Now, I imagine it's trying to take an unusual amount of memory for the
>>> type of things it's intended to do but the browser won't let it so
>>> everything runs good. However using the browser to fix my bug is obviously
>>> the kind of thing that will backfire sooner or later. So now I'm wondering
>>> what is causing it to attempt to take up more memory than it needs and if
>>> the unresponsive script issue really went away or is just not able to
>>> manifest on account of the newer issue.
>>>
>>>
>>> On Sunday, April 6, 2014 1:56:33 PM UTC-5, Dave Nicponski wrote:
>>>>
>>>> I've not used SDL, but aren't you grabbing control of the event loop
>>>> here in your while(gameRunning) { } loop?  Each main loop invocation is
>>>> happening in the browser's (single) UI thread.  If you don't return control
>>>> to the browser (by exiting the one_iter() function) then the browser will
>>>> freeze.
>>>>
>>>> Maybe try structuring your code like this:
>>>>
>>>> void oneIter() {
>>>>   // Stuff currently inside your while() { } block
>>>>   if (!gameRunning) {
>>>>     // Stuff currently after your while() { } block, like SDLQuit() and
>>>> friends
>>>>   }
>>>> }
>>>>
>>>> int main() {
>>>>   // Setup code, stuff currently before your while() { } block
>>>>   emscripten_set_main_loop();
>>>> }
>>>>
>>>>
>>>> Now the oneIter() function will be invoked by the browser in a loop,
>>>> yielding back to the browser each loop iteration.
>>>>
>>>>     -dave-
>>>>
>>>> On Sunday, April 6, 2014 12:49:51 AM UTC-4, [email protected] wrote:
>>>>>
>>>>> <https://lh3.googleusercontent.com/-FrjglpaDPRs/U0DZZ1cTn9I/AAAAAAAAAAQ/29x4jM-0S_s/s1600/unresponsive%2Bscript3.JPG>
>>>>> I'm currently trying to get this tutorial I've found
>>>>> <http://www.aaroncox.net/tutorials/2dtutorials/sdlsprites.html>on SDL
>>>>> to work with Emscripten but I think I might be running into problems with
>>>>> the browser's event model:
>>>>>
>>>>> Here's the code:
>>>>>
>>>>> #include <SDL/SDL.h>
>>>>>> #include <emscripten.h>
>>>>>>
>>>>>> const int WINDOW_WIDTH = 640;
>>>>>> const int WINDOW_HEIGHT = 480;
>>>>>> const char* WINDOW_TITLE = "SDL Start";
>>>>>>
>>>>>> void one_iter() {
>>>>>>        SDL_Init( SDL_INIT_VIDEO );
>>>>>>
>>>>>>        SDL_Surface* screen = SDL_SetVideoMode( WINDOW_WIDTH,
>>>>>> WINDOW_HEIGHT, 0,
>>>>>>           SDL_HWSURFACE | SDL_DOUBLEBUF );
>>>>>>        SDL_WM_SetCaption( WINDOW_TITLE, 0 );
>>>>>>
>>>>>>        SDL_Surface* bitmap = SDL_LoadBMP("bat.bmp");
>>>>>>
>>>>>>        // Part of the bitmap that we want to draw
>>>>>>        SDL_Rect source;
>>>>>>        source.x = 24;
>>>>>>        source.y = 63;
>>>>>>        source.w = 65;
>>>>>>        source.h = 44;
>>>>>>
>>>>>>        // Part of the screen we want to draw the sprite to
>>>>>>        SDL_Rect destination;
>>>>>>        destination.x = 100;
>>>>>>        destination.y = 100;
>>>>>>        destination.w = 65;
>>>>>>        destination.h = 44;
>>>>>>
>>>>>>        SDL_Event event;
>>>>>>        bool gameRunning = true;
>>>>>>
>>>>>>        while (gameRunning)
>>>>>>        {
>>>>>>           if (SDL_PollEvent(&event))
>>>>>>           {
>>>>>>              if (event.type == SDL_QUIT)
>>>>>>              {
>>>>>>                 gameRunning = false;
>>>>>>              }
>>>>>>           }
>>>>>>
>>>>>>           SDL_BlitSurface(bitmap, &source, screen, &destination);
>>>>>>
>>>>>>           SDL_Flip(screen);
>>>>>>        }
>>>>>>
>>>>>>        SDL_FreeSurface(bitmap);
>>>>>>
>>>>>>        SDL_Quit();
>>>>>> }
>>>>>>
>>>>>> int main(int argc, char **argv)
>>>>>> {
>>>>>>     emscripten_set_main_loop(one_iter, 60, 1);
>>>>>>
>>>>>>    return 0;
>>>>>> }
>>>>>>
>>>>>
>>>>>
>>>>> I've read the Wiki on emscripten browser 
>>>>> environment<https://github.com/kripken/emscripten/wiki/Emscripten-browser-environment>so
>>>>>  I figured I had to use *emscripten_set_main_loop
>>>>> *to make SDL_Quit() work and give control back to the browser and
>>>>> keep it from freaking out. But as you can see it didn't work. Can anyone
>>>>> point to me what I'm doing wrong? Any guidance here would be appreciated.
>>>>>
>>>>  --
>>> You received this message because you are subscribed to the Google
>>> Groups "emscripten-discuss" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>  --
> You received this message because you are subscribed to the Google Groups
> "emscripten-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to