www.pudn.com > sxdl.zip > main.cpp


#include "main.h"  
 
// 
// This sample contributed by Nicolas 'Galdor' Martyanoff ( aka DarkMaster.Sp )  
//  
 
CApp game ;  
 
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )  
{  
    return game.FrameworkRun ( hInst ) ;  
}  
 
// ========================================================================== 
 
Resource CApp::Resources [ ] =  
{  
   { Tex1	   , Resource::Texture, NULL   , true	 , "tex1.jpg" } , 
   { Null      , Resource::Null   , NULL   , false   , NULL } ,  
} ;  
 
void CApp::OnStartup( void )  
{  
   FrameworkName ( TEXT ( "TPE 2003/04: Balistique" ) ) ;  
   FrameworkMode ( Window ) ;  
   FrameworkWindow ( 800, 600, false ) ; 
   Media.Table ( Resources ) ;  
}  
 
void CApp::OnCreateGame( ) 
{  
	Input.Register ( CInput::FirePrimary ) ; 
	Input.Register ( CInput::UpDown ) ; 
	Input.Register ( CInput::LeftRight ) ; 
 
	Timing.Speed ( 1.0f ) ;  
 
	RBall1 = new CBasicSprite( Tex1, 0xffffffff, 0, 0, 16, 16 ) ; 
	Ball1 = new CBall( RBall1 ) ; 
 
	RPoint = new CBasicSprite( Tex1, 0xffffffff, 16, 0, 16, 16 ) ; 
 
	Ball1->Position = InitPos ; 
	Ball1->Velocity = InitVit ; 
 
	Verdana20 = new CFont( "verdana", 20, CFont::Bold ) ; 
	Verdana10 = new CFont( "verdana", 10 ) ; 
	Verdana10Bold = new CFont( "verdana", 10, CFont::Bold ) ; 
 
	TextFocus = 1 ; 
	PutPoint = false ; 
 
	Timing.SetTimer( TPoints, 0.1f, false ) ; 
 
	MenuDelay = MENU_DELAY ; 
	// disable mouse and joystick axis input  
	Input.EnableMouseAxis ( false ) ;  
	Input.EnableJoystickAxis ( false ) ;  
}  
 
void CApp::OnTimer ( int TimerId ) 
{ 
	if ( TimerId == TPoints ) 
	{ 
		PutPoint = true ; 
	} ; 
} 
 
void CApp::OnRenderText ( float ElapsedTime, float AbsoluteTime )  
{  
      D3DCOLOR couleur = D3DCOLOR_ARGB(255, 255, 255, 255 );  
 
	  #ifdef DEBUG 
		TCHAR texte[MAX_PATH] ;  
		TCHAR texte2[MAX_PATH] ;  
		TCHAR texte3[MAX_PATH] ;  
		wsprintf ( texte, _T( "x: %d" ), ( int ) ( Ball1->Position.x ) ) ;   
		wsprintf ( texte2, _T( "y: %d" ), ( int ) ( Ball1->Position.y ) ) ; 
		wsprintf ( texte3, _T( "Temps de vol: %d" ), ( int ) ( FlyTime ) ) ; 
		Verdana10->DrawText( 10, 10, couleur, texte ) ; 
		Verdana10->DrawText( 10, 30, couleur, texte2 ) ; 
		Verdana10->DrawText( 10, 50, couleur, texte3 ) ; 
	  #endif 
 
		TCHAR VitInit [ MAX_PATH ] ; 
		TCHAR AngleInit [ MAX_PATH ] ; 
		TCHAR Masse [ MAX_PATH ] ; 
 
		wsprintf ( VitInit, _T( "Vitesse initiale: %d m/s" ), ( int ) ( InitVits ) ) ; 
		wsprintf ( AngleInit, _T( "Angle de tir: %d degres" ), ( int ) ( InitAngle ) ) ; 
		wsprintf ( Masse, _T( "Masse du projectile: %d kg" ), ( int ) ( InitMass ) ) ; 
 
		Verdana20->DrawText( 0, 30, couleur, "Simulation Balistique", CFont::Centered_X ) ; 
 
		if ( TextFocus == 1 ) 
		{ 
				Verdana10Bold->DrawText( 10, 500, couleur, VitInit ) ; 
		} 
		else 
		{ 
				Verdana10->DrawText( 10, 500, couleur, VitInit ) ; 
		} ; 
		if ( TextFocus == 2 ) 
		{ 
				Verdana10Bold->DrawText( 10, 520, couleur, AngleInit ) ; 
		} 
		else 
		{ 
				Verdana10->DrawText( 10, 520, couleur, AngleInit ) ; 
		} ; 
		if ( TextFocus == 3 ) 
		{ 
				Verdana10Bold->DrawText( 10, 540, couleur, Masse ) ; 
		} 
		else 
		{ 
				Verdana10->DrawText( 10, 540, couleur, Masse ) ; 
		} ; 
} 
 
inline void CApp::OnUserInput ( CInput::VirtualKeys VirtualKey , float ElapsedTime, float Value )  
{  
	// Si click gauche, on remet la balle au départ 
	if ( VirtualKey == CInput::FirePrimary )  
	{  
		Ball1->Position = InitPos ; 
		BulletTime = 0.0f ; 
		FlyTime = 0.0f ; 
		game.Clean( CApp::Bullets ) ; 
		return ;  
	} ; 
	// si gauche ou droite, on diminue au augmente la valeur où est la focale 
	if ( VirtualKey == CInput::LeftRight )  
	{  
		float Dir ; 
		Value > 0.0f ? Dir = -1.0f : Dir = 1.0f ; 
		switch ( TextFocus ) 
		{ 
		case 1: 
				  InitVits += Dir * PARAM_SPEED * ElapsedTime ; 
				  break ; 
		case 2: 
				  InitAngle += Dir * PARAM_SPEED * ElapsedTime ; 
				  break ; 
		case 3: 
				  InitMass += Dir * PARAM_SPEED * ElapsedTime ; 
				  break ; 
		} ; 
		return ;  
	} ; 
	// si haut ou bas, on déplace le focus 
	if ( VirtualKey == CInput::UpDown && MenuDelay <= 0.0f) 
	{ 
		if ( Value < 0.0f ) 
		{ 
			if ( TextFocus == 3 ) 
			{ 
				TextFocus = 1 ; 
				MenuDelay = MENU_DELAY ; 
			} 
			else 
			{ 
				TextFocus++ ; 
				MenuDelay = MENU_DELAY ; 
			} ; 
		}  
		else if ( Value > 0.0f ) 
		{ 
			if ( TextFocus == 1 ) 
			{ 
				TextFocus = 3 ; 
				MenuDelay = MENU_DELAY ; 
			} 
			else 
			{ 
				TextFocus-- ; 
				MenuDelay = MENU_DELAY ; 
			} ; 
		} ; 
		return ;  
	} ; 
}  
 
void CApp::OnAnimate( float ElapsedTime, float AbsoluteTime ) 
{ 
	// Time Delay pour le mini-menu 
	game.MenuDelay -= ElapsedTime ; 
	// Temps de vol 
	FlyTime += ElapsedTime ; 
	// On met des Points sur le trajet du projectile 
	if ( Ball1->IsVisible( CEntity::AABB2D  ) == true && PutPoint == true ) 
	{ 
		new CPoint( RPoint, Ball1->Position ) ; 
		PutPoint = false ; 
		PointCounter++ ; 
	} ; 
} 
 
 
// ========================================================================== 
 
CBall::CBall( CBasicSprite * x ) 
{ 
	WillRenderLike( x ) ; 
	Scale = Vector3( 16.0f, 16.0f, 0.0f ) ; 
	Mass = InitMass ; 
	Activate ( true, true ) ; 
} 
 
bool CBall::OnAnimate( float ElapsedTime, float AbsoluteTime ) 
{ 
	// On met à jour le temps de vol 
	BulletTime += ElapsedTime ; 
	// On stocke les anciennes coordonnées 
	OldPos = Position ; 
	//on récupère les params dans les vecteurs 
	//float FloatAgl = ( InitAngle / 180.0f ) * Pi ; 
	float FloatAgl = InitAngle ; 
	FloatAgl /= 180.0f ; 
	FloatAgl *= Pi ; 
	Vector3 Vitesse = NULL_VECTOR ; 
	//Vitesse.x = InitVits * cosf( FloatAgl ) ; 
	Vitesse.x = cosf( FloatAgl ) ; 
	Vitesse.x *= InitVits ; 
	//Vitesse.y = InitVits * sinf( FloatAgl ) ; 
	Vitesse.y = sinf( FloatAgl ) ; 
	Vitesse.y *= InitVits ; 
	Vector3 Gravity = NULL_VECTOR ; 
	//Gravity.y = KPesanteur * InitMass * FlyTime ; 
	Gravity.y = KPesanteur ; 
	Gravity.y *= InitMass ; 
	Gravity.y *= FlyTime ; 
	// On calcule la nouvelle velocite 
	Velocity = Vitesse ; 
	Velocity -= Gravity ; 
	// Si le projectile quitte l'écran, on le replace au début 
	if ( Position.y < -400.0f || Position.x > 400.0f ) 
	{ 
		Position = InitPos ; 
		BulletTime = 0.0f ; 
		FlyTime = 0.0f ; 
		game.Clean( CApp::Bullets ) ; 
	} ; 
 
	return true ; 
} 
 
// ========================================================================== 
 
CPoint::CPoint( CBasicSprite * x ) 
{ 
	WillRenderLike( x ) ; 
	Scale = Vector3( 16.0f, 16.0f, 0.0f ) ; 
	Family = CApp::Bullets ; 
	Activate( true, true ) ; 
} 
 
CPoint::CPoint( CBasicSprite * x, Vector3 InitPos ) 
{ 
	WillRenderLike( x ) ; 
	Scale = Vector3( 16.0f, 16.0f, 0.0f ) ; 
	Position = InitPos ; 
	Family = CApp::Bullets ; 
	Activate( true, true ) ; 
}