16位下 很炫的图片淡出特效(delphi版)

liseal 2002-08-29 11:56:26
具体请看http://www.dreamprogram.com/pages/msample_fedeout.htm


<img src="../images/snap.jpg" width="308" height="346">

16位下 很炫的图片淡出特效(delphi)

-------------- 作者:apached 2002/8/22

这是使用alpha混合,让一些方块淡出慢慢覆盖原先的图的一种特效。其中使用了jedi-directx7 头文件和一个我从其它的类库中转过来的一个支持 jedi-directx 的alpha16库(汇编优化)。这个alpha库的提供了很多种的alpha混合模式( BM_SCREEN ,BM_ADD, BM_NORMAL , BM_MODULATE).这些库文件在我的网站上有下载www.dreamprogram.com.

下面我们来看看这个效果的具体实现
首先是创建一个窗口(我本来为了减小demo的编译后的大小,我没有使用vcl的窗口类,而是自己用api创建了窗口,可是我来发现jedi directx 使用了vcl,使我的程序不可避免的大了。反而变得麻烦了)


// 初始化窗口,注册窗口类。
function WinInit( h_Inst : THANDLE; nCmdShow : Integer; var phWnd : THandle; var phAccel : HACCEL ) : HRESULT;
//然后是消息循环

//处理消息
function WindowProc( h_Wnd : THandle; aMSG : Cardinal; wParam : Cardinal; lParam : Integer ) : Integer; stdcall;

//窗口建立好了后初始化directdraw,
function InitDirectDraw( h_Wnd : HWND ) : HRESULT;
function CreateWindowedDisplay( h_Wnd : HWND; dwWidth, dwHeight : LongWord ) : HRESULT;
在这我建立一个300*300的窗口
建立一个表面并且读入背景图
CreateSurfaceFromBitmap(t1Surface, PAnsiChar( '1.bmp' ) , 300, 300);

上面都是例行公事,下面就是重要的淡出算法了
fedeout

Tile : array[0..5,0..5] of Byte;//申明一个2维数组 准备用60*60的小方格逐渐覆盖背景图。
for iii := 0 to 5 do      //初始化数组
 for jjj := 0 to 5 do
   Tile[jjj,iii] := 0;

for iii := 0 to 24+16 do begin
  if (iii < 25)then begin
    xxx := random(5);
    yyy := random(5); 
    while(tile[xxx,yyy] > 0)do begin
       xxx := random(5);
       yyy := random(5);
    end;
    tile[xxx,yyy] := 1;
  end;

  for jjj := 0 to 24 do begin
    xxx := jjj mod 5;
    yyy := jjj div 5;
    if ((tile[xxx,yyy] > 0)and(tile[xxx,yyy] < 16))then begin//循环产生25个方格,并且逐渐混合到表面
      with rc do
      begin
      top:=yyy*60;
      left:=xxx*60;
      right:=xxx*60+60;
      bottom:=yyy*60+60;
    end;
    tile[xxx,yyy] := tile[xxx,yyy] + 1;
    t1surface.m_pdds.Lock(nil,t1surface.m_ddsd,0,0);//lock表面
    al.DirectBlendRect(t1surface.m_ddsd,rc,$101010,0);//把当前的方格alpha 混合到表面上
    t1surface.m_pdds.Unlock(nil);//解锁
    g_pdisplay.Blt(0,0,t1surface,nil);//copy到离屏表面
    g_pdisplay.Blt(0,0,t2surface,nil);
    g_pdisplay.Flip;//翻转
  end;
 end;
end;

到此效果已经出来,如果大家有兴趣还可以在上面做出更多的效果。

源代码(45k) 执行文件(309k)以上例子需要directx 7 在delphi 5上编译通过。(已经自带了alpha16.pas,directdraw.pas)

以上出自www.dreamprogram.com 装载请注明出处
...全文
83 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
IO_X 2002-08-29
  • 打赏
  • 举报
回复
似乎不怎么样
算法也简单

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧