X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FGameLayer.cc;h=a37f175801e8e38e280dfa857f9798724fd2c3b6;hp=dfdadaa5f2c19fbe809193f9eebcc971569adfd6;hb=cfe38a72ab859538db6269bc9b97f55e8f1f8709;hpb=892da43bf5796e7c5f593a6d0f53bd797a36bd3e diff --git a/src/GameLayer.cc b/src/GameLayer.cc index dfdadaa..a37f175 100644 --- a/src/GameLayer.cc +++ b/src/GameLayer.cc @@ -27,9 +27,11 @@ *******************************************************************************/ #include +#include #include #include #include +#include #include "GameLayer.hh" @@ -38,68 +40,111 @@ #endif + +Mf::Scalar GameLayer::getZCoord(const Mf::Vector2& position) const +{ + Mf::Scalar z; + + mScript.getGlobalTable().pushField("GetZCoord"); + mScript.push(position[0]); + mScript.push(position[1]); + mScript.call(2, 1); + mScript.getTop().get(z); + mScript.pop(); + + return z; +} + +void GameLayer::loadSceneLoader() +{ + std::string loaderPath = Scene::getPath("loader"); + if (loaderPath == "") + { + throw Mf::Exception(Mf::ErrorCode::RESOURCE_NOT_FOUND, "loader"); + } + + Mf::Script::Status status = mScript.doFile(loaderPath); + if (status != Mf::Script::SUCCESS) + { + std::string str; + mScript[-1].get(str); + + Mf::logScript("%s", str.c_str()); + throw Mf::Exception(Mf::ErrorCode::SCRIPT_ERROR, str.c_str()); + } + + mScript.getGlobalTable().pushField("scenes"); + mScript.getTop().get(mSceneList); + if (mSceneList.size() == 0) + { + Mf::logScript("no variable `scenes' within loader"); + throw Mf::Exception(Mf::ErrorCode::SCRIPT_ERROR, "no scenes to load"); + } +} + +void GameLayer::advanceScene() +{ + if (mSceneList.size() != 0) + { + mScene = Scene::alloc(mSceneList[0]); + mSceneList.erase(mSceneList.begin()); + mScene->load(mScript); + } +} + + GameLayer::GameLayer() : - music("NightFusionIntro"), - punchSound("Thump") + mMusic("NightFusionIntro"), + mPunchSound("Thump") { - music.setLooping(true); - music.enqueue("NightFusionLoop"); - music.stream(); + mMusic.setLooping(true); + mMusic.enqueue("NightFusionLoop"); + mMusic.stream(); - heroine = Character::alloc("RobotTrooper"); - heroine->getAnimation().startSequence("Run"); + loadSceneLoader(); + advanceScene(); // load the first scene - Mf::Scalar a[6] = {0.0, 1.5, -0.5, 3.0, -2.0, 1.0}; - interp.init(a, 2.0, Mf::Interpolator::OSCILLATE); + mHeroine = Heroine::alloc(); + mHeroine->animation.startSequence("FlyDiagonallyUp"); - Mf::Scalar b[2] = {1.0, 0.0}; - fadeIn.init(b, 1.0); + Mf::Scalar a[6] = {0.0, 1.5, -0.5, 3.0, -2.0, 1.0}; + mInterp.init(a, 2.0, Mf::Interpolator::OSCILLATE); - octree = Mf::loadScene("Classic"); - heroine->treeNode = octree->insert(heroine); + setProjection(); - camera.setProjection(cml::rad(60.0), 1.33333, 32.0, 2500.0); - camera.uploadProjectionToGL(); + mHud = Hud::alloc(); } void GameLayer::pushed(Mf::Engine& engine) { - hud = Hud::alloc(); - engine.pushLayer(hud); + engine.push(mHud); } void GameLayer::update(Mf::Scalar t, Mf::Scalar dt) { - //dt *= 0.7; + mCamera.update(t, dt); + mHeroine->update(t, dt); - fadeIn.update(dt); - camera.update(t, dt); - heroine->update(t, dt); + mScene->checkForCollision(*mHeroine); - // reinsert heroine - heroine->treeNode = octree->reinsert(heroine, heroine->treeNode); - octree->print(heroine->treeNode); - - //camera.lookAt(heroine->getSphere().point); - camera.setPosition(Mf::Vector3(-heroine->current.position[0], - -heroine->current.position[1], -256)); + mCamera.setPosition(Mf::Vector3(-mHeroine->getState().position[0], + -mHeroine->getState().position[1], -10)); + //mCamera.lookAt(Mf::promote(mHeroine->getState().position)); - Mf::Vector3 heroinePosition; - Mf::promoteVector(heroinePosition, heroine->current.position); - Mf::Sound::setListenerPosition(heroinePosition); - - interp.update(dt); - hud->setBar1Progress(interp.getState(dt)); - hud->setBar2Progress(1.0 - interp.getState(dt)); + //Mf::Vector3 heroinePosition = Mf::promote(mHeroine->getState().position); + //Mf::Sound::setListenerPosition(heroinePosition); + + mInterp.update(t, dt); + mHud->setBar1Progress(mInterp.getState(dt)); + mHud->setBar2Progress(1.0 - mInterp.getState(dt)); } void GameLayer::draw(Mf::Scalar alpha) const { - glMatrixMode(GL_MODELVIEW); - glLoadMatrix(camera.getModelviewMatrix().data()); + mCamera.uploadToGL(alpha); // DRAW THE SCENE Mf::Texture::resetBind(); @@ -107,36 +152,10 @@ void GameLayer::draw(Mf::Scalar alpha) const glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); - octree->drawIfVisible(alpha, camera.getFrustum()); - - //heroine->draw(alpha); - heroine->getAabb().draw(); - - // DRAW FADE - glEnable(GL_BLEND); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - glColor4f(0.0f, 0.0f, 0.0f, fadeIn.getState(alpha)); - Mf::Texture::resetBind(); + mScene->drawIfVisible(alpha, mCamera.getFrustum()); - //glRectf(-1.0f, -1.0f, 1.0f, 1.0f); - glBegin(GL_QUADS); - glVertex3f(-1.0, -1.0, -0.1); - glVertex3f(1.0, -1.0, -0.1); - glVertex3f(1.0, 1.0, -0.1); - glVertex3f(-1.0, 1.0, -0.1); - glEnd(); - - glDisable(GL_BLEND); - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); + mHeroine->setZCoord(getZCoord(mHeroine->getState().position)); + mHeroine->draw(alpha); } bool GameLayer::handleEvent(const Mf::Event& event) @@ -146,36 +165,32 @@ bool GameLayer::handleEvent(const Mf::Event& event) case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_SPACE) { - heroine->getAnimation().startSequence("Punch"); + mHeroine->animation.startSequence("Flattened"); Mf::logInfo("thump!"); - punchSound.play(); + mPunchSound.play(); return true; } else if (event.key.keysym.sym == SDLK_p) { - music.toggle(); + mMusic.toggle(); return true; } else if (event.key.keysym.sym == SDLK_y) { - Mf::Engine::getInstance().popLayer(); + Mf::Engine::getInstance().pop(); return true; } case SDL_KEYUP: - heroine->handleEvent(event); - break; + return mHeroine->handleEvent(event); case SDL_MOUSEMOTION: case SDL_MOUSEBUTTONDOWN: - camera.handleEvent(event); + mCamera.handleEvent(event); return true; case SDL_VIDEORESIZE: - glViewport(0, 0, event.resize.w, event.resize.h); - camera.setProjection(cml::rad(60.0), - double(event.resize.w) / double(event.resize.h), 32.0, 2500.0); - camera.uploadProjectionToGL(); + setProjection(Mf::Scalar(event.resize.w), Mf::Scalar(event.resize.h)); break; } @@ -183,5 +198,17 @@ bool GameLayer::handleEvent(const Mf::Event& event) } +void GameLayer::setProjection() +{ + Mf::Video& video = Mf::Engine::getInstance().getVideo(); + setProjection(video.getWidth(), video.getHeight()); +} + +void GameLayer::setProjection(Mf::Scalar width, Mf::Scalar height) +{ + mCamera.setProjection(cml::rad(60.0), width / height, 1.0, 200.0); +} + + /** vim: set ts=4 sw=4 tw=80: *************************************************/