void CSquirrel::Update( FLOAT32 fTimeDelta ) { if ( 0 == m_uNumLives ) { return; } const static CFVec2 s_vMoveOffsets[] = { SFVec2( -1.0f, 0.0f ), //"Left", SFVec2( 1.0f, 0.0f ), //"Right", SFVec2( 0.0f, -1.0f ), //"Up", SFVec2( 0.0f, 1.0f ), //"Down" }; _COMPILE_ASSERT( _ARRAY_SIZE( s_vMoveOffsets ) == EMove_COUNT ); CFVec2 vMove = SFVec2( 0.0f, 0.0f ); for ( UINT32 i=0; i< EMove_COUNT; i++ ) { if ( m_Movements[i].m_bValue ) { vMove += s_vMoveOffsets[i]; } } // great, now we have the movement direction. if ( vMove.SquareMagnitude() != 0.0f ) { m_fDistTimeMoving += fTimeDelta; vMove.Normalise(); FLOAT32 fStep = 1.0f; CFVec2 vTestedMove = vMove * fTimeDelta * m_fSpeed * fStep; // now check the target position - is it embedded in any walls? CCircle TargetBounds; while ( fStep > 0.0f ) { TargetBounds.Initialise( m_vPosition + vTestedMove, m_fRadius ); if ( false == CMMMContext::GetInstance().CircleIntersectsGeometry( TargetBounds ) ) { break; // found a valid, allowable movement. } fStep -= 0.2f; vTestedMove = vMove * fTimeDelta * m_fSpeed * fStep; } // now update to the new position m_vPosition += vTestedMove; // finally what happens at the new position // is an acorn collected? if ( m_uNumAcorns != m_uMaxAcorns ) { CAcorn* pLevelAcorns; UINT32 uNumLevelAcorns; CMMMContext::GetInstance().GetAcorns( pLevelAcorns, uNumLevelAcorns ); for ( UINT32 i=0; i<uNumLevelAcorns; i++ ) { if ( pLevelAcorns[i].GetState() == CAcorn::ES_Available ) { if ( pLevelAcorns[i].Intersects( TargetBounds ) ) { pLevelAcorns[i].SetState( CAcorn::ES_Carried ); m_ppAcorns[m_uNumAcorns++] = pLevelAcorns+i; if ( m_uNumAcorns == m_uMaxAcorns ) { break; // cannont collect any more! } } } } } // is a tunnel reached? if ( m_uNumAcorns > 0 ) { CTunnel* pTunnels; UINT32 uNumTunnels; CMMMContext::GetInstance().GetTunnels( pTunnels, uNumTunnels ); for ( UINT32 i=0; i<uNumTunnels; i++ ) { if ( pTunnels[i].Intersects( TargetBounds ) ) { // reached the tunnel. for ( UINT32 i=0; i<m_uNumAcorns; i++ ) { m_ppAcorns[i]->SetState( CAcorn::ES_Collected ); m_uScore++; } m_uNumAcorns = 0; } } } } m_fTimeToDisturbance -= fTimeDelta; if ( m_fTimeToDisturbance <= 0.0f ) { // schedule the next disturbance. m_fTimeToDisturbance = FLOAT32(rand())/FLOAT32(RAND_MAX); m_fTimeToDisturbance *= m_fMaxDistSep-m_fMinDistSep; m_fTimeToDisturbance += m_fMinDistSep; // create this disturbance: FLOAT32 fRad = m_fLastDistDelay=0.0f?0.0f:m_fDistTimeMoving/m_fLastDistDelay; // DbgPrint( "Creating Disturbance strength %0.2f, next delay %0.2f\n", fRad,m_fTimeToDisturbance ); fRad *= m_fMaxDistRad-m_fMinDistRad; fRad += m_fMinDistRad; if ( fRad >= 0.0f ) { CCircle Dist; Dist.Initialise( m_vPosition, fRad ); CMMMContext::GetInstance().CreateDisturbance( Dist ); } m_fDistTimeMoving = 0.0f; m_fLastDistDelay = m_fTimeToDisturbance; } }
/** * Initialise the squirrel from the provided parser. */ bool CSquirrel::Init( GDE::CDataParser* pParser ) { m_fMinDistSep = 0.2f; m_fMaxDistSep = 1.0f; m_fTimeToDisturbance = 0.0f; m_fLastDistDelay = 0.0f; m_fDistTimeMoving = 0.0f; m_fMinDistRad = 0.0f; m_fMaxDistRad = 200.0f; m_uScore = 0; m_ppAcorns = NULL; m_uNumAcorns = 0; m_vPosition = SFVec2( 100.0f, 100.f ); m_pSprite = NULL; /** * Tokens to look up in the parser for each movement. */ const static char* s_strMoveTokens[] = { "Left", "Right", "Up", "Down" }; _COMPILE_ASSERT( _ARRAY_SIZE( s_strMoveTokens ) == EMove_COUNT ); if ( false == pParser->GetValue( m_fSpeed, "Squirrel", "Speed" ) ) { assert_now( "Unable to parse squirrel speed" ); return false; } if ( false == pParser->GetValue( m_fRadius, "Squirrel", "Radius" ) ) { assert_now( "Unable to parse squirrel radius" ); return false; } if ( false == pParser->GetValue( m_uMaxLives, "Squirrel", "MaxLives" ) ) { assert_now( "Unable to parse maximum squirrel lives" ); return false; } m_uNumLives = m_uMaxLives; if ( false == pParser->GetValue( m_uMaxAcorns, "Squirrel", "MaxAcorns" ) ) { assert_now( "Unable to parse maximum squirrel acorns" ); return false; } m_ppAcorns = new CAcorn*[m_uMaxAcorns]; if ( false == pParser->GetValue( m_fMinDistSep, "Squirrel", "MinDisturbanceSep" ) ) { assert_now( "Unable to parse squirrel MinDisturbanceSep" ); return false; } if ( false == pParser->GetValue( m_fMaxDistSep, "Squirrel", "MaxDisturbanceSep" ) ) { assert_now( "Unable to parse squirrel MaxDisturbanceSep" ); return false; } if ( false == pParser->GetValue( m_fMinDistRad, "Squirrel", "MinDisturbanceRad" ) ) { assert_now( "Unable to parse squirrel MinDisturbanceRad" ); return false; } if ( false == pParser->GetValue( m_fMaxDistRad, "Squirrel", "MaxDisturbanceRad" ) ) { assert_now( "Unable to parse squirrel MaxDisturbanceRad" ); return false; } // parse and get input bindings: const static UINT32 uMAX_BINDING_LEN = 32; char strInputBinding[uMAX_BINDING_LEN+1]; GDE::CInputDevice* pDevice = CMMMContext::GetInstance().GetInput(); for ( UINT32 i=0; i<EMove_COUNT; i++ ) { m_Movements[i].m_bValue = false; if ( false == pParser->GetString( strInputBinding, uMAX_BINDING_LEN, "Squirrel", s_strMoveTokens[i] ) ) { assert_now( "Unable to find squirrel movement binding for %s", s_strMoveTokens[i] ); return false; } // now get code if ( false == pDevice->GetInputCode( strInputBinding, m_Movements[i].m_uInputCode ) ) { assert_now( "Unable to bind squirrel input \"%s\" for movement %s", strInputBinding, s_strMoveTokens[i] ); return false; } } const static UINT32 uMAX_SPRITENAME_LEN = 128; char strTexture[uMAX_SPRITENAME_LEN]; if ( false == pParser->GetString( strTexture, uMAX_SPRITENAME_LEN, "Squirrel", "Sprite" ) ) { assert_now( "Unable to find squirrel sprite name" ); return false; } m_pSprite = CMMMContext::GetInstance().GetSpriteM()->FindResouceById( GDE::CResourceId( strTexture ) ); if ( NULL == m_pSprite ) { GDE::CTexture* pTexture = CMMMContext::GetInstance().GetRenderer()->GetTextureManager().LoadResource( strTexture ); if ( NULL == pTexture ) { assert_now( "Unable to find Image \"%s\" for Squirrel", strTexture ); return false; } GDE::SFRect TexRect; TexRect.m_fX = 0.0f; TexRect.m_fY = 0.0f; TexRect.m_fWidth = (FLOAT32)pTexture->GetWidth(); TexRect.m_fHeight = (FLOAT32)pTexture->GetHeight(); m_pSprite = CMMMContext::GetInstance().GetSpriteM()->CreateSprite( GDE::CResourceId( strTexture ), pTexture, TexRect ); m_pSprite->SetHotSpot( TexRect.m_fWidth*0.5f, TexRect.m_fHeight*0.5f ); pTexture->Release(); // now held inside the sprite. } return true; }
{ '2', '@', "Key2" }, { '3', '#', "Key3" }, { '4', '$', "Key4" }, { '5', '%', "Key5" }, { '6', '^', "Key6" }, { '7', '&', "Key7" }, { '8', '*', "Key8" }, { '9', '(', "Key9" }, { ' ', ' ', "KeySpace" }, { '-', '-', "KeyMinus" }, { '.', '>', "KeyPeriod" }, { ',', '<', "KeyComma" }, { '/', '?', "KeySlash" }, }; _COMPILE_ASSERT( _ARRAY_SIZE( gs_RequiredKeys ) == CEnterTextListener::uMAX_CHARACTERS_SUPPORTED ); CEnterTextListener::CEnterTextListener( void ) : m_uMaxStringLen( 0 ) , m_uStrLen( 0 ) , m_pString( NULL ) , m_bHasCompleted( false ) { } CEnterTextListener::~CEnterTextListener( void ) { delete[] m_pString; } void CEnterTextListener::Init( UINT32 uMaxLen )