游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2927|回复: 4

有关于Sprite贴图的演算法与深浅度

[复制链接]

5

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2005-8-14 00:16:00 | 显示全部楼层 |阅读模式
有关于Sprite贴图的演算法与深浅度

先向各位来访者打个招呼 !
今天在整理写到焦头烂额的 Sprite 中,才意识到自己缺漏考虑了深浅度这一环 ,( 半晕状态中 )
然后思想也就在这里停滞不前了。

想了几个解决方案,但实行起来又太过于复杂 所以想请教各位的意见。

1) 设立一个参数 depth,
在地图中每一秒于每一个Sprite上检查自己的前后左右的depth值 。
如果发现自己的
depth < others
-> 重绘。

思考 : 这样一来每个Sprite都在死循环中检查 资源耗得不是很凶 !?

2) 从网上不知名处掘出的 :
利用Sprite的排序:
"继承了Borland类库(CLASSLIB)中的Sortable类,由于只有Sortable 对像才可以放在SortedArray(Borland CLASSLIB 的另一个类)中,继承后就可以把Sprite 对像存储在SortedArray 中。由于继承了Sortable ,Sprite 类必须定义以下的成员函数:
classType isA ( ) const ;
char_FAR * nameof( ) const ;
hashValueType hash Value( ) const ;
void printOn (ostream_FAR& os) ;
这四个函数的定义都很简单。函数的isA返回唯一的整型标识符,表示Sprite类,函数nameOf返回类名,即字符串“Sprite”。
此外,为了Sprite对像能够正确地排序,Sprite类必须包括下面的函数:
int isLessThan (const Object_FAR& ob ) const ;
int isEqual(const Object_FAR& ob ) const ;
函数isLessThan用来检验某个Sprite是否“小于”另一个。正如程序所定义的那样,isLessThan通过比较子图形的是显示优先级来决定哪个子图形“小些”。"

<< 对于这个东东,我真的搞不太懂,请问微软的MFC是不是不支持呢 @@?

由于手头上并没有一份完整的编写游戏书籍,所以并没有这样的演算法, 
所以希望各位前辈们能分享一下以前的经验,能抽空建议或写个实现的演算法与资料结构给初学者参考参详。

不知道是不是需要用到STL,所以先给一下自己的工作空间

开发环境:VC++.Net
能支援的函数:MFC /.
谢谢各位前辈们的指点 ^^

8

主题

182

帖子

268

积分

中级会员

Rank: 3Rank: 3

积分
268
发表于 2005-8-15 11:40:00 | 显示全部楼层

Re: 有关于Sprite贴图的演算法与深浅度

不知道楼上的把dx帮助都看了一遍没有。

ID3DXSprite::Begin Method

--------------------------------------------------------------------------------

Prepares a device for drawing sprites.

Syntax

HRESULT Begin(          DWORD Flags
);
Parameters

Flags
[in] Combination of zero or more flags that describe sprite rendering options. For this method, the valid flags are:
D3DXSPRITE_ALPHABLEND
D3DXSPRITE_BILLBOARD
D3DXSPRITE_DONOTMODIFY_RENDERSTATE
D3DXSPRITE_DONOTSAVESTATE
D3DXSPRITE_OBJECTSPACE
D3DXSPRITE_SORT_DEPTH_BACKTOFRONT
D3DXSPRITE_SORT_DEPTH_FRONTTOBACK
D3DXSPRITE_SORT_TEXTURE
For a description of the flags and for information on how to control device state capture and device view transforms, see D3DXSPRITE.
Return Value


If the method succeeds, the return value is S_OK.

If the method fails, the return value can be one of the following:


D3DERR_INVALIDCALL The method call is invalid. For example, a method's parameter may have an invalid value.
D3DERR_OUTOFVIDEOMEMORY Microsoft Direct3D does not have enough display memory to perform the operation.
D3DXERR_INVALIDDATA The data is invalid.
E_OUTOFMEMORY Direct3D could not allocate sufficient memory to complete the call.



Remarks

This method must be called from inside a IDirect3DDevice9::BeginScene . . . IDirect3DDevice9::EndScene sequence. ID3DXSprite::Begin cannot be used as a substitute for either IDirect3DDevice9::BeginScene or ID3DXRenderToSurface::BeginScene.

This method will set the following states on the device.

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-8-15 11:42:00 | 显示全部楼层

Re:有关于Sprite贴图的演算法与深浅度

请问所谓“sprite”是不是id3dxsprite?

72

主题

447

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
QQ
发表于 2005-12-29 15:00:00 | 显示全部楼层

Re:有关于Sprite贴图的演算法与深浅度

一时间没有明白何谓“深浅度”

不过如果是讨论“遮挡”问题,我是这样做的。生成一个“绘制链表“,需要产生遮挡的绘制物品在一个链表中,按照坐标排列成序,然后按照顺序依次绘出。后绘出的自然遮挡了现绘出的部分,坐标偏下绘出的自然遮挡了坐标偏上绘出的部分(石头挡住人的腿,其实是先绘人再绘石头)


这里有一个专门讨论2D游戏的论坛分区,去看看应该受益匪浅
http://www.dingge.com/forum/index.asp?boardid=46&page= [em14]

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-12-29 19:20:00 | 显示全部楼层

Re:有关于Sprite贴图的演算法与深浅度

正是楼上说的方法,2D叫遮挡,3D以前有画家算法,现在听说是用bsp来渲染3D物体。至于排序,我认为应该开个数组来存着int  id;float depth;     id是在原链表的位置,之后进行单纯的数排序,最后把数组转为链表........很想知道其他朋友怎样做。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 02:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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