Oh, I thought emscripten implemented it in such a way it would somehow work 
with emscripten_set_main_loop.

>From the notes section of Emscripten browser 
>environment<https://github.com/kripken/emscripten/wiki/Emscripten-browser-environment>
:

> SDL_QUIT is tricky to implement in browsers. The current emscripten 
> implementation of it will work if you use emscripten_set_main_loop: As the 
> page is shut, it will force a final direct call to the main loop, giving it 
> a chance to notice the SDL_QUIT event. So if you do not use a main loop, 
> you will not notice it - your app will close before your next event 
> handling. Note also that there are limitations on what you can do as the 
> page shuts (in onunload), some actions like showing alerts are banned by 
> browsers.


Is that deprecated now or something?

Also, I'm curious if anyone has found a way to make C++ infinite main loops 
asynchronous that work across all even driven platforms? (eg. Emscripten, 
Flash, pNaCl, iOS, Android)

On Monday, April 7, 2014 7:57:58 AM UTC-5, jj wrote:
>
> 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] <javascript:>>:
>
>> <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] <javascript:>.
>> 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