2014年2月21日星期五(DEMO7-6战区漫步)

这是本章最后一个例子,与上个例子不同的是;

1,  加载的物体是2个

2,  用了欧拉相机,视野120度

这个DEMO是个综合,应该没有新的函数了,稍微简单些。

首先设定个宇宙空间,以及 各物体参数

 

#define                                                          UNIVERSE_RADIUS               4000

#define                                                          POINT_SIZE                     200

#define                                                          NUM_POINTS_X             ( 2 * UNIVERSE_RADIUS / POINT_SIZE )

#define                                                          NUM_POINTS_Z              ( 2 * UNIVERSE_RADIUS / POINT_SIZE )

#define                                                          NUM_POINTS                  ( NUM_POINTS_X * NUM_POINTS_Z )

 

#define                                                          NUM_TOWERS                         96

#define                                                          NUM_TANKS                   24

#define                                                          TANK_SPEED                  15

 

改变了摄像机位置

POINT4D  cam_pos = {0,40,0,1};

 

增加两个个物体和位置

OBJECT4DV1          obj_tower, obj_tank, obj_marker, obj_player;

POINT4D                  towers[NUM_TOWERS], tanks[NUM_TANKS];

 

在Game_Init()中初始化相机

liushuixian.Init_CAM4DV1( *math, &cam,      // the camera object

                  CAM_MODEL_EULER, // euler camera model

                  &cam_pos,  // initial camera position

                  &cam_dir,  // initial camera angles

                  &cam_target,      // no initial target

                  200.0,      // near and far clipping planes

                  12000.0,

                  120.0,      // field of view in degrees

                  WINDOW_WIDTH,   // size of final screen viewport

                  WINDOW_HEIGHT);

接下来就是加载和初始化物体位置

                  math->VECTOR4D_INITXYZ( & vscale, 0.75, 0.75, 0.75 );

         liushuixian.Load_OBJECT4DV1_PLG( & obj_tank, "tank2.plg", & vscale, & vpos, & vrot );

         math->VECTOR4D_INITXYZ( & vscale, 0.75, 0.75, 0.75 );

         liushuixian.Load_OBJECT4DV1_PLG( & obj_player, "tank3.plg", & vscale, & vpos, & vrot );

         math->VECTOR4D_INITXYZ( & vscale, 1.0, 2.0, 1.0 );

         liushuixian.Load_OBJECT4DV1_PLG( & obj_tower, "tower1.plg", & vscale, & vpos, & vrot );

         math->VECTOR4D_INITXYZ( & vscale, 3.0, 3.0, 3.0 );

         liushuixian.Load_OBJECT4DV1_PLG( & obj_marker, "marker1.plg", & vscale, & vpos, & vrot );

 

         for ( int index = 0; index < NUM_TANKS; index ++)

         {

                  tanks[index].x                                      = RAND_RANGE( -UNIVERSE_RADIUS, UNIVERSE_RADIUS);

                  tanks[index].y                                      = 0;

                  tanks[index].z                                       = RAND_RANGE( -UNIVERSE_RADIUS, UNIVERSE_RADIUS);

                  tanks[index].w                                     = RAND_RANGE( 0, 360 );

 

         }

         for ( int index = 0; index < NUM_TOWERS; index ++)

         {

                  towers[index].x                                    = RAND_RANGE( -UNIVERSE_RADIUS, UNIVERSE_RADIUS);

                  towers[index].y                                    = 0;

                  towers[index].z                                    = RAND_RANGE( -UNIVERSE_RADIUS, UNIVERSE_RADIUS);

 

 

         }

 

 

                  在Game_Main()中,

         static float view_ang                    = 0;

         static float camera_distance                 = 6000;

         static VECTOR4D pos                                          = {0,0 ,0,0};

         static float tank_speed;

         static float turning                                = 0;

 

先绘制天空和地面

 

         math->Draw_Rectangle( 0, 0, WINDOW_WIDTH - 1, WINDOW_HEIGHT / 2,_RGB16BIT555( 0, 140, 192), ddraw->getbackSurface());

         math->Draw_Rectangle( 0, WINDOW_HEIGHT / 2, WINDOW_WIDTH - 1, WINDOW_HEIGHT - 1, _RGB16BIT555( 103, 62, 3), ddraw->getbackSurface());

        

下面是相机系统

 

         if ( KEYDOWN( VK_SPACE ))

         {

                  tank_speed                                                    = 5 * TANK_SPEED;

         }

         else

         {

                  tank_speed                                                    = TANK_SPEED;

         }

 

         if ( KEYDOWN( VK_UP))

         {

                  cam.pos.x                                             += tank_speed * sinf( cam.dir.y );

                  cam.pos.z                                              += tank_speed * cosf( cam.dir.y );

 

         }

         if ( KEYDOWN( VK_DOWN))

         {

                  cam.pos.x                                             -= tank_speed * sinf( cam.dir.y );

                  cam.pos.z                                              -= tank_speed * cosf( cam.dir.y );

 

         }

         if ( KEYDOWN( VK_RIGHT) )

         {

                  cam.dir.y                                              += 3;

                  if ( ( turning +=2) > 15)

                  {

                          turning                                                  = 15;

 

                  }

 

         }

         if ( KEYDOWN( VK_LEFT) )

         {

                  cam.dir.y                                              -= 3;

                  if ( ( turning -=2) <-15)

                  {

                          turning                                                  = -15;

 

                  }

 

         }

         else

         {

                  if ( turning > 0)

                  {

                          turning                                -= 1;

                  }

                  else

                  if ( turning < 0)

                  {

                          turning                                += 1;

                  }

        

         }

 

         liushuixian.Build_CAM4DV1_Matrix_UVN( * math, & cam, CAM_ROT_SEQ_ZYX );

接下来,把坦克加入到渲染列表中,

for ( int index = 0; index < NUM_TANKS; index ++ )

         {

        

                          liushuixian.Reset_OBJECT4DV1( & obj_tank );

                          math->Build_XYZ_Rotation_MATRIX4x4( 0, tanks[index].w, 0, & mrot );

                         liushuixian.Transform_OBJECT4DV1( & obj_tank, & mrot, TRANSFORM_LOCAL_TO_TRANS, 1, math );

 

                          //¦¨¨??¬???

                          obj_tank.world_pos.x                                   = tanks[index].x;

                          obj_tank.world_pos.y                                   = tanks[index].y;

                          obj_tank.world_pos.z                                   = tanks[index].z;

 

                          if ( ! liushuixian.Cull_OBJECT4DV1( & obj_tank, & cam, CULL_OBJECT_XYZ_PLANES,* math))

                          {

                                   liushuixian.Model_To_World_OBJECT4DV1( & obj_tank, * math,TRANSFORM_TRANS_ONLY );

                                   liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV1( * math, & render_list, & obj_tank );

                          }

                  }

接下来,就是玩家。

 

         liushuixian.Reset_OBJECT4DV1( & obj_player );

         obj_player.world_pos.x                                                  = cam.pos.x + 400 * sinf( cam.dir.y );

         obj_player.world_pos.y                                                  = cam.pos.y - 50;

         obj_player.world_pos.z                                                  = cam.pos.z + 400 * cosf( cam.dir.y );

 

         math->Build_XYZ_Rotation_MATRIX4x4( 0, cam.dir.y + turning , 0, & mrot );

         liushuixian.Transform_OBJECT4DV1( & obj_player, & mrot, TRANSFORM_LOCAL_TO_TRANS, 1,* math );

 

         liushuixian.Model_To_World_OBJECT4DV1( & obj_player, * math,TRANSFORM_TRANS_ONLY );

         liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV1( * math, & render_list, & obj_player );

下一步,就是进行高塔的绘制

 

         for ( int index = 0; index < NUM_TOWERS; index ++ )

         {

 

                  liushuixian.Reset_OBJECT4DV1( & obj_tower );

                 

                  //¦¨¨??¬???

                  obj_tower.world_pos.x                                 = towers[index].x;

                  obj_tower.world_pos.y                                 = towers[index].y;

                  obj_tower.world_pos.z                                 = towers[index].z;

 

                  if ( ! liushuixian.Cull_OBJECT4DV1( & obj_tower, & cam, CULL_OBJECT_XYZ_PLANES,* math))

                  {

                          liushuixian.Model_To_World_OBJECT4DV1( & obj_tower, * math,TRANSFORM_TRANS_ONLY );

                          liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV1( * math, & render_list, & obj_tower );

                  }

         }

 

        

下面就是地面了

 

         for ( int index_x = 0; index_x < NUM_POINTS_X; index_x++)

         {

                  for ( int index_z =0; index_z < NUM_POINTS_Z; index_z++)

                  {

                          liushuixian.Reset_OBJECT4DV1( & obj_marker );

                          obj_marker.world_pos.x                      = RAND_RANGE( -100, 100) -UNIVERSE_RADIUS + index_x * POINT_SIZE;

                          obj_marker.world_pos.y                      = obj_marker.max_radius;

                          obj_marker.world_pos.z                       = RAND_RANGE( -100, 100) -UNIVERSE_RADIUS + index_z * POINT_SIZE;

                          if ( ! liushuixian.Cull_OBJECT4DV1( & obj_marker, & cam, CULL_OBJECT_XYZ_PLANES,* math))

                          {

                                   liushuixian.Model_To_World_OBJECT4DV1( & obj_marker, * math,TRANSFORM_TRANS_ONLY );

                                   liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV1( * math, & render_list, & obj_marker );

                          }

                 

                  }

         }

 

修正后,如下所示。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值