450 likes | 465 Views
GlobalFlyer is a 3D flying game where players can control a Wright brothers-style airplane in a virtual environment. Fly through the skies, avoid obstacles, and complete challenging levels. Experience the thrill of flying in this immersive game.
E N D
SE Team 9GlobalFlyer Cole HoosierRyan HannebaumLeanne GrayAlex Stampbach
Project Statement • GlobalFlyer allows a player to fly a Wright brothers-style airplane in 3D space using the OGRE graphic rendering engine and the FMOD sound system.
Iteration Plans • Fixup • 1: Get music and sound effects working again • 2: Get collision detection with buildings working • 3: Get the propellor showing up again • Visual Environment • 1: Add hovering objects to the world • 2: Add proximity detection to hovering objects • 3: Modify texture of hovering objects based on proximity • User Interface • 1: Add mouse control of camera • 2: Add visually-appealing digital readouts of data the user might want • 3: Add the ability to toggle sound, gui, etc.
GlobalFlyer Web Site • http://seteam9.cis.ksu.edu/
Earned Value • Shows the steady completion of tasks after presentation 4
Scheduled Performance Index • On schedule until the end and now we are ahead of schedule
Scheduled Variance • On schedule to ahead of schedule back on a finally ending ahead
Cost Performance Index • Under budget to over and finally ending on budget
Cost Variance • Under budget to over and ending on budget
OCL • Areas that lend themselves well to OCL specifications • The airplane cannot fly beneath the ground • The FMOD sound system shouldn't be re-initialized • The bubbles and buildings must be within the boundaries of the world • Checking the win-condition for a level, theoretically we would load a new level after hitting all targets
OCL • The airplane cannot fly beneath the ground • context OgreCharacter::update(elapsedTime, *input) : void • post: self.raySceneQuery->forAll( worldFragment.singleIntersection.y < self.mMainNode.getPosition().y )
OCL • The FMOD sound system shouldn't be re-initialized • context CFMod::InitSoundSystem() : bool • pre: self.initialized = false • post: self.initialized = true
OCL • The bubbles and buildings must be within the boundaries of the world • context SampleApplication::createScene() : void • post: self.buildings.getBoundingBox->forAll( getMinimum.x >= 0 and getMinimum.z >= 0 and getMaximum.x <= 10000 and getMaximum.z <= 10000 ) • post: self.bubbles.getBoundingBox->forAll( getMinimum.x >= 0 and getMinimum.z >= 0 and getMaximum.x <= 10000 and getMaximum.z <= 10000 )
OCL • Checking the win-condition for a level -- theoretically we would load a new level after hitting all targets • context OgreCharacter::targetsRemaining() : int • result = self.targetHit->count(false) • context OgreCharacter::checkWin() : bool • result = self.targetsRemaining = 0 • context SampleListener::frameStarted(frameEvent) : void • post: self.mChar.checkWin = false
Class Diagram Overview
Proximity Detection SampleApplication fills arrays that contain pointers to the buildings and bubbles in the world.
Hit a Building? bool OgreCharacter::inObstacle() { int i; const AxisAlignedBox me = this->mEntity->getWorldBoundingBox(); for (i=0; i<numObstacles; ++i) { if (obstacles[i]->getWorldBoundingBox().intersects(me)) { crashed = true; if (!crashSoundStarted) { engineSound.Pause(); crashSoundStarted = true; crashSound.Play(); } return true; } } return false; } ogre_character.cpp
Hit a Bubble? bool OgreCharacter::inTarget() { int i; const AxisAlignedBox me = this->mEntity->getWorldBoundingBox(); for (i=0; i<numTargets; ++i) { if (targets[i]->getWorldBoundingBox().intersects(me)) { targets[i]->setMaterialName("GlobalFlyer/BlueSphere"); targetHit[i] = true; return true; } } return false; } ogre_character.cpp
Bubbles Left? int OgreCharacter::targetsRemaining() { int i; int remaining = 0; for (i=0; i<numTargets; ++i) { if (this->targetHit[i] == false) { ++remaining; } } return remaining; } ogre_character.cpp
GUI • make the window look more like a cockpit • remove Ogre logo and statistics overlay
Operation Beautify • eliminate debugging script and Ogre logo • clean up physics script • create cockpit graphic • add graphic as overlay panel material • orient text aesthetically
gf.material material GlobalFlyer/cockpit { technique { pass { lighting off scene_blend alpha_blend texture_unit { texture cockpit.png } } } }
SampleApplication.cpp Ogre::OverlayContainer* panel = static_cast<OverlayContainer*>( overlayMgr.createOverlayElement("Panel", "PanelName")); … panel->setMaterialName("GlobalFlyer/cockpit");
Who has Questions? -Images from texasbestgrok.mu.nu/images/GF2.jpg