// 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 ); }