示例#1
0
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;
	}



}
示例#2
0
/**
 *	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 )