2014年2月21日星期五(DEMO7

编程入门 行业动态 更新时间:2024-10-28 18:26:58

2014年2月21日<a href=https://www.elefans.com/category/jswz/34/1768596.html style=星期五(DEMO7"/>

2014年2月21日星期五(DEMO7

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

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

                          }

                 

                  }

         }

 

修正后,如下所示。

 

更多推荐

2014年2月21日星期五(DEMO7

本文发布于:2024-02-26 16:24:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1703145.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:星期

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!