topical media & game development

talk show tell print

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.