游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3437|回复: 12

如何处理在绘制函数中必须使用的这9个参数。。。。

[复制链接]

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2009-3-12 10:22:00 | 显示全部楼层 |阅读模式
在封装 DirectX9 的过程中,都会使用到绘制函数,就拿最简单的绘制 mesh 的函数来说吧,我们要绘制一个 mesh 的时候,必须要传递这些参数:
1.平移矩阵的3个 x,y,z
2.旋转矩阵的3个 x,y,z
3.缩放矩阵的3个 x,y,z

加起来是9个。。。。

那么在设计函数的时候,难道要在参数列表里写上这9个参数???

我现在是这么写的:

struct SMetrix
{
    float TransX;
    float TransY;
    float TransZ;
    float RotateX;
    float RotateY;
    float RotateZ;
    float ZoomX;
    float ZoomY;
    float ZoomZ;
};

void CDXFont:raw3DFont(unsigned int iNum,RECT* rctDraw,const SMetrix* Boring9);

但是这么写,有个非常严重的问题:当我在主函数里调用这个函数的时候,我快疯了。。。。

SMetrix mtxTitleText;
mtxTitleText.TransX=0.5f;
mtxTitleText.TransY=0.0f;
mtxTitleText.TransZ=0.1f;
mtxTitleText.RotateX=0.0f;
mtxTitleText.RotateY=2.5f;
mtxTitleText.RotateZ=0.0f;
mtxTitleText.ZoomX=1.0f;
mtxTitleText.ZoomY=1.0f;
mtxTitleText.ZoomZ=1.0f;

RECT rctTitleText={0,0,800,600};

CDXFont::Draw3DFont(2,rctTitleText,&mtxTitleText);

这么调用,我实在是受不了。。。。。。

有个朋友给我提供了另外一种参数形式:
void CDXFont::Draw3DFont(unsigned int iNum,RECT* rctDraw,
                         const D3DXVECTOR3& vTrans,
                         const D3DXVECTOR3& vRotate,
                         const D3DXVECTOR3& vZoom);

如果是这样的话,那么调用的时候就是:

CDXFont::Draw3DFont(2,rctTitleText,
                    D3DXVECTOR3(0.0f,0.5f,0.1f),
                    D3DXVECTOR3(0.0f,2.5f,0.0f),
                    D3DXVECTOR3(1.0f,1.0f,1.0f));

确实比上面那个函数在调用的时候简单许多,但是,参数个数依然比较多,而且最后3个参数是在传递的时候构造的,函数结束的时候还要析构。。。会影响速度。。。

大家在封装绘图函数的时候,是如何处理这必须使用的“九大金刚”的呢????

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2009-3-12 13:25:00 | 显示全部楼层

Re:如何处理在绘制函数中必须使用的这9个参数。。。。

嫌参数多,个数也不确定,而且方便日后扩展,非常建议你用个结构体来封装参数
我代码里面的命名规范是XXX_DESC,一看就知道是参数结构体,另外那点数值型式的构造传参,只要不是new出来的堆内存,都是放栈里面传递的,效率方便不会受影响,大可放心这么用

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-3-12 13:29:00 | 显示全部楼层

Re:如何处理在绘制函数中必须使用的这9个参数。。。。

来,说一下重载函数是做什么用的

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2009-3-12 13:58:00 | 显示全部楼层

Re:如何处理在绘制函数中必须使用的这9个参数。。。。

这个和重载不矛盾,既然封装了参数,那么这些参数一定多而乱,基本是为了做同一件事情而考虑的,如果出现重载,那自然表明你的这堆参数需要做另外一件事情了,可以再定义别的参数结构体,不过实时上这样的做的确可能减少了重载的机会,关键看对参数结构体的封装怎么理解和运用了,方法并不是唯一的。适合就用,不适合就不要用了。

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
 楼主| 发表于 2009-3-12 14:14:00 | 显示全部楼层

Re:如何处理在绘制函数中必须使用的这9个参数。。。。

这9个参数是固定要给的。。。难道大家在绘制一个 MESH 的时候,不需要9个这么多??
重载的话,是参数个数不同,或者类型不同的时候,才会用到吧。。。

如果使用结构体来封装这9个参数,调用的时候太麻烦了。。。。

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-3-12 20:06:00 | 显示全部楼层

Re:如何处理在绘制函数中必须使用的这9个参数。。。。

提示LZ,设计API要先考虑在什么情况下使用,然后针对这些情况来设计;而不要反过来,先写出API,然后再考虑怎么用。

举个例子,比如要绘制人物头上顶的名字,最基本的情况只有个名字,名字总在人的头顶,居中显示;可能在名字左边还想放个标识职业的图标,在下边显示个血条;在有的背景下名字文本看不清,所以可能在文本后面放个半透明的底色框……你会发现,这里只需要一个世界变换,然后在头顶的那块玻璃板的局部坐标系下画很多次不同的东西。

按LZ的思路,绘制文本时的参数不止9个,还需要color,对齐参数,剪裁参数,折行参数等。

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2009-3-12 20:30:00 | 显示全部楼层

Re:如何处理在绘制函数中必须使用的这9个参数。。。。

void CDXFont:raw3DFont(unsigned int iNum,RECT* rctDraw)
不传其它的。又没规定你必须绘制的时候才给具体信息,大可以之前调用其它函数来传。

void CDXFont::Draw3DFont(unsigned int iNum,RECT* rctDraw, cosnt Matrix& mat)
直接传矩阵。


而且最后3个参数是在传递的时候构造的,函数结束的时候还要析构。。。会影响速度。。。
=================
这些操作对程序运行速度的影响几乎等于0,所以重点别放在这些地方。

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
 楼主| 发表于 2009-3-12 22:56:00 | 显示全部楼层

Re:如何处理在绘制函数中必须使用的这9个参数。。。。

qrli 兄弟啊。。你说的很对。。
我在设计这个库的时候,总是想着如何才能适应各种需求,正好和你说的方向相反。。。
那如果是按照现在的需求来设计这个库的话,如果将来需求发生了变化,那这个库不是要重写???

哎。。我总是想太多,我也知道要设计一个适应各种需求的库是不可能的,就像去设计“永动机”一样。。。
但我还是在设计的时候把所有情况和需求都考虑进去,导致现在的结果。。。
为什么我总是在这种问题上犯迷糊,举棋不定呢??

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2009-3-13 01:10:00 | 显示全部楼层

Re:如何处理在绘制函数中必须使用的这9个参数。。。。

额,总觉得这东西往往会计划赶不上变化
先做看看,到时候不行再迭代吧...

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-3-13 11:16:00 | 显示全部楼层

Re: Re:如何处理在绘制函数中必须使用的这9个参数。。。。

draculamx: Re:如何处理在绘制函数中必须使用的这9个参数。。。。

qrli 兄弟啊。。你说的很对。。
我在设计这个库的时候,总是想着如何才能适应各种需求,正好和你说的方向相...


你还是没有完全领悟,再给你个提示:

微软.NET系统设计原则里有一条:make the routine tasks simply, make the advanced tasks possible.
让常用的基本操作尽可能的简单,让不常用的高级操作可以实现。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 03:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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