// main int main(int argc, char **argv) { setlocale(LC_NUMERIC, "C"); unsigned int width = 800; unsigned int height = 400; bool fullscreen = false; // get engine MEngine* engine = MEngine::getInstance(); // get window MWindow* window = MWindow::getInstance(); window->setPointerEvent(windowEvents); // window events // create window if(! window->create("Maratis - ManualUse example", width, height, 32, fullscreen)) { MLOG(4, "window create failed"); return 0; } if(fullscreen) window->hideCursor(); // set current directory { char rep[256]; getRepertory(rep, argv[0]); window->setCurrentDirectory(rep); } // create virtual contexts MSoundContext * soundContext = new MALContext(); MRenderingContext * render = new MGLContext(); MPhysicsContext * physics = new MBulletContext(); MScriptContext * script = new MScript(); MInputContext * input = new MInput(); MSystemContext * system = new MWinContext(); MLOG(5, "Render version: " << render->getRendererVersion()); // create default Level and Game MLevel * level = new MLevel(); MGame * game = new MyGame(); // MyGame // init MEngine (you can replace all contexts by others and add or use different data loaders) engine->setSoundContext(soundContext); // sound context engine->setRenderingContext(render); // rendering context engine->setPhysicsContext(physics); // physics context engine->setScriptContext(script); // script context engine->setInputContext(input); // input context engine->setSystemContext(system); // system context engine->getImageLoader()->addLoader(M_loadImage); // image loader engine->getSoundLoader()->addLoader(M_loadSound); // sound loader // engine->getLevelLoader()->addLoader(xmlLevelLoad); // level loader : uncomment if wanted engine->getFontLoader()->addLoader(M_loadFont); // font loader // engine->getFontLoader()->addLoader(M_loadBinFont); // bin font loader : uncomment if wanted // add some default "Maratis" behaviors : uncomment if wanted or add custom // engine->getBehaviorManager()->addBehavior(MBLookAt::getStaticName(), M_OBJECT3D_CAMERA, MBLookAt::getNew); // engine->getBehaviorManager()->addBehavior(MBFollow::getStaticName(), M_OBJECT3D, MBFollow::getNew); // add renderers engine->getRendererManager()->addRenderer(MStandardRenderer::getStaticName(), MStandardRenderer::getNew); engine->getRendererManager()->addRenderer(MFixedRenderer::getStaticName(), MFixedRenderer::getNew); // mesh loader engine->getMeshLoader()->addLoader(xmlMeshLoad); engine->getArmatureAnimLoader()->addLoader(xmlArmatureAnimLoad); engine->getTexturesAnimLoader()->addLoader(xmlTextureAnimLoad); engine->getMaterialsAnimLoader()->addLoader(xmlMaterialAnimLoad); // set level engine->setLevel(level); // set game engine->setGame(game); // set renderer (standard) MRenderer * renderer = engine->getRendererManager()->getRendererByName("StandardRenderer")->getNewRenderer(); engine->setRenderer(renderer); // begin game game->begin(); // time unsigned int frequency = 60; unsigned long previousFrame = 0; unsigned long startTick = window->getSystemTick(); // on events while(window->isActive()) { // on events if(window->onEvents()) { // compute target tick unsigned long currentTick = window->getSystemTick(); unsigned long tick = currentTick - startTick; unsigned long frame = (unsigned long)(tick * (frequency * 0.001f)); // update elapsed time unsigned int i; unsigned int steps = (unsigned int)(frame - previousFrame); if(window->getFocus()) { // don't wait too much if(steps >= (frequency/2)) { update(); draw(); previousFrame += steps; continue; } // update for(i=0; i<steps; i++) { update(); previousFrame++; } // draw if(steps > 0){ draw(); } } else { previousFrame = frame; window->swapBuffer(); } } } MLOG(5, "ending game..."); game->end(); MLOG(5, "destroying renderer..."); renderer->destroy(); SAFE_DELETE(game); SAFE_DELETE(level); SAFE_DELETE(render); SAFE_DELETE(soundContext); SAFE_DELETE(physics); SAFE_DELETE(script); SAFE_DELETE(input); SAFE_DELETE(system); return 0; }
// system tick unsigned long MWinContext::getSystemTick(void) { MWindow * window = MWindow::getInstance(); return window->getSystemTick(); }
// main int main(int argc, char **argv) { setlocale(LC_NUMERIC, "C"); // get engine (first time call onstructor) MEngine * engine = MEngine::getInstance(); // get window (first time call onstructor) MWindow * window = MWindow::getInstance(); // create window window->create("Maratis", 1024,768, 32, false); // set current directory char rep[256]; getRepertory(rep, argv[0]); window->setCurrentDirectory(rep); // get Maratis (first time call onstructor) Maratis * maratis = Maratis::getInstance(); MRenderingContext * render = engine->getRenderingContext(); // init gui MGui * gui = MGui::getInstance(); gui->setRenderingContext(render); gui->addFont(new MGuiTextureFont("font/default.tga")); // init MaratisUI window->setPointerEvent(MaratisUI::windowEvents); // logo { MImage image; if(! M_loadImage("gui/Title.png", &image)) return 0; render->createTexture(&logoTextureId); render->bindTexture(logoTextureId); render->sendTextureImage(&image, false, false, false); // clear window draw(); MGuiText text("LOADING", MVector2(480, 280), 16, MVector4(1, 1, 1, 1)); text.draw(); window->swapBuffer(); } // load project if(argc > 1) { maratis->loadProject(argv[1]); } // time unsigned int frequency = 60; unsigned long previousFrame = 0; unsigned long startTick = window->getSystemTick(); int f = 0; int t = 0; // on events while(window->isActive()) { // on events if(window->onEvents()) { // compute target tick unsigned long currentTick = window->getSystemTick(); unsigned long tick = currentTick - startTick; unsigned long frame = (unsigned long)(tick * (frequency * 0.001f)); // update elapsed time unsigned int i; unsigned int steps = (unsigned int)(frame - previousFrame); if(window->getFocus()) { // don't wait too much if(steps >= (frequency/2)) { update(); draw(); previousFrame += steps; continue; } // update for(i=0; i<steps; i++) { update(); previousFrame++; t++; if(t == frequency) { MGame * game = engine->getGame(); if(game) { if(! game->isRunning()) MFilesUpdate::update(); } else { MFilesUpdate::update(); } //printf("fps:%d\n", f); t = 0; f = 0; } } // draw //if(steps > 0) { draw(); f++; } } else { previousFrame = frame; window->swapBuffer(); } } } gui->clear(); maratis->clear(); return 0; }