Пример #1
0
        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);
        }
Пример #2
0
        /// <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;
        }