SE Team 9 GlobalFlyer Cole Hoosier Ryan Hannebaum Leanne Gray Alex 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 Icing: Create multiple levels, progressing in difficulty 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.
OCL plan Areas that lend themselves well to OCL specifications Collision detection of plane with ground/objects No re-initialization of sound system Placement of bubbles/buildings on terrain (must be within the boundaries of the world) Checking win-condition for a level (must have “touched” all bubbles)
GlobalFlyer Web Site
UML Models
FrameStarted Sequence Diag
Class Diagram Overview
The FrameListener
The Camera
The Plane
The Physics
The Sound OldNew
Source Code
Floating Bubbles!
Lots and lots of bubbles…
Bubbly Source ballNode = mSceneMgr->getRootSceneNode ()->createChildSceneNode ( StringConverter::toString (i), Vector3 ( Math::RangeRandom (1000, 14000), Math::RangeRandom(500,1000), Math::RangeRandom (1000, 14000))); ballEntity = mSceneMgr->createEntity (StringConverter::toString (i), "sphere.mesh"); //ballEntity->setMaterialName("GlobalFlyer/YellowSphere"); ballEntity->setMaterialName("GlobalFlyer/RedSphere"); //ballEntity->setMaterialName("GlobalFlyer/BlueSphere"); ballEntity->setCastShadows(true); ballNode->attachObject(ballEntity); sample_application.cpp
Bubbly Source FileSystem=../../new_media/materials/scripts FileSystem=../../new_media/materials/textures resources.cfg
Bubbly Source Texture_spheremap.png
Bubbly Source material GlobalFlyer/RedSphere {technique {pass {ambient diffuse texture_unit {texture spheremap.png env_map spherical rotate_anim 0.1 }}}} gf.material
Sound, glorious sound
Sound Source bool CFmod::initialized = false; bool CFmod::InitSoundSystem() { if (!initialized) { if (!FSOUND_Init(44100, 32, FSOUND_INIT_GLOBALFOCUS)) { DisplayError(); return false; } initialized = true; } return true; } fmod.cpp
Sound Source void CFmod::FreeSoundSystem() { FSOUND_Close(); initialized = false; } fmod.cpp
Sound Source void CFmod::SetLoop(bool loop, int start, int end) { if (m_pSound != NULL) { if (loop) { FSOUND_Sample_SetMode ( m_pSound, FSOUND_LOOP_NORMAL ); if( start >= 0 && end >= 0) { FSOUND_Sample_SetLoopPoints( m_pSound, start, end); } } else { FSOUND_Sample_SetMode ( m_pSound, FSOUND_LOOP_OFF ); } fmod.cpp
Sound Source // in constructor CFmod::InitSoundSystem(); musicSound.Load("../../new_media/audio/GlobalFlyer.mp3"); musicSound.SetLoop(true, -1, -1); musicSound.Play(); engineSound.Load("../../new_media/audio/engine.wav"); engineSound.SetLoop(true, 5000, 70000); engineSound.Play(); crashSound.Load("../../new_media/audio/crash.wav"); … // at crash// at restart engineSound.Pause();crashSound.Stop(); crashSoundStarted = true;crashSoundStarted = false; crashSound.Play();engineSound.Pause(); ogre_character.cpp
MouseLook MouseListener, MouseMotionListenerMouseListener, MouseMotionListener void mouseDragged(MouseEvent* e) void mouseDragged(MouseEvent* e) mEventProcessor?! mEventProcessor?!
EventProcessor ExampleFrameListener.hExampleFrameListener.h –mEventProcessor always instantiates SampleListener.cppSampleListener.cpp –Initialize mEventProcessor –Add mouse-related event listeners –Start processing events
mouseDragged() void SampleListener::mouseDragged(MouseEvent* e) { //mChar->getCameraNode()->setAutoTracking(false); //mChar->getSightNode()->yaw(Degree(-e->getX()*mRotate)); //mChar->getSightNode()->pitch(Degree(-e->getY()*mRotate)); if (mExCamera) { mExCamera->instantUpdate(mChar->getCameraNode()- >getWorldPosition(), mChar->getCameraNode()- >getWorldPosition() + (100*(Vector3(-e->getX(), -e->getY(), e- >getZ())))); //mExCamera->mouseLook(-e->getRelX(), -e->getRelY(), mRotate); }
Analysis of Iteration 1
DateBCWSBCWPACWPBACEVSPISVCPICV 2/2/ % /9/ %inf %300 2/16/ %inf %570 2/23/ %inf %-360 3/2/ %100.00%087.23%-360 Table of Measurements
Earned Value The sum of the planned values for all completed tasks Shows that tasks were completed at regular intervals up until the 27 th when Iteration 1 was schedule to be completed
Schedule Performance Index Budgeted Cost of Work Performed over Budgeted Cost of Work Scheduled
Schedule Variance Budgeted Cost of Work Performed less the Budgeted Cost of work Scheduled
Cost Performance Index Budgeted Cost of Work Performed over Actual Cost of Work Performed For the first 2 weeks, over estimated For the last 2 week, under estimated
Cost Variance Budgeted Cost of Work Performed over Actual Cost of Work Performed Same as Cost Performance Index
Members Comparison
Plan for Iteration 2
Who has Questions? -Images from texasbestgrok.mu.nu/images/GF2.jpg