static int l_physics_updateSpace(lua_State* state) { l_tools_checkUserDataPlusErrMsg(state, 1, "You must provide a space"); l_physics_PhysicsData* physics = (l_physics_PhysicsData*)lua_touserdata(state, 1); float dt = luaL_optnumber(state, 2, timer_getDelta()); cpSpaceStep(physics->physics->space, dt); return 0; }
int l_timer_getDelta(lua_State* state) { lua_pushnumber(state, timer_getDelta()); return 1; }
void main_loop(void *data) { MainLoopData* loopData = (MainLoopData*)data; // TODO use registry to get love.update and love.draw? chdir("love"); timer_step(); graphics_clear(); matrixstack_origin(); lua_rawgeti(loopData->luaState, LUA_REGISTRYINDEX, loopData->errhand); lua_getglobal(loopData->luaState, "love"); lua_pushstring(loopData->luaState, "update"); lua_rawget(loopData->luaState, -2); lua_pushnumber(loopData->luaState, timer_getDelta()); pcall(loopData->luaState, 1); lua_pushstring(loopData->luaState, "draw"); lua_rawget(loopData->luaState, -2); pcall(loopData->luaState, 0); graphics_DisplayState curState = *graphics_getState(); matrixstack_push(); mouse_cursor_draw(); matrixstack_pop(); graphics_setState(&curState); graphics_swap(); lua_pop(loopData->luaState, 1); SDL_Event event; while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_KEYDOWN: keyboard_keypressed(event.key.keysym.sym); break; case SDL_KEYUP: keyboard_keyreleased(event.key.keysym.sym); break; case SDL_TEXTINPUT: keyboard_textInput(event.text.text); break; case SDL_MOUSEMOTION: mouse_mousemoved(event.motion.x, event.motion.y); break; case SDL_MOUSEBUTTONDOWN: mouse_mousepressed(event.button.x, event.button.y, event.button.button); break; case SDL_MOUSEBUTTONUP: mouse_mousereleased(event.button.x, event.button.y, event.button.button); break; case SDL_JOYDEVICEADDED: joystick_deviceAdded(event.jdevice.which); break; case SDL_JOYDEVICEREMOVED: joystick_deviceRemoved(event.jdevice.which); break; case SDL_JOYBUTTONUP: joystick_buttonReleased(event.jbutton.which, event.jbutton.button); break; case SDL_JOYBUTTONDOWN: joystick_buttonPressed(event.jbutton.which, event.jbutton.button); break; case SDL_JOYAXISMOTION: joystick_axisEvent(event.jaxis.which, event.jaxis.axis, event.jaxis.value); break; case SDL_CONTROLLERBUTTONUP: joystick_controllerButtonReleased(event.jbutton.which, event.jbutton.button); break; case SDL_CONTROLLERBUTTONDOWN: joystick_controllerButtonPressed(event.jbutton.which, event.jbutton.button); break; case SDL_CONTROLLERAXISMOTION: joystick_controllerAxisEvent(event.jaxis.which, event.jaxis.axis, event.jaxis.value); break; #ifndef EMSCRIPTEN case SDL_QUIT: exit(0); #endif } } audio_updateStreams(); //lua_gc(loopData->luaState, LUA_GCCOLLECT, 0); }
void main_loop(void *data) { MainLoopData* loopData = (MainLoopData*)data; timer_step(); lua_rawgeti(loopData->luaState, LUA_REGISTRYINDEX, loopData->errhand); lua_getglobal(loopData->luaState, "love"); lua_pushstring(loopData->luaState, "update"); lua_rawget(loopData->luaState, -2); lua_pushnumber(loopData->luaState, timer_getDelta()); if (swap_At == 1){ if(luaL_dofile(loopData->luaState, "main.lua")) { printf("Error: %s\n", lua_tostring(loopData->luaState, -1)); } } if(lua_pcall(loopData->luaState, 1, 0, 0)) { printf("Lua error: %s\n", lua_tostring(loopData->luaState, -1)); #ifdef EMSCRIPTEN quit_function(loopData->luaState); emscripten_force_exit(1); #else exit(1); #endif } graphics_clear(); lua_pushstring(loopData->luaState, "draw"); lua_rawget(loopData->luaState, -2); if(lua_pcall(loopData->luaState, 0, 0, 0)) { printf("Lua error: %s\n", lua_tostring(loopData->luaState, -1)); #ifdef EMSCRIPTEN quit_function(loopData->luaState); emscripten_force_exit(1); l_running = 0; #else l_running = 0; #endif } graphics_swap(); // silly hack for love.event.quit() #ifdef WINDOWS event_force_quit = graphics_stop_windows(); if(!event_force_quit) l_running = 0; #endif //This will affect only Windows users // lua_pop(loopData->luaState, 1); #ifdef UNIX SDL_Event event; while(SDL_PollEvent(&event)) { if (event.type == SDL_WINDOWEVENT) { switch (event.window.event) { case SDL_WINDOWEVENT_ENTER: graphics_setMouseFocus(1); break; case SDL_WINDOWEVENT_LEAVE: graphics_setMouseFocus(0); break; case SDL_WINDOWEVENT_FOCUS_LOST: graphics_setFocus(0); break; case SDL_WINDOWEVENT_FOCUS_GAINED: graphics_setFocus(1); break; default: break; } } switch(event.wheel.type) { case SDL_MOUSEWHEEL: mouse_mousewheel(event.wheel.y); int _what = event.wheel.y == 1 ? SDL_BUTTON_WHEEL_UP : SDL_BUTTON_WHEEL_DOWN; mouse_mousepressed(event.button.x, event.button.y, _what); break; default: break; } switch(event.type) { case SDL_KEYDOWN: keyboard_keypressed(event.key.keysym.sym); break; case SDL_KEYUP: keyboard_keyreleased(event.key.keysym.sym); break; case SDL_TEXTINPUT: keyboard_textInput(event.text.text); break; case SDL_MOUSEMOTION: mouse_mousemoved(event.motion.x, event.motion.y); break; case SDL_MOUSEBUTTONDOWN: mouse_mousepressed(event.button.x, event.button.y, event.button.button); break; case SDL_MOUSEBUTTONUP: mouse_mousereleased(event.button.x, event.button.y, event.button.button); break; #ifndef EMSCRIPTEN case SDL_QUIT: quit_function(loopData->luaState); l_running = 0; #endif } } #endif }