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 &amt;&amt; 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 &amt;&amt; 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 ) ;
}