游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2463|回复: 2

救急:全屏下的ColorKey不能使得Sprite背景透明

[复制链接]

5

主题

19

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2005-8-23 12:09:00 | 显示全部楼层 |阅读模式
MDX9 C#
主Surface   m_surfacePrimary设置 Complex=true Flip=true,BackBufferCount=1
m_surfaceSecondary = m_surfacePrimary.GetAttachedSurface(desc.SurfaceCaps);

然后创建一个精灵suface m_bitmapSurface,
m_surfaceDesc = new SurfaceDescription();
            m_surfaceDesc.SurfaceCaps.OffScreenPlain = true;
            m_surfaceDesc.Width = m_nBitmapWidth;
            m_surfaceDesc.Height = m_nBitmapHeight;
            this.m_bitmapSurface = new Surface(m_sourceBitmap, m_surfaceDesc, m_targetDevice);
ColorKey tempKey = new ColorKey();
tempKey.ColorSpaceLowValue = colorTransparent;
                        tempKey.ColorSpaceHighValue = colorTransparent;
m_bitmapSurface.SetColorKey(ColorKeyFlags.SourceDraw, tempKey);
绘制的时候将 m_bitmapSurface图像绘制到m_surfaceSecondary

m_surfaceSecondary .DrawFast(ptTargetTopLeft.X,
                                       ptTargetTopLeft.Y,
                                       m_bitmapSurface,
                                       rectSrc,
                                       DrawFastFlags.SourceColorKey | DrawFastFlags.Wait);
精灵的背景颜色还在,哪位能帮忙解决一下

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2005-8-24 00:52:00 | 显示全部楼层

Re:救急:全屏下的ColorKey不能使得Sprite背景透明

tempKey.ColorSpaceLowvalue = colorTransparent;
tempKey.ColorSpaceHighvalue = colorTransparent;
以上这两句中的colorTransparent是指你事先设置好的颜色值吗?
出现精灵的背景色存在的问题,我考虑如下:
    先看看你的当前的屏幕的颜色深度,当然这个就是你的PrimarySurface的颜色深度,然后讲你要设置的ColorKey的颜色值映射到这个深度空间中,我的意思是说,可能你的屏幕是16位的,但是你给的ColorKey颜色是32位的的,要把这个颜色映射到16位下,至于如何映射,方法如下:
    1、微软的方法是得到当前PrimarySurface的DC,然后用你的颜色值(RGB格式)在PrimarySurface的左上角画一个点,然后在得到这个点的颜色值,这个颜色值就是你的图像的ColorKey值在PrimarySurface的颜色空间中的映射值。
    2、自己写几个转化函数,可以将32位RGB颜色映射到任何颜色深度,我的做法是在建立好设备后,得到当前的颜色深度,判断它是16位、24位还是32位,16位的话还要判断是555还是565,当然现在大部分是565,然后自己写几个函数,如下(抱歉,我用C++):
   int Color565(int r, int g, int b)
   {
       int rr  = (r << 11) && 0xf800; // 0xf800 = 11111,000000,00000;
       int gg = (g << 5)  && 0x7e0; // 0x7e0 = 00000,111111,00000;
       int bb = b && 0x1f; //0x1f = 00000,000000,11111;

      return rr | gg | bb;
    }

    这样用这些函数的一个来生成你的colorTransparent(当然的基于当前的颜色深度),就正确了。

5

主题

19

帖子

29

积分

注册会员

Rank: 2

积分
29
 楼主| 发表于 2005-8-24 11:13:00 | 显示全部楼层

Re:救急:全屏下的ColorKey不能使得Sprite背景透明

我试试,谢谢,没关系,什么语言我都知道,嘿嘿
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-27 13:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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