关于delphi编程和delphi编写游戏程序的网站开站了!(100分)

  • 主题发起人 主题发起人 apache
  • 开始时间 开始时间
新增加了
一个alpha16库的16位下 很炫的图片淡出特效(delphi)
具体请看http://www.dreamprogram.com/pages/msample_fedeout.htm

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 装载请注明出处

 
fire in hole.go go go
 
以后常去!
 
有谁对opengl有研究吗?
有delphi的资料吗?
 
太好了
我去看
 
好的,我会支持你的
 

Similar threads

D
回复
0
查看
925
DelphiTeacher的专栏
D
D
回复
0
查看
880
DelphiTeacher的专栏
D
D
回复
0
查看
852
DelphiTeacher的专栏
D
后退
顶部