|
|
@@ -0,0 +1,164 @@
|
|
|
+/**
|
|
|
+ Attention!
|
|
|
+ This file initializes the Oxygine engine.
|
|
|
+ If you just started here and don't understand the code completely, feel free to come back later.
|
|
|
+ You can start from example.cpp and example.h, which main functions are called from here.
|
|
|
+*/
|
|
|
+#include "core/oxygine.h"
|
|
|
+#include "Stage.h"
|
|
|
+#include "DebugActor.h"
|
|
|
+#include "example.h"
|
|
|
+
|
|
|
+
|
|
|
+using namespace oxygine;
|
|
|
+
|
|
|
+
|
|
|
+// This function is called each frame
|
|
|
+int mainloop()
|
|
|
+{
|
|
|
+ // Update engine-internal components
|
|
|
+ // If input events are available, they are passed to Stage::instance.handleEvent
|
|
|
+ // If the function returns true, it means that the user requested the application to terminate
|
|
|
+ bool done = core::update();
|
|
|
+
|
|
|
+ // It gets passed to our example game implementation
|
|
|
+ example_update();
|
|
|
+
|
|
|
+ // Update our stage
|
|
|
+ // Update all actors. Actor::update will also be called for all its children
|
|
|
+ getStage()->update();
|
|
|
+
|
|
|
+ if (core::beginRendering())
|
|
|
+ {
|
|
|
+ Color clearColor(32, 32, 32, 255);
|
|
|
+ Rect viewport(Point(0, 0), core::getDisplaySize());
|
|
|
+ // Render all actors inside the stage. Actor::render will also be called for all its children
|
|
|
+ getStage()->render(clearColor, viewport);
|
|
|
+
|
|
|
+ core::swapDisplayBuffers();
|
|
|
+ }
|
|
|
+
|
|
|
+ return done ? 1 : 0;
|
|
|
+}
|
|
|
+
|
|
|
+// Application entry point
|
|
|
+void run()
|
|
|
+{
|
|
|
+ ObjectBase::__startTracingLeaks();
|
|
|
+
|
|
|
+ // Initialize Oxygine's internal stuff
|
|
|
+ core::init_desc desc;
|
|
|
+ desc.title = "Oxygine Application";
|
|
|
+
|
|
|
+#if OXYGINE_SDL || OXYGINE_EMSCRIPTEN
|
|
|
+ // The initial window size can be set up here on SDL builds
|
|
|
+ desc.w = 960;
|
|
|
+ desc.h = 640;
|
|
|
+ // Marmalade settings can be modified from the emulator's menu
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+ example_preinit();
|
|
|
+ core::init(&desc);
|
|
|
+
|
|
|
+
|
|
|
+ // Create the stage. Stage is a root node for all updateable and drawable objects
|
|
|
+ Stage::instance = new Stage(true);
|
|
|
+ Point size = core::getDisplaySize();
|
|
|
+ getStage()->setSize(size);
|
|
|
+
|
|
|
+ // DebugActor is a helper actor node. It shows FPS, memory usage and other useful stuff
|
|
|
+ DebugActor::show();
|
|
|
+
|
|
|
+ // Initializes our example game. See example.cpp
|
|
|
+ example_init();
|
|
|
+
|
|
|
+#ifdef EMSCRIPTEN
|
|
|
+ /*
|
|
|
+ If you build for Emscripten, mainloop is called automatically and shouldn't be called here.
|
|
|
+ See emscripten_set_main_loop in the EMSCRIPTEN section below
|
|
|
+ */
|
|
|
+ return;
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR
|
|
|
+ // On iPhone mainloop is called automatically by CADisplayLink, see int main() below
|
|
|
+ return;
|
|
|
+#endif
|
|
|
+
|
|
|
+ // This is the main game loop.
|
|
|
+ while (1)
|
|
|
+ {
|
|
|
+ int done = mainloop();
|
|
|
+ if (done)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ If we get here, the user has requested the Application to terminate.
|
|
|
+ We dump and log all our created objects that have not been freed yet
|
|
|
+ */
|
|
|
+ ObjectBase::dumpCreatedObjects();
|
|
|
+
|
|
|
+ /*
|
|
|
+ Let's clean up everything right now and call ObjectBase::dumpObjects() again.
|
|
|
+ We need to free all allocated resources and delete all created actors.
|
|
|
+ All actors/sprites are smart-pointer objects and don't need to be removed by hand.
|
|
|
+ But now we want to delete it by hand.
|
|
|
+ */
|
|
|
+
|
|
|
+ // See example.cpp for the shutdown function implementation
|
|
|
+ example_destroy();
|
|
|
+
|
|
|
+
|
|
|
+ //renderer.cleanup();
|
|
|
+
|
|
|
+ // Releases all internal components and the stage
|
|
|
+ core::release();
|
|
|
+
|
|
|
+ // The dump list should be empty by now,
|
|
|
+ // we want to make sure that there aren't any memory leaks, so we call it again.
|
|
|
+ ObjectBase::dumpCreatedObjects();
|
|
|
+
|
|
|
+ ObjectBase::__stopTracingLeaks();
|
|
|
+ //end
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef __S3E__
|
|
|
+int main(int argc, char* argv[])
|
|
|
+{
|
|
|
+ run();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+#ifdef OXYGINE_SDL
|
|
|
+
|
|
|
+#include "SDL_main.h"
|
|
|
+#include "SDL.h"
|
|
|
+
|
|
|
+extern "C"
|
|
|
+{
|
|
|
+ void one(void* param) { mainloop(); }
|
|
|
+ void oneEmsc() { mainloop(); }
|
|
|
+
|
|
|
+ int main(int argc, char* argv[])
|
|
|
+ {
|
|
|
+
|
|
|
+ run();
|
|
|
+
|
|
|
+#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR
|
|
|
+ // If parameter 2 is set to 1, refresh rate will be 60 fps, 2 - 30 fps, 3 - 15 fps.
|
|
|
+ SDL_iPhoneSetAnimationCallback(core::getWindow(), 1, one, nullptr);
|
|
|
+#endif
|
|
|
+
|
|
|
+#if EMSCRIPTEN
|
|
|
+ emscripten_set_main_loop(oneEmsc, 0, 0);
|
|
|
+#endif
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+};
|
|
|
+#endif
|