Title: SE%20Team%209%20GlobalFlyer
1SE Team 9GlobalFlyer
- Cole HoosierRyan HannebaumLeanne GrayAlex
Stampbach
2Project 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.
3Iteration Plans
Fixup 1 Get music and sound effects working
again 2 Get collision detection with buildings
working 3 Update Ogre library versions 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.
4GlobalFlyer Web Site
- http//seteam9.cis.ksu.edu/
5The Plan and Analysis
6Plan for Iteration 3
7Comparisons of Effort
8(No Transcript)
9BCW ACW Est Comp Actual Comp
Iter 1 Fixup 1020 720 2/26/2007 2/3/2007
Iter 1 Visual 660 390 2/26/2007 2/10/2007
Iter 1 UI 600 1470 2/26/2007 2/23/2007
Pres 4 180 240 2/27/2007 2/23/2007
Iter 2 Fixup VE
- initial research 180 120 3/6/2007 3/5/2007
- create slides 120 60 3/13/2007 3/12/2007
- collision detection with buildings 300 240 3/20/2007 3/10/2007
- proximity detection with bubbles 120 60 3/27/2007 3/10/2007
- create OCL 120 120 3/29/2007 3/26/2007
- test code 60 60 3/30/2007 3/26/2007
- integrate code 60 60 4/1/2007 3/26/2007
Iter 2 UI
- initial research 180 120 3/6/2007 3/5/2007
- create slides 120 60 3/13/2007 3/12/2007
- prettify text 240 600 3/20/2007 3/26/2007
- test readout 120 90 3/27/2007 3/26/2007
- integrate code 120 30 3/30/2007 3/26/2007
Pres 5
- assemble presentation 240 240 4/1/2007 4/1/2007
Open House
- prepare display 240 330 4/10/2007 4/9/2007
- rehearse/test presentation 120 0 4/13/2007 4/9/2007
Iter 3 Update Ogre libraries
- update libraries and fix code 360 480 4/22/2007 4/23/2007
- test code and create slides 120 120 4/27/2007 4/27/2007
Iter 3 Visual 800 0 4/27/2007 3/10/2007
Iter 3 UI
- study methods of toggling settings 240 180 4/22/2007 4/25/2007
- implement toggling test 120 120 4/27/2007 4/25/2007
Pres 6
- assemble presentation 240 240 4/29/2007 4/29/2007
Final Docs CD 240 180 5/4/2007 4/29/2007
Total 6920 6330
10Earned Value
- EV Budgeted cost of Work Performed over Budgeted
at Completion - Shows our the gradual completion of tasks over
time
11Schedule Performance Index
- SPI Budgeted Cost of Work Performed over
Budgeted Cost of Work Schedule - Shows that we are always on or ahead of schedule
12Schedule Variance
- SV Budgeted Cost of Work Performed minus
Budgeted Cost of Work Schedule - Show how far ahead of schedule (or right on
target) we were
13Cost Performance Index
- CPI Budgeted Cost of Work Performed over Actual
Cost of Work Performed - Show us under budget and over budget but finally
ending under (just barely)
14Cost Variance
- CV Budgeted Cost of Work Performed minus Actual
Cost of Work Performed - Show just how much over and under budget we were
15OCL
16OCL
- 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
17OCL
- The airplane cannot fly beneath the ground
- context OgreCharacterupdate(elapsedTime,
input) void - post self.raySceneQuery-gtforAll(
worldFragment.singleIntersection.y lt
self.mMainNode.getPosition().y )
18OCL
- The FMOD sound system shouldn't be re-initialized
- context CFModInitSoundSystem() bool
- pre self.initialized false
- post self.initialized true
19OCL
- The bubbles and buildings must be within the
boundaries of the world - context SampleApplicationcreateScene() void
- post self.buildings.getBoundingBox-gtforAll( getM
inimum.x gt 0 and getMinimum.z gt 0 and
getMaximum.x lt 10000 and getMaximum.z lt
10000 ) - post self.bubbles.getBoundingBox-gtforAll( getMin
imum.x gt 0 and getMinimum.z gt 0 and
getMaximum.x lt 10000 and getMaximum.z lt
10000 )
20OCL
- Checking the win-condition for a level --
theoretically we would load a new level after
hitting all targets - context OgreCharactertargetsRemaining() int
- result self.targetHit-gtcount(false)
- context OgreCharactercheckWin() bool
- result self.targetsRemaining 0
- context SampleListenerframeStarted(frameEvent)
void - post self.mChar.checkWin false
21Testing Code
void SoundPlay() debug ("SoundPlay
1") if (m_pSound ! NULL)
debug ("SoundPlay 2a") m_soundChannel
FSOUND_PlaySound(FSOUND_FREE, m_pSound)
else debug ("SoundPlay 2b.")
debug ("SoundPlay 3 (last)")
22Testing Output
AirplaneAirplane (only) AirplaneGetPosit
(only) AirplaneGetRelVeloc (only) AirplaneGetV
eloc (only) AirplanecheckWin (only) Airplanein
Obstacle 1 AirplaneinObstacle
2 AirplaneinObstacle 3a AirplaneinObstacle
3b. AirplaneinObstacle 4a AirplaneinObstacle
4b. AirplaneinObstacle 5a AirplaneinObstacle
5b. AirplaneinObstacle 6 (last)
23Exceptions to C1
SoundInitSoundSytem 3a -- would need an invalid
version of fmod SoundInitSoundSytem 4a -- would
need a bad version of fmod SoundLoad 3a -- fmod
would have to screw up to hit this
case SoundMute 2b. -- fmod would have to screw
up to hit this case SoundPause 2b. -- fmod
would have to screw up to hit this
case SoundSetLoop 2b. -- fmod would have to
screw up to hit this case
bool SoundLoad(char strName) debug
("SoundLoad 1") bool retval false // set
to 'true' if successfully loaded // if FMOD
isn't loaded, or strName is invalid, we can't
load a sample if (initialized
strName) debug ("SoundLoad
2a") m_pSound FSOUND_Sample_Load(FSOUND_FREE,
strName, 0, 0, 0) // make sure we got a valid
sound pointer if (!m_pSound ) debug
("SoundLoad 3a") // bad news, bail out with
an error message DisplayError() ..
24UML Models
25FrameStarted Sequence Diag
26Old Class Diagram Overview
27New Class Diagram
Extended Camera
GlobalFlyer
ExtendedFrame Listener
Sound
Airplane
Level Manager
PhysicsEngine
28GlobalFlyer
29ExtendedFrameListener
30ExtendedCamera
31LevelManager
32Airplane
33PhysicsEngine
34Sound
35New Featuresand Updates
36Library Update
- Ogre has updated from 1.2.3 to 1.4.0 during the
year. We thought it might be nice to start next
years team with updated code. ?
37Wheres the Keyboard?
using namespace OIS void AirplaneUpdate (Real
elapsedTime, Keyboard keyboard, Mouse mouse)
if ( keyboard-gtisKeyDown(KC_W) ).
airplane.h,c
38LevelManager
- Sets up the world
- Bubbles
- Buildings
- Format follows
- int buildingPositionsMAX_LEVELMAX_BUILDINGS6
-
- //level 2
- 5000, 0, 6000, 50, 950, 3000, // x, y, z,
width, height, length - 10000, 0, 6000, 50, 950, 3000, // 1
- 6000, 0, 5000, 3000, 950, 50, // 2
- 6000, 0, 10000, 3000, 950, 50,
- 6000, 1000, 6000, 3000, 50, 3000,
- 0, 0, 0, 0, 0, 0, // 5
39LevelManager
40LevelManager
41Camera Controls
if (mKeyboard-gtisKeyDown (KC_F1)
mExCamera) mExCamera-gtSetTightness (1.0f)
else if (mKeyboard-gtisKeyDown (KC_F2)
mExCamera) mExCamera-gtSetTightness (0.1f)
else if (mKeyboard-gtisKeyDown (KC_F3)
mExCamera) mExCamera-gtSetTightness (0.05f)
else if (mKeyboard-gtisKeyDown (KC_F4)
mExCamera) ..
extended_frame_listener.cpp
42Camera Controls
43Sight Sound
- bind keys to toggle cockpit and sound
- create guard variable to ensure only a single
toggle per click
44Toggle Cockpit
F9
45Toggle Cockpit
- Void ExtendedFrameListenersetTextArea(OgreOve
rlay olay) - overlay olay
-
-
- //toggle GUI
- if (mInputDevice-gtisKeyDown (KC_F9)
keyCountGUI gt 0.5) - if (overlay-gtisVisible())
- overlay-gthide()
-
- else
- overlay-gtshow()
-
- keyCountGUI 0
46Toggle Sound
F10
47Toggle Sound
- if (mKeyboard-gtisKeyDown (KC_F10) mChar
keyCountSound gt 0.5) -
- bool enabled
- enabled mChar-gtToggleSound()
- keyCountSound 0
- if (enabled)
-
- status-gtsetCaption("Sound Enabled")
- else
-
- status-gtsetCaption("Sound Disabled")
-
- else if (keyCountSound gt 4.0)
-
- status-gtsetCaption("")
void AirplanetoggleSound() soundEnabled
!soundEnabled musicSound.Mute() if
(soundEnabled) if (crashed)
crashSound.Mute() else
engineSound.Play() else if
(crashSoundStarted) crashSound.Mute()
else engineSound.Stop()
48Protection from Rapid-Fire
- key press was registering every frame (up to 250
times per second) - Introduced timer to guard against this rapid-fire
toggling - once toggle is registered, cannot be registered
again for 0.5 second
49The Result
50Who has Questions?
- -Images from
- texasbestgrok.mu.nu/images/GF2.jpg