星期五(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
发布评论