泛型粒子系統的設計2 (轉)
現在我們已經可以很方便的組裝我們所需要的粒子結構了,但任存在一個問題。每當我們需要加入一個新的粒子部分時必須自定義一個類似SParticlePos的結構,如果我們設計的是一個粒子的拆分部分非常多的這無疑是一件非常枯燥的差事。有沒有什麼方法可以解決呢?我們不妨定義一個泛型的粒子部分::namespace prefix = o ns = "urn:schemas--com::office" />
// 粒子部分
template<
typename _Type
> struct TParticlePart {
_Type m_Value;
};
我們透過_Type模板引數來指定粒子部分的型別,比如原先的SParticlePos我們在使用D3D的平臺上可以寫成TParticlePart< D3DXVECTOR3 >。這樣的設計看似很好,其實隱藏著一個問題。如我們在D3D平臺上定義一個如下的粒子:
typedef TParticlePolicy<
boost::mpl::vector<
TParticlePart< D3DXVECTOR3 >, // 位置
TParticlePart< D3DXVECTOR3 >, // 速度
TParticlePart< D3DXCOLOR >, // 顏色
TParticlePart< FLOAT >, // 壽命
>
> tMyParticle;
tMyParticle p;
此時我們要訪問粒子的位置部分應該寫成p.m_Value,但如果你這樣寫就會抱怨產生了歧義。原因是不論你需要訪問的是位置、速度、顏色還是壽命都應該寫成p.m_Value,如何告訴編譯器你真正想要訪問的部分呢?這就需要引入一個用於區分不同部分的TPartDiff模板類,同時對TParticlePartHolder和TParticlePolicy做一些修改:
// 區分粒子的不同部分
template<
class _Part,
class _Diff
> class TPartDiff : public _Part
{};
// 粒子組裝器
template<
class _PartIter,
class _PartsVector
> class TParticlePartHolder
: public TPartDiff<
boost::mpl::deref< _PartIter >::type,
boost::mpl::int_< _PartIter::pos::value >
>
, public TParticlePartHolder< _PartIter::next, _PartsVector >
{};
template<
class _PartsVector
> class TParticlePartHolder< boost::mpl::end< _PartsVector >::type, _PartsVector >
: public boost::blank
{};
// 粒子
template<
class _PartsVector
> struct TParticlePolicy
: public TParticlePartHolder< boost::mpl::begin< _PartsVector >::type, _PartsVector >
{
typedef _PartsVector tPartsVector;
// 部分數
static const int s_ciNumOfParts = boost::mpl::size< _PartsVector >::type::value;
// 獲取一個粒子部分
template< size_t nIndex >
TPartDiff< boost::mpl::at_c< _PartsVector, nIndex >::type, boost::mpl::int_< nIndex > >& Part( void ) {
return *this;
}
// 獲取一個粒子部分
template< size_t nIndex >
const TPartDiff< boost::mpl::at_c< _PartsVector, nIndex >::type, boost::mpl::int_< nIndex > >& Part( void ) const {
return *this;
}
TPartDiff接受兩個模板引數第一個是形如TParticlePart< D3DXVECTOR3 >的粒子部分,第二個是用此粒子部分在粒子定義中的位置轉換的型別(透過boost::mpl::int_<>可以將常量轉換為型別)用於區分。TParticlePartHolder不再直接繼承粒子部分,而是透過TPartDiff繼承帶有區分的粒子部分。TParticlePolicy引入了一個公共模板成員Part()用於訪問不同的粒子部分,其有一個模板引數用於指定所需要訪問的粒子部分的索引,這個函式還有一個Const版本。如果我們要訪問以上定義的tMyParticle型別的粒子p的不同部分我們可以寫成:
p.Part< 0 >().m_Value; // 訪問粒子的位置
p.Part< 1 >().m_Value; // 訪問粒子的速度
p.Part< 2 >().m_Value; // 訪問粒子的顏色
p.Part< 3 >().m_Value; // 訪問粒子的壽命
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-969585/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 泛型粒子系統的設計1 (轉)泛型
- 泛型粒子系統的設計3 (轉)泛型
- 泛型粒子系統的設計4 (轉)泛型
- 泛型粒子系統的設計5 (轉)泛型
- 泛型粒子系統的設計6 (轉)泛型
- 泛型粒子系統的設計7 (轉)泛型
- 泛型類及系統中常用的泛型類泛型
- .NET泛型程式設計簡介 (轉)泛型程式設計
- 泛型程式設計泛型程式設計
- 泛型最佳實踐:Go泛型設計者教你如何用泛型泛型Go
- java 泛型程式設計Java泛型程式設計
- [CUJ]泛型程式設計--轉移建構函式 (轉)泛型程式設計函式
- Windows系統上泛域名解析的設定(轉)Windows
- 十、GO程式設計模式 : 泛型程式設計Go程式設計設計模式泛型
- 談談 "JS 和 設計泛型"JS泛型
- 泛型程式設計詳解(一)泛型程式設計
- 泛型程式設計與 OI——modint泛型程式設計
- C#學習 [型別系統] 泛型(16)C#型別泛型
- hugo.elias專題 之 粒子系統 (轉)Go
- c++ 泛型 程式設計 之 Functor 設計模式C++泛型程式設計設計模式
- Kotlin語言中的泛型設計哲學Kotlin泛型
- JAVA泛型使用練習2(自定義泛型使用)Java泛型
- Go泛型草案設計簡明指南Go泛型
- c++ 泛型程式設計 之 TypeListsC++泛型程式設計
- 泛型轉DataTable方法泛型
- 物件導向程式設計和`GP`泛型程式設計物件程式設計泛型
- Dart語法篇之型別系統與泛型(七)Dart型別泛型
- 使用 Go 泛型的函數語言程式設計Go泛型函數程式設計
- 泛型--泛型萬用字元和泛型的上下限泛型字元
- GO語言泛型程式設計實踐Go泛型程式設計
- 泛型程式設計在非C++語言中的實現之探討 (轉)泛型程式設計C++
- 轉向Kotlin——泛型Kotlin泛型
- Three.js開發指南(7):粒子和粒子系統JS
- Java泛型知識點:泛型類、泛型介面和泛型方法Java泛型
- 泛型類、泛型方法及泛型應用泛型
- 在C語言中實現泛型程式設計C語言泛型程式設計
- C語言如何實現泛型程式設計?C語言泛型程式設計
- Swift使用協議加泛型程式設計(一)Swift協議泛型程式設計