游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3650|回复: 6

DraculaLin 问个问题

[复制链接]

4

主题

47

帖子

47

积分

注册会员

Rank: 2

积分
47
发表于 2005-4-22 16:18:00 | 显示全部楼层 |阅读模式
Asphyre中如何进行特效处理呢?
比如传奇里的人物中毒的效果,在delphix中是将TDirectDrawSurface中的每个点的Blue和 Green清零,只留红色这样人物就变成红的了
Asphyre中如何处理呢?怎么得到surface呢?我看了在Asphyre好像是3d模式的

4

主题

47

帖子

47

积分

注册会员

Rank: 2

积分
47
 楼主| 发表于 2005-4-22 16:39:00 | 显示全部楼层

Re:DraculaLin 问个问题

还有个问题
TexMap(Image: TAsphyreImage; PCoords: TPoint4; Color: TColor4; TexCoord: TTexCoord;
   Op: Integer): Integer;
这里的
TPoint4我的理解是image的left top width height不知道对不
TColor4 这四个颜色都是什么意思呢?

TexCoord:它呢?
op:它呢?

4

主题

47

帖子

47

积分

注册会员

Rank: 2

积分
47
 楼主| 发表于 2005-4-22 17:42:00 | 显示全部楼层

Re:DraculaLin 问个问题

没有呀,我都看了

4

主题

47

帖子

47

积分

注册会员

Rank: 2

积分
47
 楼主| 发表于 2005-4-22 17:48:00 | 显示全部楼层

Re:DraculaLin 问个问题

TexMap(Image: TAsphyreImage; PCoords: TPoint4; Color: TColor4; TexCoord: TTexCoord;
   Op: Integer): Integer;
这里的
TPoint4我的理解是image的left top width height不知道对不
TColor4 这四个颜色都是什么意思呢?

TexCoord:它呢?
op:它呢?
这个问题呢

4

主题

47

帖子

47

积分

注册会员

Rank: 2

积分
47
 楼主| 发表于 2005-4-22 18:56:00 | 显示全部楼层

Re:DraculaLin 问个问题

其实我的问题是这样,传奇你应该也重新写了,里面的特效你看了吗?
用delphix我是这样做的
procedure DrawBlendnew(DstSurf: TDirectDrawSurface; DstX, DstY, DstWidth,
  DstHeight: Integer; SrcSurf: TDirectDrawSurface; SrcWidth, SrcHeight: Integer;
  BlendMode: Integer);
var
  SrcDDSD, DstDDSD: TDDSurfaceDesc;
  SrcBits, DstBits, SrcP, DstP: PByte;
  X, Y: Integer;      // X/Y 方向的计数器
  SrcRect: TRect;     // 源表面需要绘制的区域
begin
  if (DstSurf = nil) or (SrcSurf = nil) then Exit;

  // 绘制点超过目标区域则退出
  if DstX >= DstWidth then Exit;
  if DstY >= DstHeight then Exit;

  // 计算左边裁剪
  if DstX >= 0 then
    SrcRect.Left := 0 else
    SrcRect.Left := -DstX;
  if SrcRect.Left >= SrcWidth then Exit;

  // 计算上方裁剪
  if DstY >= 0 then
    SrcRect.Top := 0 else
    SrcRect.Top := -DstY;
  if SrcRect.Top >= SrcHeight then Exit;

  // 计算右方裁剪
  if (DstWidth - 1) - DstX >= SrcWidth then
    SrcRect.Right := SrcWidth else
    SrcRect.Right := (DstWidth - 1) - DstX;

  // 计算下方裁剪
  if (DstHeight - 1) - DstY >= SrcHeight then
    SrcRect.Bottom := SrcHeight else
    SrcRect.Bottom := (DstHeight - 1) - DstY;

  if (SrcRect.Left >= SrcRect.Right) or (SrcRect.Top >= SrcRect.Bottom) then
    Exit;
//    raise Exception.Create('SrcRect error');

  SrcDDSD.dwSize := SizeOf(SrcDDSD);
  DstDDSD.dwSize := SizeOf(DstDDSD);

  try
     DstSurf.Lock(TRect(nil^), DstDDSD);
    SrcSurf.Lock(TRect(nil^), SrcDDSD)  ;

    SrcBits := SrcDDSD.lpSurface;
    DstBits := DstDDSD.lpSurface;


    if BlendMode = 0 then
    begin
      for Y :=  SrcRect.Top to SrcRect.Bottom - 1 do
      begin
        DstP := PByte(Integer(DstBits) + DstDDSD.lPitch * (Y + DstY) + (DstX + SrcRect.Left)*4);
        SrcP := PByte(Integer(SrcBits) + SrcDDSD.lPitch * Y + SrcRect.Left*4);
        for X := SrcRect.Left to (SrcRect.Right)*4 - 1 do
        begin
         // DstP^ := Color256Mix[DstP^][SrcP^];
         if Srcp^>0 then
            DstP^:=round(DstP^ / 2+SrcP^/ 2);
          Inc(DstP);
          Inc(SrcP);
        end;
      end;
    end
    else
    begin
      for Y :=  SrcRect.Top to SrcRect.Bottom - 1 do
      begin

        DstP := PByte(Integer(DstBits) + DstDDSD.lPitch * (Y + DstY) + (DstX + SrcRect.Left)*4);
        SrcP := PByte(Integer(SrcBits) + SrcDDSD.lPitch * Y + SrcRect.Left*4);
        for X := SrcRect.Left to (SrcRect.Right)*4 - 1 do
        begin
       //   DstP^ := Color256Anti[DstP^][SrcP^];
       //  DstP^ := Min(255,Round(SrcP^+((not SrcP^)*DstP^)shr 8) );
         if sRCp^<>0 then
            DstP^ := Min(255,Round(SrcP^+DstP^-(SrcP^*DstP^)shr 8) );
          Inc(DstP);
          Inc(SrcP);
        end;
      end;
    end;
  finally
    SrcSurf.UnLock();
    DstSurf.UnLock();
  end;
end;
这个效果怎么实现呢?
麻烦你了

14

主题

149

帖子

149

积分

注册会员

Rank: 2

积分
149
发表于 2005-4-23 18:16:00 | 显示全部楼层

Re:DraculaLin 问个问题

TColor4 是颜色
其中包括透明,颜色等!
之所以是COLOR4 是因为他有4个颜色构成的!
例如一个方块的图形!他的颜色顺序是这样的.
1  2
4  3
定制颜色可以实现颜色渐变,透明渐变等效果!

function TAsphyreDevice.Draw(Image: TAsphyreImage; Xpos, Ypos, Pattern,
Op: Integer): Integer;
begin
Result:= TexMap(Image, pBounds4(Xpos, Ypos, Image.Width,
  Image.Height), clWhite4, tPattern(Pattern), Op);
end;

TexMap函数中
Image是要绘制的图象 TAsphyreImage 类型的
PCoords 是图象的 X,Y,WIDTH,HEIGHT
Color 就是颜色上边已经说了
TexCoord是绘制的图片的范围,类似于DELPHI中把一个图片切成N个的功能!使用时候请这样 tPattern(i)
Op 是模式 在AsphyreDef 单元中有具体定义!

4

主题

47

帖子

47

积分

注册会员

Rank: 2

积分
47
 楼主| 发表于 2005-4-25 19:02:00 | 显示全部楼层

Re:DraculaLin 问个问题

多谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-25 12:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表