游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3372|回复: 7

求教游戏里技能和物品的试用时间冷却表现的做法

[复制链接]

2

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2009-9-29 23:34:00 | 显示全部楼层 |阅读模式
游戏中使用物品和技能后会进入冷却状态

一般是时钟式的扫描,打开可使用的技能或物品

原代码里是做了一个透明的蒙板,有30桢的图片

然后随时间播放不通的桢图片来实现这一客户端的表现

老大让我改,改成程序里来实时绘制这个遮罩层,或者别的什么方法

我左想右想,思路如下:

绘制一个可以改变角度的透明扇形,然后对它进行剪裁,使它只显示一个矩形区域

但真正实现起来对于我这个菜鸟来说,难度不小

首先绘制一个透明的扇形有问题,拿什么来绘制?

绘制玩后怎么剪裁,让它只显示一个矩形区域?

各位前辈高手帮帮忙啊,不然我就死定了 [em17]

之后我还要考虑怎么融入当前的UI系统 [em22]

3

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2009-9-30 10:44:00 | 显示全部楼层

Re:求教游戏里技能和物品的试用时间冷却表现的做法

class objmask
{
public:
支持UI调用(func mask)(param);
调用UI mask完成func;
protected:
bltmask();//至于怎么画, 根据param,, 你可以随便,, 调试通过后, 再一步一步完善.
}
//至于裁剪, UI会提供相应功能, param自然会传递
//如果没有, 你可以咨询你们的老大,
//如果没有用脏矩形, 或其它特殊处理的底层, 不需要裁剪,
//这个你可以立即调试一下就知道.如果UI是现成的,你只要画个BOX就行了.

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2009-10-2 14:41:00 | 显示全部楼层

Re:求教游戏里技能和物品的试用时间冷却表现的做法

由8个三角形构成冷却的矩形,画三角形知道怎么画吧?
比如冷却时间在0%-12.5%只画第一个三角形,角度根据冷却时间算
剩下的就是写代码,没啥可说的了

2

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2009-10-10 22:31:00 | 显示全部楼层

Re:求教游戏里技能和物品的试用时间冷却表现的做法

3楼的方法太妙了。。。。。。。。。。。。。

30

主题

422

帖子

433

积分

中级会员

Rank: 3Rank: 3

积分
433
发表于 2009-10-20 14:07:00 | 显示全部楼层

Re:求教游戏里技能和物品的试用时间冷却表现的做法

方法同3楼,不过其实只要5个三角形
--+---
|\ | /|
| \|/ |
|  X  |
| / \ |
|/___\|
在这里有例子:
http://code.google.com/p/tankwarca
数据如:
http://code.google.com/p/tankwarca/source/browse/trunk/tankwar/bin/data/ui/mask.xml
p1-p6是固定点。这里总的尺寸是60*60,中间是(0,0)位置。
p7-p11是5个三角形的活动点。当一个三角形不需要出现时,我将其放到中心(0,0)位置。

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-11-26 14:14:00 | 显示全部楼层

Re: 求教游戏里技能和物品的试用时间冷却表现的做法

更简单的方法
http://www.cnblogs.com/clayman/archive/2009/11/26/1611318.html

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2009-11-26 18:24:00 | 显示全部楼层

Re:求教游戏里技能和物品的试用时间冷却表现的做法

楼上的方法很妙...
有机会试看看,呵呵

7

主题

48

帖子

128

积分

注册会员

Rank: 2

积分
128
QQ
发表于 2009-12-2 14:10:00 | 显示全部楼层

Re:求教游戏里技能和物品的试用时间冷却表现的做法

        bool CZero_GuiTimer:raw()
        {
                if (!IsShow())
                {
                        return false;
                }

                if (!mIsStarted)
                {
                        return false;
                }

                Real32 CurTime = __GetTimer()->GetTime() - mStartTime;

                if (CurTime >= mDelay)
                {
                        mIsStarted = false;

                        return true;
                } else
                {
                        mDelayAngle = CurTime / mDelay * 360.f;
                }

                mVertex[2]._x = mPosition.x + mSize.x * 0.5f;
                mVertex[2]._y = mPosition.y + mSize.y * 0.5f;

                if (mDelayAngle < 45.f)
                {
                        mVertex[0]._x = mVertex[2]._x + mSize.y * 0.5f * tan(mDelayAngle * D3DX_PI / 180);
                        mVertex[0]._y = (Real32)mPosition.y;

                        mVertex[1]._x = (Real32)mPosition.x + mSize.x;
                        mVertex[1]._y = (Real32)mPosition.y;

                        __GetD3DRenderer()->Draw2DSpriter((D3DTLVERTEX_TEX1*)mVertex, 1, Zero_Null);
                }       

                if (mDelayAngle < 135.f)
                {
                        mVertex[0]._x = (Real32)mPosition.x + mSize.x;

                        if (mDelayAngle < 45.f)
                        {
                                mVertex[0]._y = (Real32)mPosition.y;
                        } else if (mDelayAngle < 90.f)
                        {
                                mVertex[0]._y = (Real32)mPosition.y + mSize.x * 0.5f * (1.f - tan((90.f - mDelayAngle) * D3DX_PI / 180.f));
                        } else
                        {
                                mVertex[0]._y = mVertex[2]._y + mSize.x * 0.5f * tan((mDelayAngle - 90.f) * D3DX_PI / 180.f);
                        }

                        mVertex[1]._x = (Real32)mPosition.x + mSize.x;
                        mVertex[1]._y = (Real32)mPosition.y + mSize.y;

                        __GetD3DRenderer()->Draw2DSpriter((D3DTLVERTEX_TEX1*)mVertex, 1, Zero_Null);
                }

                if (mDelayAngle < 225.f)
                {
                        if (mDelayAngle < 135.f)
                        {
                                mVertex[0]._x = (Real32)mPosition.x + mSize.x;
                        } else if (mDelayAngle < 180.f)
                        {
                                mVertex[0]._x = mVertex[2]._x + mSize.y * 0.5f * tan((180.f - mDelayAngle) * D3DX_PI / 180.f);
                        } else
                        {
                                mVertex[0]._x = (Real32)mPosition.x + mSize.y * 0.5f * (1.f - tan((mDelayAngle - 180.f) * D3DX_PI / 180.f));
                        }
                        mVertex[0]._y = (Real32)mPosition.y + mSize.y;

                        mVertex[1]._x = (Real32)mPosition.x;
                        mVertex[1]._y = (Real32)mPosition.y + mSize.y;

                        __GetD3DRenderer()->Draw2DSpriter((D3DTLVERTEX_TEX1*)mVertex, 1, Zero_Null);
                }

                if (mDelayAngle < 315.f)
                {
                        mVertex[0]._x = (Real32)mPosition.x;

                        if (mDelayAngle < 225.f)
                        {
                                mVertex[0]._y = (Real32)mPosition.y + mSize.y;
                        } else if (mDelayAngle < 270.f)
                        {
                                mVertex[0]._y = mVertex[2]._y + mSize.x * 0.5f * tan((270.f - mDelayAngle) * D3DX_PI / 180);
                        } else
                        {
                                mVertex[0]._y = (Real32)mPosition.y + mSize.x * 0.5f * (1.f - tan((mDelayAngle - 270.f) * D3DX_PI / 180));
                        }

                        mVertex[1]._x = (Real32)mPosition.x;
                        mVertex[1]._y = (Real32)mPosition.y;

                        __GetD3DRenderer()->Draw2DSpriter((D3DTLVERTEX_TEX1*)mVertex, 1, Zero_Null);
                }

                if (mDelayAngle < 360.f)
                {
                        if (mDelayAngle < 315.f)
                        {
                                mVertex[0]._x = (Real32)mPosition.x;
                        } else
                        {
                                mVertex[0]._x = (Real32)mPosition.x + mSize.y * 0.5f * (1.f - tan((360.f - mDelayAngle) * D3DX_PI / 180.f));
                        }
                        mVertex[0]._y = (Real32)mPosition.y;

                        mVertex[1]._x = mVertex[2]._x;
                        mVertex[1]._y = (Real32)mPosition.y;

                        __GetD3DRenderer()->Draw2DSpriter((D3DTLVERTEX_TEX1*)mVertex, 1, Zero_Null);
                }

                return true;
        }
以前实现的代码。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-17 15:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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