这个例子比较大,任重而道远。理论草草看了下,光记住索引和RGB各项求最小距离了。
为简单起见,拷贝7-6过来,并把8-3封装到的引擎代码拷贝替换。
逐行来看,各个击破
先换成800*600视口
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
更换了坦克和塔的数量
#define NUM_TOWERS 64
#define NUM_TANKS 32
缓冲区更改大小
char buffer[2048];
重新写了个插入列表函数,加上了光照。
int ddraw_liushuixian::Insert_OBJECT4DV1_RENDERLIST4DV12(ddraw_mathmath, RENDERLIST4DV1_PTRrend_list, OBJECT4DV1_PTRobj, int insert_local, int lighting_on /* = 0 */ )
与前一个版本相比,加上光照的地方,
由于颜色被存储为32位颜色,但该整数变量中只有后16位包含颜色信息,因为现在支持的颜色模型是16/8位的,因此,可以将着色颜色存储到前16位中。然而,渲染函数使用后16位来渲染多边形,因此要修改物体函数插入函数,使其假设多边形经过了光照处理,处理后的颜色存储在前16位中,因此,将物体分解为多边形,并将其插入渲染列表中时,将前16位作为多边形的颜色。
开光照时,覆盖高16位颜色
if( lighting_on == 1 )
{
base_color = (unsigned int ) ( curr_poly->color );
curr_poly->color = (int ) ( base_color >> 16 );
插入列表后,测试一下,是否高16位需要覆盖
if( lighting_on == 1 )
{
curr_poly->color = (int ) ( base_color & 0xffff );
}
在GAME_MAIN()中,对玩家坦克使用之。
liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV12( *math, & render_list, &obj_player, 0, 0 );
对每个坦克也类似使用之
liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV12( *math, & render_list, &obj_tank, 0, 0 );
同样,对每个塔也类似使用之
liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV12( *math, & render_list, &obj_tower,0,0 );
同样,对每个地板砖也如此
liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV12( *math, & render_list, &obj_marker, 0, 0 );
下面进行核心的部分,就是绘制实体,这里注意的是要绘制实心物体,因此需要消除背面多边形,避免渲染它们,以前画线框,现在绘制的是三角形,
void ddraw_liushuixian::Draw_RENDERLIST4DV1_Solid16(ddraw_mathmath2, RENDERLIST4DV1_PTRrend_list, UCHAR *video_buffer,int lpitch)
{
for( int poly = 0; poly < rend_list->num_polys;poly++ )
{
//获得当前多边形
POLYF4DV1_PTR curr_poly = rend_list->poly_ptrs[poly];
//当且仅当多边形没有被剔除或者裁剪掉,同时处于活动状态且可见时,才对其进行变换)
if( ( curr_poly == NULL ) ||
!( curr_poly->state &POLY4DV1_STATE_ACTIVE ) ||
( curr_poly->state &POLY4DV1_STATE_CLIPPED ) ||
( curr_poly->state &POLY4DV1_STATE_BACKFACE ) )
continue; //进入下一个多边形
//绘制三角形的边
//2d初始化过程中已经设置好裁剪,位于D屏幕/窗口外的多边形都将被裁剪掉
math2.Draw_Triangle_2D16( rend_list->poly_ptrs[poly]->tvlist[0].x,
rend_list->poly_ptrs[poly]->tvlist[0].y,
rend_list->poly_ptrs[poly]->tvlist[1].x,
rend_list->poly_ptrs[poly]->tvlist[1].y,
rend_list->poly_ptrs[poly]->tvlist[2].x,
rend_list->poly_ptrs[poly]->tvlist[2].y,
rend_list->poly_ptrs[poly]->color,
video_buffer, lpitch );
}
}
每帧中,调用之
liushuixian.Draw_RENDERLIST4DV1_Solid16( *math, &render_list, ddraw->getbackbuffer(),ddraw->getbacklpitch() );
如图所示,