public override void OnCollisionEnter(ContactPoint cp) { var label = World.Find ("Label").GetComponent<Label> (2); // 爆発 var node = MyFireExplosion.Create (cp.Collidee.Node.Position); World.AddChild (node); label.Text = "Destroy : \"" + cp.Collidee.Node.Name + "\""; Destroy (cp.Collidee.Node); }
/// <summary> /// コリジョン発生イベント ハンドラー /// </summary> /// <param name="fixtureA">フィクスチャーA (自分)</param> /// <param name="fixtureB">フィクスチャーB (衝突相手)</param> /// <param name="contact">コンタクト情報</param> /// <returns></returns> private bool CollisionEnterEventHandler(Fixture fixtureA, Fixture fixtureB, Contact contact) { var phy = Physics2D.GetInstance (); var a = fixtureA.UserData as PhysicsBody; var b = fixtureB.UserData as PhysicsBody; if (a.body == null || b.body == null) { // メモ: // Bodyを Dispose してもただちに無効化されるわけではなく、 // 同ステップではイベント ハンドラーも含めてまだ有効。 // ここでチェックしてお帰りいただく必要がある。 return false; } if (((a.CollisionMask & b.GroupID) == 0) || ((b.CollisionMask & a.GroupID) == 0)) { return false; } XnaVector2 normal; // A --> B FixedArray2<XnaVector2> points; contact.GetWorldManifold (out normal, out points); var count = contact.Manifold.PointCount; if (count == 0 && contact.IsTouching ()) { // センサー(トリガー)モードの時、 // count=0 かつ Manifold は未定義 var cp = new ContactPoint (b, new Vector3 (0, 0, 0), new Vector3 (0, 0, 0)); foreach (var comp in Node.Components) { comp.OnCollisionEnter (cp); } } else if (count == 1) { var p = new Vector3 (points[0].X * phy.PPM, points[0].Y * phy.PPM, 0); var n = new Vector3 (normal.X, normal.Y, 0); var cp = new ContactPoint (b, p, n); foreach (var comp in Node.Components) { comp.OnCollisionEnter (cp); } } else if (count == 2) { var p = new Vector3 ((points[0].X + points[1].X) / 2.0f * phy.PPM, (points[0].Y + points[1].Y) / 2.0f * phy.PPM, 0); var n = new Vector3 (normal.X, normal.Y, 0); var cp = new ContactPoint (b, p, n); foreach (var comp in Node.Components) { comp.OnCollisionEnter (cp); } } return true; }