X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FGameLayer.cc;h=a37f175801e8e38e280dfa857f9798724fd2c3b6;hp=2035248115869afdb4a42cb16647be34f29014d0;hb=c9e20ac06383b20ceb5404c9237e319c2e90d157;hpb=bc2bc12125d6c223d2935557e01926fe21166e38 diff --git a/src/GameLayer.cc b/src/GameLayer.cc index 2035248..a37f175 100644 --- a/src/GameLayer.cc +++ b/src/GameLayer.cc @@ -27,6 +27,7 @@ *******************************************************************************/ #include +#include #include #include #include @@ -39,55 +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("BeatTheCube"), - punchSound("Thump") + mMusic("NightFusionIntro"), + mPunchSound("Thump") { - music.setLooping(true); - music.enqueue("NightFusionLoop"); - music.stream(); + mMusic.setLooping(true); + mMusic.enqueue("NightFusionLoop"); + mMusic.stream(); - heroine = Heroine::alloc(); - heroine->animation.startSequence("FlyDiagonallyUp"); + 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"); - scene = Scene::alloc("Classic"); + Mf::Scalar a[6] = {0.0, 1.5, -0.5, 3.0, -2.0, 1.0}; + mInterp.init(a, 2.0, Mf::Interpolator::OSCILLATE); setProjection(); - hud = Hud::alloc(); + mHud = Hud::alloc(); } void GameLayer::pushed(Mf::Engine& engine) { - engine.push(hud); + engine.push(mHud); } void GameLayer::update(Mf::Scalar t, Mf::Scalar dt) { - camera.update(t, dt); - heroine->update(t, dt); + mCamera.update(t, dt); + mHeroine->update(t, dt); + + mScene->checkForCollision(*mHeroine); - //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::promote(heroine->current.position); + //Mf::Vector3 heroinePosition = Mf::promote(mHeroine->getState().position); //Mf::Sound::setListenerPosition(heroinePosition); - interp.update(t, dt); - hud->setBar1Progress(interp.getState(dt)); - hud->setBar2Progress(1.0 - interp.getState(dt)); + mInterp.update(t, dt); + mHud->setBar1Progress(mInterp.getState(dt)); + mHud->setBar2Progress(1.0 - mInterp.getState(dt)); } void GameLayer::draw(Mf::Scalar alpha) const { - camera.uploadToGL(); + mCamera.uploadToGL(alpha); // DRAW THE SCENE Mf::Texture::resetBind(); @@ -95,9 +152,10 @@ void GameLayer::draw(Mf::Scalar alpha) const glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); - scene->drawIfVisible(alpha, camera.getFrustum()); + mScene->drawIfVisible(alpha, mCamera.getFrustum()); - heroine->draw(alpha); + mHeroine->setZCoord(getZCoord(mHeroine->getState().position)); + mHeroine->draw(alpha); } bool GameLayer::handleEvent(const Mf::Event& event) @@ -107,14 +165,14 @@ bool GameLayer::handleEvent(const Mf::Event& event) case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_SPACE) { - heroine->animation.startSequence("Flattened"); + 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) @@ -124,11 +182,11 @@ bool GameLayer::handleEvent(const Mf::Event& event) } case SDL_KEYUP: - return heroine->handleEvent(event); + return mHeroine->handleEvent(event); case SDL_MOUSEMOTION: case SDL_MOUSEBUTTONDOWN: - camera.handleEvent(event); + mCamera.handleEvent(event); return true; case SDL_VIDEORESIZE: @@ -148,7 +206,7 @@ void GameLayer::setProjection() void GameLayer::setProjection(Mf::Scalar width, Mf::Scalar height) { - camera.setProjection(cml::rad(60.0), width / height, 32.0, 2500.0); + mCamera.setProjection(cml::rad(60.0), width / height, 1.0, 200.0); }