C# Box2Dについて
C# Box2Dについて
Yahoo!の知恵袋などで質問したのですが、回答がなくて困っているときに
この掲示板をみつけたので質問させて頂きます。
最近C#でBox2Dを始めたのですが、どうやったらマウスジョイントを使えるのかがわかりません。
同じような投稿があったのは見たのですが、私はまだまだ勉強不足で理解できませんでした。
ttp://dokokano.net/~fslasht/warehouse/programs/testBox2d_20090318.zip
のサンプルでいろいろ試してみたのですが、まったくうまくいきません。
まだまだC#初心者の状態で、Box2Dを扱うのは難しいのでは?と思われるかもしれませんが、
教えていただけるととてもうれしいです。
開発環境は[Visual C# 2010]です。
無理を言って悪いのですが、よろしくお願いします。
この掲示板をみつけたので質問させて頂きます。
最近C#でBox2Dを始めたのですが、どうやったらマウスジョイントを使えるのかがわかりません。
同じような投稿があったのは見たのですが、私はまだまだ勉強不足で理解できませんでした。
ttp://dokokano.net/~fslasht/warehouse/programs/testBox2d_20090318.zip
のサンプルでいろいろ試してみたのですが、まったくうまくいきません。
まだまだC#初心者の状態で、Box2Dを扱うのは難しいのでは?と思われるかもしれませんが、
教えていただけるととてもうれしいです。
開発環境は[Visual C# 2010]です。
無理を言って悪いのですが、よろしくお願いします。
Re:C# Box2Dについて
>>住所特定反対さん
C言語以外でもOKだったはずですよ。
>>black_catさん
マルチポストはだめですよ。
規約を読まれてみてはいかがですか?
C言語以外でもOKだったはずですよ。
>>black_catさん
マルチポストはだめですよ。
規約を読まれてみてはいかがですか?
Re:C# Box2Dについて
他のところに質問で回答がないなら削除して構いません。
回答者がいる場合は、削除など回答者に失礼な行為は避けてください。
本来は、規約と注意事項にある通り相互リンクが望ましいです。
検索見てみたところ私の把握できる範囲では、okwave系と知恵袋に投稿されている様ですね。
あと、Box2D自体が珍しい話題なので回答できる人は限られると思います。
回答者がいる場合は、削除など回答者に失礼な行為は避けてください。
本来は、規約と注意事項にある通り相互リンクが望ましいです。
検索見てみたところ私の把握できる範囲では、okwave系と知恵袋に投稿されている様ですね。
あと、Box2D自体が珍しい話題なので回答できる人は限られると思います。
Re:C# Box2Dについて
C#版は使ったことがないですが他言語版と同じであると仮定するなら、一般的な使い方を端的に纏めると
・ マウスダウン時に WorldのQueryメソッドでクリック地点周辺のオブジェクトを探します。
・ 見つかったら MouseJointDefにデータを設定し、Worldの CreateJointメソッドで MouseJointを
生成します(この MouseJointは保持しておく)。
ここで同時に複数見つかるケースもあるのでその場合はその数の分だけ生成して下さい。
MouseJointDefの設定値は Body1に GroundBodyを、Body2は対象のオブジェクト Bodyを、
Targetに位置を、MaxForceに引っ張る力の大きさを与えます。
・ マウスが動いたら、先に生成したMouseJointに対して SetTargetでマウス位置を更新します。
・ マウスアップ時にWorldのDestroyJointを呼んで MouseJointを破棄します。
と、こんな感じのながれです。
・ マウスダウン時に WorldのQueryメソッドでクリック地点周辺のオブジェクトを探します。
・ 見つかったら MouseJointDefにデータを設定し、Worldの CreateJointメソッドで MouseJointを
生成します(この MouseJointは保持しておく)。
ここで同時に複数見つかるケースもあるのでその場合はその数の分だけ生成して下さい。
MouseJointDefの設定値は Body1に GroundBodyを、Body2は対象のオブジェクト Bodyを、
Targetに位置を、MaxForceに引っ張る力の大きさを与えます。
・ マウスが動いたら、先に生成したMouseJointに対して SetTargetでマウス位置を更新します。
・ マウスアップ時にWorldのDestroyJointを呼んで MouseJointを破棄します。
と、こんな感じのながれです。
Re:C# Box2Dについて
回答ありがとうございます。
すいません。そこまでは検索で出てきたFlashのソースや説明を見ているとなんとなく分かったのですが、
そこから先をC#でどうすればいいのかがまったく分かりません。
C#版を使われたことがないのですね。では「こうすれば動くのでは?」というような
簡単なアドバイス的なものをもらえると、とてもうれしいです。
すいません。そこまでは検索で出てきたFlashのソースや説明を見ているとなんとなく分かったのですが、
そこから先をC#でどうすればいいのかがまったく分かりません。
C#版を使われたことがないのですね。では「こうすれば動くのでは?」というような
簡単なアドバイス的なものをもらえると、とてもうれしいです。
Re:C# Box2Dについて
んー、そうですね。先の "testBox2d_20090318.zip"サンプルで、マウスの真ん中のボタンで
ドラッグできるようにするなら……。
メンバ変数として
[color=#d0d0ff" face="monospace] MouseJoint m_mouseJoint;
[/color]を追加しておきます。
pictDraw_MouseDownの下の方に
[color=#d0d0ff" face="monospace"><hr width="70%" align="left" color="#101010]
// マウスホイールダウン
if(e.Button == MouseButtons.Middle && m_mouseJoint == null)
{
// マウスダウン地点情報
AABB aabb;
Vec2 range = new Vec2(0.5f, 0.5f);
aabb.LowerBound = vClick - range;
aabb.UpperBound = vClick + range;
// マウスダウン地点にオブジェクトがあるか調べる
Shape[/url] s = new Shape[1];
if(m_world.Query(aabb, s, 1) > 0 && s[0] != null)
{
// マウスジョイント生成
MouseJointDef mjd = new MouseJointDef();
mjd.Body1 = m_world.GetGroundBody();
mjd.Body2 = s[0].GetBody();
mjd.Target = vClick;
mjd.MaxForce = 1500;
m_mouseJoint = (MouseJoint)m_world.CreateJoint(mjd);
}
}
[/color]
を加えます。
この部分が「クリック地点周辺のオブジェクトを探し、MouseJointを生成」する部分になります
AABBにマウスダウン地点周辺の情報を格納します。範囲は 0.5としていますが、適当なので調整して下さい。
これを Queryにかけるとその範囲になるシェイプの数が戻り値に入ります。ここで0が戻った場合は
マウスダウン地点周辺にはシェイプが無い、ということになり、1以上であれば指定した配列に
シェイプ情報が格納されます。
シェイプの存在が確認できたら MouseJointDefにデータを入れていきます。
値の中身は先に書いた通りです。
ドラッグできるようにするなら……。
メンバ変数として
[color=#d0d0ff" face="monospace] MouseJoint m_mouseJoint;
[/color]を追加しておきます。
pictDraw_MouseDownの下の方に
[color=#d0d0ff" face="monospace"><hr width="70%" align="left" color="#101010]
// マウスホイールダウン
if(e.Button == MouseButtons.Middle && m_mouseJoint == null)
{
// マウスダウン地点情報
AABB aabb;
Vec2 range = new Vec2(0.5f, 0.5f);
aabb.LowerBound = vClick - range;
aabb.UpperBound = vClick + range;
// マウスダウン地点にオブジェクトがあるか調べる
Shape[/url] s = new Shape[1];
if(m_world.Query(aabb, s, 1) > 0 && s[0] != null)
{
// マウスジョイント生成
MouseJointDef mjd = new MouseJointDef();
mjd.Body1 = m_world.GetGroundBody();
mjd.Body2 = s[0].GetBody();
mjd.Target = vClick;
mjd.MaxForce = 1500;
m_mouseJoint = (MouseJoint)m_world.CreateJoint(mjd);
}
}
[/color]
を加えます。
この部分が「クリック地点周辺のオブジェクトを探し、MouseJointを生成」する部分になります
AABBにマウスダウン地点周辺の情報を格納します。範囲は 0.5としていますが、適当なので調整して下さい。
これを Queryにかけるとその範囲になるシェイプの数が戻り値に入ります。ここで0が戻った場合は
マウスダウン地点周辺にはシェイプが無い、ということになり、1以上であれば指定した配列に
シェイプ情報が格納されます。
シェイプの存在が確認できたら MouseJointDefにデータを入れていきます。
値の中身は先に書いた通りです。
Re:C# Box2Dについて
あとは更新と破棄ですね。
そんなに説明する項目はないんですが、pictDrawの MouseMove/MouseUpのイベントを追加して、それぞれ
[color=#d0d0ff" face="monospace] private void pictDraw_MouseMove(object sender, MouseEventArgs e)
{
// マウスジョイント更新
if(m_mouseJoint != null)
{
Vec2 mousePoint = new Vec2((e.X - m_ptOrg.X) / m_fZoom, -(float)(e.Y - m_ptOrg.Y) / m_fZoom);
m_mouseJoint.SetTarget(mousePoint);
}
}
private void pictDraw_MouseUp(object sender, MouseEventArgs e)
{
// マウスホイールクリック
if(e.Button == MouseButtons.Middle && m_mouseJoint != null)
{
// マウスジョイント破棄
m_world.DestroyJoint(m_mouseJoint);
m_mouseJoint = null;
}
}
[/color]と、こんな感じです。
後はウインドウが非アクティブになった際にも MouseJointは破棄するなど処理が必要ですね。
そんなに説明する項目はないんですが、pictDrawの MouseMove/MouseUpのイベントを追加して、それぞれ
[color=#d0d0ff" face="monospace] private void pictDraw_MouseMove(object sender, MouseEventArgs e)
{
// マウスジョイント更新
if(m_mouseJoint != null)
{
Vec2 mousePoint = new Vec2((e.X - m_ptOrg.X) / m_fZoom, -(float)(e.Y - m_ptOrg.Y) / m_fZoom);
m_mouseJoint.SetTarget(mousePoint);
}
}
private void pictDraw_MouseUp(object sender, MouseEventArgs e)
{
// マウスホイールクリック
if(e.Button == MouseButtons.Middle && m_mouseJoint != null)
{
// マウスジョイント破棄
m_world.DestroyJoint(m_mouseJoint);
m_mouseJoint = null;
}
}
[/color]と、こんな感じです。
後はウインドウが非アクティブになった際にも MouseJointは破棄するなど処理が必要ですね。
Re:C# Box2Dについて
できました!!
Justyさん すごいです!
C#版を扱われたことがないのにこんなに早く回答をくださるとは!
これからも何度もつまずくと思いますが、よろしくお願いします。
Justyさん すごいです!
C#版を扱われたことがないのにこんなに早く回答をくださるとは!
これからも何度もつまずくと思いますが、よろしくお願いします。