C# Box2D ダブルクリック

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

C# Box2D ダブルクリック

#1

投稿記事 by » 14年前

いつもお世話になっています。black_catです。
今回はBox2Dのオブジェクトのダブルクリック判定の仕方が知りたくて投稿させていただきました。
    //ダブルクリックするとオブジェクトを追加する
        
    private void pictDraw_DoubleClick(object sender, EventArgs e)
        {
            Vec2 vClick = new Vec2((Cursor.Position.X - m_ptOrg.X) / m_fZoom, -(float)
            (Cursor.Position.Y - m_ptOrg.Y) / m_fZoom);

            // ダブルクリック地点情報 
            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)
            {
                {
                    BodyDef bodyDef = new BodyDef();
                    bodyDef.Position.Set(-52.6f, 57.3f);
                    Body body = m_world.CreateBody(bodyDef);
                    PolygonDef shapeDef = new PolygonDef();
                    shapeDef.SetAsBox(4.8f, 3.8f);
                    shapeDef.Density = 1.0f;
                    shapeDef.Friction = 0.3f;
                    shapeDef.Restitution = 0.5f;
                    body.CreateShape(shapeDef);
                    body.SetMassFromShapes();
                    body.SetUserData("body1");
                }
            }
        }
とりあえずはこれで出来たのですが、画像適用の時のようにUserDataを使って
オブジェクトごとに違うイベントを発生させることができません。
どうすればいいのでしょうか?

よろしくお願いします。

画像

組木紙織

Re:C# Box2D ダブルクリック

#2

投稿記事 by 組木紙織 » 14年前

box2dではダブルクリックの判定は出来ません。
使っている言語、またはライブラリ(c#?)にダブルクリックの判定があるはずなのでそれを使ってください。
てか、シングルクリックのイベントもbox2dでは判定出来ないけど。
言語がする部分とライブラリがする部分が分かっていないような気がします。

Re:C# Box2D ダブルクリック

#3

投稿記事 by » 14年前

すいません。そういう意味ではなく、

ピクチャーボックスのダブルクリック判定(C#がする)
   ↓
ダブルクリック地点の座標を取得(C#がする)
   ↓
Box2Dのオブジェクトの座標を取得する(Box2Dがする)
   ↓
2つの座標を比べる
   ↓
ダブルクリック地点がオブジェクト内であればイベント発生

ということです。

ダブルクリックのイベントの中で、どのオブジェクトの上にカーソルがあるかを判別する方法が知りたいです。。

あと、いうの忘れてましたが環境は Visual C# 2010 です。
画像

組木紙織

Re:C# Box2D ダブルクリック

#4

投稿記事 by 組木紙織 » 14年前

クリック場所にセンサーオブジェクトを構築。それとの接触で判定する。

または、オブジェクトのtestほにゃららメソッド(環境がないので確認出来ない)を使って全オブジェクト分点との判定を調べる。

Re:C# Box2D ダブルクリック

#5

投稿記事 by » 14年前

センサーオブジェクトですか。
おっしゃっている意味は分かるのですが、ややこしくなりそうですね。

GetUserDataは使えないのでしょうか? 画像

Re:C# Box2D ダブルクリック

#6

投稿記事 by » 14年前

すみません。Justyさんも参加していただけると嬉しいのですが...

Justy

Re:C# Box2D ダブルクリック

#7

投稿記事 by Justy » 14年前

 正直質問が判りづらいのですが、
「衝突しているだろう Shapeは判った。そこから UserDataを取り出したい。けどその Shapeの Bodyが判らない」
ということですか?

 そうであれば、Shapeから GetBodyメソッドで取り出せます。
 そうでなければ、もう少し質問内容を補足してください。

Re:C# Box2D ダブルクリック

#8

投稿記事 by » 14年前

いつもありがとうございます。
質問は、ダブルクリックイベントの中で画像適用の時のように
string body1 = (string)body.GetUserData();
if (body1 == ("body1"))
{

}
この方法を使うにはどうすればいいのでしょうか? というものです。

もし出来ないのなら、組木紙織さんがおっしゃっていた
センサーオブジェクトについて教えていただきたいと思っています。

センサーの使い方は、オブジェクトの作成時に
shapeDef1.SetAsBox(2, 2);
shapeDef1.IsSensor = true;
のような感じでいいのでしょうか?
GetBodyメソッドはまだ確認できていません。すみません。 画像

Re:C# Box2D ダブルクリック

#9

投稿記事 by » 14年前

僕ってなぜ教えていただくまで分からないのでしょう...
調べ方が下手なのでしょうか。
調べたり、いろいろ試してみたりしたのですが、やっぱりGetBodyメソッドの使い方がわかりませんでした。
GetBodyメソッドでのUserDataの取り出し方を教えていただけますか?
お願いします。

Justy

Re:C# Box2D ダブルクリック

#10

投稿記事 by Justy » 14年前

 GetUserDataメソッドは Bodyオブジェクトから呼び出せることは判っていますよね?
 
 次に World.Queryでクリック地点にある Shapeオブジェクトを取得しているのも
理解されていますよね?

 であれば、そのShapeオブジェクトのメソッド GetBodyを呼び出せばその Shapeが含まれている
Bodyオブジェクトが取得できます。

 あとはその Bodyから GetUserDataメソッドをユーザーデータを取り出すことができるわけですが、
どの段階で躓いていますか?

Re:C# Box2D ダブルクリック

#11

投稿記事 by » 14年前

ありがとうございます。できました!

>どの段階で躓いていますか?
何度も見直したはずなのに、なぜか
String bd = s[0].GetBody();
となっていたので
Body bd = s[0].GetBody();
と修正すると直りました。

>Bodyオブジェクトが取得できます。
と書いてくださったので気付きました。

ありがとうございました。

あと、ついでにお聞きしてもよろしいでしょうか?
デバッグの時にダブルクリックを2、3回連続ですると、
if (m_world.Query(aabb, s, 10) > 0 && s[0] != null)
のところに
  IndexOutOfRangeExceptionはハンドルされませんでした。
  インデックスが配列の境界外です。
というエラーが出るのですが、どうしてなのでしょうか?
画像

Re:C# Box2D ダブルクリック

#12

投稿記事 by » 14年前

すみません。また僕の不注意でした。
(aabb, s, 10)
のところを
(aabb, s, 1)
にするとエラーが出なくなりました。

ありがとうございました。
画像

Justy

Re:C# Box2D ダブルクリック

#13

投稿記事 by Justy » 14年前

>というエラーが出るのですが
 配列sのサイズは 10以上確保されていますか?

Re:C# Box2D ダブルクリック

#14

投稿記事 by » 14年前

入れ違いになってしまったようですね。
>配列sのサイズは 10以上確保されていますか?
そこです。そこが間違っていたようです。

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る