↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて
自分はDXライブラリで流体を描画したいのですが、いろいろためしたのですが上手くいきません。
http://wonderpla.net/blog/engineer/Liqu ... Cocos2d-x/
剛体の表示はできたのですが、流体の粒子をどうやって描画すればいいのかがわかりません。
GetPositionBufferという関数で配列に{x1,y1,x2,y2,x3,y3...}というように粒子の座標がとってこれるみたいですが、
どの変数に格納してどうやって描画するのかもわかりません。
どなたかLiquidfunか流体のライブラリを使ったことがある方、
流体の描画の仕方を教えてほしいです。
↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのですが、いろ
Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです
Box2Dの描画は「図形」単位なので剛体の表示ができたのなら同じ手順でできるはずなのですが。
件のページでは
HelloWorld::createSeaParticleGroup関数の41~43行で、スプライト作成してユーザーデータに参照を保存して
HelloWorld::update関数の22~23行で、保存しておいた参照使ってスプライトを操作してます。
DXライブラリでは、適当な描画クラス作って、上記のスプライトと同じようにして
あと適当なタイミングでまとめて描画すれば良いです。
件のページでは
HelloWorld::createSeaParticleGroup関数の41~43行で、スプライト作成してユーザーデータに参照を保存して
HelloWorld::update関数の22~23行で、保存しておいた参照使ってスプライトを操作してます。
DXライブラリでは、適当な描画クラス作って、上記のスプライトと同じようにして
あと適当なタイミングでまとめて描画すれば良いです。
Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです
座標バッファを使ってまとめて連続で描画したい、ということでしたら
件のページのHelloWorld::update関数の22~23行あたりのことをまとめて描画したいタイミングでやれば良いです。
15行目でvecListに取得しているのが座標バッファの先頭要素へのポインタ
座標バッファの各要素はb2Vec2型。
具体的な使い方は22行目を見れば分かるかと。
件のページのHelloWorld::update関数の22~23行あたりのことをまとめて描画したいタイミングでやれば良いです。
15行目でvecListに取得しているのが座標バッファの先頭要素へのポインタ
座標バッファの各要素はb2Vec2型。
具体的な使い方は22行目を見れば分かるかと。
Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです
回答ありがとうございます!
実はこのサイト並みのC++がまだよく理解できていません。
この部分をC言語で書く方法はわかりますでしょうか?
剛体はこの書き方で表示できています。
body1[3]ありまして、ポジションとアングルを取得してきてDrawRotaGraphで表示しています。
流体でGetPositionBufferで粒子一つ一つの座標を取得できるんだと思うんですが、それをb2Vec2に格納して表示するのかと思ってたんですけどうまくいきません。。
わかりますでしょうか?><
実はこのサイト並みのC++がまだよく理解できていません。
この部分をC言語で書く方法はわかりますでしょうか?
剛体はこの書き方で表示できています。
body1[3]ありまして、ポジションとアングルを取得してきてDrawRotaGraphで表示しています。
for (int i = 0; i < 3; i++)
{
b2Vec2 pos = g_title.body1[i]->GetPosition();
float angle = g_title.body1[i]->GetAngle();
DrawRotaGraph(VIWX(pos.x), VIWY(pos.y), 1, angle, g_images.title_tree, TRUE);
}
流体でGetPositionBufferで粒子一つ一つの座標を取得できるんだと思うんですが、それをb2Vec2に格納して表示するのかと思ってたんですけどうまくいきません。。
わかりますでしょうか?><
Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです
流体かどうかではなくて、(パーティクル)グループの扱いの話ですよね。
リンク先のHelloWorld::updateの記述に合わせると
あるいは
C言語の基本的な文法の範疇ではないでしょうか。
リンク先のHelloWorld::updateの記述に合わせると
//座標バッファ
b2Vec2* vecList = particleSystem->GetPositionBuffer() + seaGroup->GetBufferIndex();
for(int i = 0; i < seaGroup->GetParticleCount(); i++, vecList++) {
b2Vec2 pos = *vecList; // ←要素毎のパーティクルの座標
}
Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです
seaGroup->GetBufferIndex()が何をしているかがよく分からないです><
自分なりに描いたプログラムでは粒子一粒だけ表示(あたり判定はある)されていて、一粒以外は実体はある(当たり判定はある)のですが表示はされていません。
粒子ボディを作成する関数
ここで関数を使用しています
1つ上に書いていただいたコードをためしたのですが、
seaGroupはどこからきたのかとGetBufferIndex()を使う意味がわかりませんでした。。。
何度もすみません
追記 辛い
自分なりに描いたプログラムでは粒子一粒だけ表示(あたり判定はある)されていて、一粒以外は実体はある(当たり判定はある)のですが表示はされていません。
粒子ボディを作成する関数
b2ParticleSystem* CreateSea()
{
//ボディの定義
b2ParticleSystemDef psdef;
psdef.density = 1.5;
psdef.radius = 0.17f;
psdef.dampingStrength = 0.1f;
//ボディ作成
b2ParticleSystem* particleSystem = g_world.CreateParticleSystem(&psdef);
//粒子配置
b2CircleShape shape;
shape.m_radius = 3.0f;
b2ParticleGroupDef groupDef;
groupDef.shape = &shape;
groupDef.flags = b2_waterParticle;
groupDef.color = b2ParticleColor(100, 150, 255, 255);
groupDef.position = b2Vec2(7.0, 2.0);
return particleSystem;
}
//流体の表示
g_title.water = CreateSea();
b2Vec2* pos = g_title.water->GetPositionBuffer(); //流体の粒子のポジションを取得
DrawGraph(VIWX(pos->x), VIWY(pos->y), g_images.water, TRUE); //描画
seaGroupはどこからきたのかとGetBufferIndex()を使う意味がわかりませんでした。。。
何度もすみません
追記 辛い
Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです
できましたーーーーーーーーーーーーーーーーーーーーー!
なんとか自分でできました!
回答ありがとうございました!!
なんとか自分でできました!
回答ありがとうございました!!
Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです
具体的にどうやって解決したか書いていただくのがこの掲示板のルールなのですが。
No.6に足りないのは、
b2ParticleSystem::CreateParticleGroup
でグループを登録する処理ですね。
パーティクルシステムには複数のグループを登録できるので、
b2ParticleGroup::GetBufferIndex
でインデックス(=パーティクルシステム全体でのバッファ先頭からのオフセット)を得て、
そのグループに対してのバッファの先頭を求めることができます。
リンク先の記事のコードを見れば、変数seaGroupに代入している箇所があります。
seaGroup自体の宣言がなくても、呼び出している関数の定義から戻り値の型は分かりますし。
適当にやってうまくいくという経験を繰り返すとどんどんコードを読めなくなるので注意したほうが良いと思いますよ。
配列(状のメモリ領域)にオフセットを足すという、基本的な文法から
seaGroup->GetBufferIndex()が配列に対する何らかのオフセットだというのは自明です。
seaGroup->GetBufferIndex()が何なのか分からないので基本的な文法から目を反らすというのは
分かり切ったことから放棄していく行為ですから、基本が疎かになっていくということです。
No.6に足りないのは、
b2ParticleSystem::CreateParticleGroup
でグループを登録する処理ですね。
パーティクルシステムには複数のグループを登録できるので、
b2ParticleGroup::GetBufferIndex
でインデックス(=パーティクルシステム全体でのバッファ先頭からのオフセット)を得て、
そのグループに対してのバッファの先頭を求めることができます。
リンク先の記事のコードを見れば、変数seaGroupに代入している箇所があります。
seaGroup自体の宣言がなくても、呼び出している関数の定義から戻り値の型は分かりますし。
適当にやってうまくいくという経験を繰り返すとどんどんコードを読めなくなるので注意したほうが良いと思いますよ。
配列(状のメモリ領域)にオフセットを足すという、基本的な文法から
seaGroup->GetBufferIndex()が配列に対する何らかのオフセットだというのは自明です。
seaGroup->GetBufferIndex()が何なのか分からないので基本的な文法から目を反らすというのは
分かり切ったことから放棄していく行為ですから、基本が疎かになっていくということです。