6-3 透明动画

透明动画

透明动画 = 透明贴图 + 游戏循环 (上几节的综合运用)

//【5】消息循环过程
MSG msg = { 0 }; //定义并初始化msg
while( msg.message != WM_QUIT ) //使用while循环,如果消息不是WM_QUIT消息,就继续循环
{
if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //查看应用程序消息队列,有消息时将队列中的消息派发出去。
{
TranslateMessage( &msg ); //将虚拟键消息转换为字符消息
DispatchMessage( &msg ); //分发一个消息给窗口程序。
}
else
{
g_tNow = GetTickCount(); //获取当前系统时间
if(g_tNow-g_tPre >= 100) //当此次循环运行与上次绘图时间相差0.1秒时再进行重绘操作
Game_Paint(hwnd);
}

}

VOID Game_Paint( HWND hwnd )
{
if(g_iNum == 8) //判断是否超过最大图号,若超过最大图号“7”,则将显示图号重设为"0"。
g_iNum = 0;

//在mdc中贴上背景图
SelectObject(g_bufdc,g_hBackGround);
BitBlt(g_mdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_bufdc,0,0,SRCCOPY);

//在mdc中进行透明处理
SelectObject(g_bufdc,g_hSprite);
TransparentBlt(g_mdc,g_iX,g_iY,60,108,g_bufdc,g_iNum*60,0,60,108,RGB(255,0,0));//采用TransparentBlt透明色彩法


//将最后的画面显示在窗口中
BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY);

g_tPre = GetTickCount(); //记录此次绘图时间,供下次游戏循环中判断是否已经达到画面更新操作设定的时间间隔。
g_iNum++; //将“g_iNum”值加1,为下一次要显示的图号

g_iX+=10; //计算下次贴图的坐标
//如果贴图坐标超出窗口边缘,将其坐标置为-60
if(g_iX>=WINDOW_WIDTH)
g_iX =-60;

}