topical media & game development
lib-game-darkgdk-samples-Road-Terrain-Main.cpp / cpp
// Dark GDK - The Game Creators - www.thegamecreators.com
include <DarkGDK.h>
// Functions
void createStrap ( void );
void controlStrap ( void );
// Globals
int iStrapX1 = 0;
int iStrapX2 = 0;
int iMat = 0;
float carx = 240;
float ss = 100;
float roadz = 0.0f;
float side = 0.0f;
int tr = 0;
int c = 0;
float heada = 0.0f;
int t = 0;
void DarkGDK ( void )
{
dbSetDir ( "media\\" );
int iMat = 0;
dbSyncOn ( );
dbSyncRate ( 60 );
dbBackdropOff ( );
// Loading screen
dbLoadBitmap ( "media\\gfx\\backdrop1.jpg" , 1 );
dbCopyBitmap ( 1 , 0 , 0 , 640 , 480 , 0 , 0 , 0 , dbScreenWidth ( ) , dbScreenHeight ( ) );
dbSync ( );
dbSync ( );
dbDeleteBitmap ( 1 );
// Setup strapline
createStrap ( );
// Setup terrain
dbLoadImage ( "media\\world\\rock.jpg" , 1 );
dbLoadBitmap ( "media\\world\\land.bmp" , 1 );
for ( iMat = 0 ; iMat < 8 ; iMat++ )
{
dbMakeMatrix ( 1 + iMat , 512 , 512 , 32 , 32 );
dbPositionMatrix ( 1 + iMat , 0.0f , -2.0f , 512.0f * iMat );
dbPrepareMatrixTexture ( 1 + iMat , 1 , 33 , 33 );
dbSetMatrixTexture ( 1 + iMat , 2 , 1 );
}
dbSetCurrentBitmap ( 1 );
dbLockPixels ( );
int tc = 1;
int col = 0;
float h = 0.0f;
for ( int z = 0 ; z < 32 ; z++ )
{
for ( int x = 0 ; x < 32 ; x++ )
{
col = dbPoint ( x , z );
h = dbRGBR ( col ) / 4.0f;
for ( iMat = 0 ; iMat < 8 ; iMat++ )
{
dbSetMatrixHeight ( 1 + iMat , x , z , h );
dbSetMatrixTile ( 1 + iMat , 31 - x , z , tc );
}
tc++;
}
tc++;
}
dbUnLockPixels ( );
dbDeleteBitmap ( 1 );
for ( iMat = 0 ; iMat < 8 ; iMat++ )
{
dbUpdateMatrix ( 1 + iMat );
}
dbSetCurrentBitmap ( 0 );
// Create high quality road surface
dbLoadImage ( "media\\world\\road.jpg" , 11 );
for ( int r = 0 ; r < 8 ; r++ )
{
dbMakeObjectPlane ( 11 + r , 128.0f , 512.0f );
dbPositionObject ( 11 + r , 256.0f + 10.0f , 0.025f , 512.0f * r );
dbTextureObject ( 11 + r , 11 );
dbXRotateObject ( 11 + r , 90.0f );
dbSetObjectTexture ( 11 + r , 1 , 1 );
dbScaleObjectTexture ( 11 + r , 2 , 8 );
}
// Load sky and set it up
dbSetCameraRange ( 2.5 , 15000 );
dbLoadObject ( "media\\sky\\os.x" , 1 );
dbPositionObject ( 1 , 256 , 30 , 0 );
dbSetObjectTexture ( 1 , 2 , 1 );
dbSetObjectLight ( 1 , 0 );
dbSetObjectCull ( 1 , 0 );
dbYRotateObject ( 1 , 270 );
dbScaleObject ( 1 , 250 , 250 , 250 );
// Setup mountain range
dbSetImageColorKey ( 255 ,0 , 255 );
dbLoadImage ( "media\\sky\\mountains.bmp" , 4 );
dbMakeObjectPlane ( 4 , 1024 * 20.5 , 128 * 20.5 );
dbSetObjectTexture ( 4 , 2 , 1 );
dbSetObjectLight ( 4 , 0 );
dbSetObject ( 4 , 1 , 1 , 0 );
dbTextureObject ( 4 , 4 );
// Two bikes
int obj;
dbSetImageColorKey ( 128, 128, 128 );
for ( c = 0 ; c < 2 ; c++ )
{
// Load bike
obj = 5 + ( c * 100 );
if ( c == 0 ) dbLoadObject ( "media\\bike\\bike.x" , obj );
if ( c == 1 ) dbLoadObject ( "media\\bike\\bike2.x" , obj );
dbPositionObject ( obj , 256 , 2 , 500 );
dbScaleObject ( obj , 1000 , 1000 , 1000 );
dbRotateObject ( obj , 0 , 180 , 0 );
dbFixObjectPivot ( obj );
dbRotateObject ( obj , 0 , 0 , 0 );
dbSetObjectLight ( obj , 0 );
}
// Create ten trees for road
dbSetImageColorKey ( 0 , 0 , 0 );
dbLoadImage ( "media\\world\\tree.jpg" , 501 );
for ( tr = 1 ; tr < 11 ; tr++ )
{
dbMakeObjectPlane ( 500 + tr , 128 , 128 );
int r = dbRnd ( 1 );
if ( r = 0 ) dbPositionObject ( 500 + tr , 160.0f - dbRnd ( 400 ) , 64.0f , 51.0f * ( 100.0f + dbRnd ( 150 ) ) );
if ( r = 1 ) dbPositionObject ( 500 + tr , 370.0f + dbRnd ( 400 ) , 64.0f , 51.0f * ( 100.0f + dbRnd ( 150 ) ) );
dbTextureObject ( 500 + tr , 501 );
dbSetObject ( 500 + tr , 1 , 1 , 1 );
}
// Setup camera, light
dbSetPointLight ( 0 , 256 , 300 , 256 );
dbSetCameraFOV ( 120 );
dbRotateCamera ( 0 , 0 , 0 );
dbSetAmbientLight ( 50 );
// Load bike sound
dbLoad3DSound ( "media\\sounds\\car.wav" , 1 );
dbPositionSound ( 1 , 30000 , 30000 , 30000 );
dbLoopSound ( 1 );
// Init bike variables
carx = 240;
ss = 100;
// loop until the escape key is pressed
while ( LoopGDK ( ) )
{
if ( dbEscapeKey ( ) )
return;
// bike control
carx = dbWrapValue ( carx + 1.0f );
// Move on road
roadz += 15.0f;
side = dbWrapValue ( side + 0.3f );
if ( roadz >= 512.0f )
{
// move camera back
roadz -= 512.0;
// trees as relative
for ( tr = 1 ; tr < 11 ; tr++ )
{
dbPositionObject ( 500 + tr , dbObjectPositionX ( 500 + tr ) , 64 , dbObjectPositionZ ( 500 + tr ) -512 );
}
}
dbPositionCamera ( 256 + ( dbSin ( side ) * 10 ) , 12 + ( dbCos ( side ) * 5 ) , roadz + ( dbSin ( side ) * 20 ) );
dbXRotateCamera ( 0 , 10 );
// Position main light
dbPositionLight ( 0 , 200 , 800 , roadz );
// Make third matrix rise up over time
dbPositionMatrix ( 8 , 0 , -2 + ((( 512 - roadz ) / 10.0f ) * -1 ) , 512 * 7 );
// Keep sky and mountains in place
dbPositionObject ( 1 , 256 , 15 , roadz );
dbPositionObject ( 4 , 256 , 400 , roadz + ( 4684 ) );
dbYRotateObject ( 1 , dbWrapValue ( dbObjectAngleY ( 1 ) - 0.1f ) );
// Keep bike in place
for ( c = 0 ; c < 2 ; c++ )
{
// Position bike and parts
if ( c == 0 )
{
dbPositionObject ( 5 + ( c * 100 ) , 240 + ( dbCos ( carx ) * 8 ) , 0 , roadz + 35 + ( dbSin ( ss * 15 ) * 5 ) );
dbPositionObject ( 7 + ( c * 100 ) , 240 + ( dbCos ( carx ) * 8 ) , 0.1f , roadz + 35 + ( dbSin ( ss * 15 ) * 5 ) );
}
else
{
dbPositionObject ( 5 + ( c * 100 ) , 270 - ( dbCos ( carx ) * 8 ) , 0 , roadz + 35 + ( dbSin ( ss * 15 ) * 5 ) );
dbPositionObject ( 7 + ( c * 100 ) , 270 - ( dbCos ( carx ) * 8 ) , 0.1f , roadz + 35 + ( dbSin ( ss * 15 ) * 5 ) );
}
dbZRotateObject ( 5 + ( c * 100 ) , dbCos ( carx ) * 4 );
// Rotate bike wheels
heada = dbWrapValue ( heada + 2 );
if ( dbLimbExist ( 5 + ( c * 100 ) , 1 ) == 1 )
{
t = 7;
dbRotateLimb ( 5 + ( c * 100 ) , t , 0 , dbWrapValue ( dbCos ( heada ) * 20 ) , 0 );
t = 3;
dbRotateLimb ( 5 + ( c * 100 ) , t , dbWrapValue ( dbLimbAngleX ( 5 + ( c * 100 ) , t ) - 35 ) , 0 , 0 );
t = 5;
dbRotateLimb ( 5 + ( c * 100 ) , t , dbWrapValue ( dbLimbAngleX ( 5 + ( c * 100 ) , t ) - 35 ) , 0 , 0 );
}
}
// Move trees and wrap them
for ( tr = 1 ; tr < 11 ; tr++ )
{
// move tree
dbPositionObject ( 500 + tr , dbObjectPositionX ( 500 + tr ) , 64 , dbObjectPositionZ ( 500 + tr ) - 15 );
// wrap tree
if ( dbObjectPositionZ ( 500 + tr ) < -512 )
{
int r = dbRnd ( 1 );
if ( r == 0 ) dbPositionObject ( 500 + tr , 160.0f - dbRnd ( 400 ) , 64.0f , 51.0f * ( 100 + dbRnd ( 150 ) ) );
if ( r == 1 ) dbPositionObject ( 500 + tr , 370.0f + dbRnd ( 400 ) , 64.0f , 51.0f * ( 100 + dbRnd ( 150 ) ) );
}
}
// Move mountains closer and closer
if ( ss < 150.0f ) ss += 0.05f;
dbScaleObject ( 4 , ss , ss , ss );
// Set sound position for bike
dbPositionListener ( 256 , 5 + ( dbCos ( side ) * 5 ) , roadz + ( dbSin ( side ) * 35 ) );
dbPositionSound ( 1 , carx , 0 , roadz + 35 );
dbScaleListener ( 0.25 );
// Move strap line
controlStrap ( );
// Update screen
dbSync ( );
}
}
// Demo Functions
void createStrap ( void )
{
dbLoadImage ( "media\\gfx\\prompt1.jpg" , 2 );
dbLoadImage ( "media\\gfx\\strapblank1.jpg" , 3 );
iStrapX1 = 0;
dbSprite ( 1 , iStrapX1 , 480-63 , 2 );
iStrapX2 = 1024;
dbSprite ( 2 , iStrapX2 , 480-63 , 2 );
dbSetSpriteAlpha ( 1 , 196 );
dbSetSpriteAlpha ( 2 , 196 );
}
void controlStrap ( void )
{
iStrapX1--;
if ( iStrapX1 <= -1024 ) iStrapX1 = iStrapX2 + 1023;
iStrapX2--;
if ( iStrapX2 <= -1023 ) iStrapX2 = iStrapX1 + 1024;
dbSprite ( 1 , iStrapX1 , dbScreenHeight ( ) - 63 , 2 );
dbSprite ( 2 , iStrapX2 , dbScreenHeight ( ) - 63 , 3 );
}
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.