Пример #1
0
        private void HandleMouseButtonDown(Point pos)
        {
            var point = new Rectangle(Camera.Ins.ScreenToWorld(pos), Point.Zero);

            objectSelected = null;

            for (var i = 0; i < objectsAvailable.Count; i++)
            {
                if (objectsAvailable[i].RigidBody.Bound.Intersects(point))
                {
                    var obj = Model.AddGameObject(objectParamsAvailable[i].Copy());
                    obj.Location = Camera.Ins.ScreenToWorld(obj.Location);
                    AddGameObject(obj);
                    objectSelected = obj;
                    return;
                }
            }

            objectsFound.Clear();
            gameObjectContainer.Find(point, objectsFound);
            foreach (var o in objectsFound)
            {
                if (o.RigidBody.Bound.Intersects(point))
                {
                    objectSelected = o;
                    return;
                }
            }
        }
Пример #2
0
        private static void SimulateGrounded(HashMap container)
        {
            container.Rebuild();
            container.ForEachVisible(object1 =>
            {
                if (object1.RigidBody.Motion != MotionEnum.Dynamic)
                {
                    return;
                }

                object1.RigidBody.Grounded = false;

                if (object1.RigidBody.Velocity.Y < 0f)
                {
                    return;
                }

                var bound = object1.RigidBody.Bound;
                var potentialSupportUpper = new Rectangle(bound.Left, bound.Bottom + 1, bound.Width, 1);
                container.Find(potentialSupportUpper, potentialSupport);
                foreach (var object2 in potentialSupport)
                {
                    if (object1.RigidBody.CollisionLayerMask.HasOne(object2.RigidBody.CollisionLayerMask) &&
                        object1.RigidBody.CollisionSideMask.HasOne(CollisionSide.Bottom) && object2.RigidBody.CollisionSideMask.HasOne(CollisionSide.Top) &&
                        object2.RigidBody.Bound.Intersects(potentialSupportUpper))
                    {
                        object1.RigidBody.Grounded = true;
                        collisions.Add(new CollideEventArgs(object1, object2, CollisionSide.Bottom, 0f));
                    }
                }
                potentialSupport.Clear();
            });
            collisions.ForEach(collision =>
            {
                CollisionHandler.PreCollide(collision.object1, collision.object2);
                CollisionHandler.PreCollide(collision.object2, collision.object1);
            });
            collisions.ForEach(collision =>
            {
                collision.object1.RigidBody.Velocity = new Vector2(collision.object1.RigidBody.Velocity.X, 0f);
            });
            collisions.Consume(collision =>
            {
                CollisionHandler.PostCollide(collision.object1, collision.object2, collision.side);
                CollisionHandler.PostCollide(collision.object2, collision.object1, collision.side.Invert());
            });
        }
Пример #3
0
        private static void SimulateCollision(HashMap container)
        {
            container.Rebuild();
            container.ForEachVisible(object1 =>
            {
                if (object1.RigidBody.Motion != MotionEnum.Dynamic)
                {
                    return;
                }

                container.Find(object1.RigidBody.Bound, objectsNearby);
                objectsNearby.Consume(object2 =>
                {
                    if (object1 != object2 && !objectsChecked.Contains(object2))
                    {
                        RigidBody.DetectCollide(object1, object2, collisions);
                    }
                });
                objectsChecked.Add(object1);
            });
            objectsChecked.Clear();
            collisions.ForEach(collision =>
            {
                CollisionHandler.PreCollide(collision.object1, collision.object2);
                CollisionHandler.PreCollide(collision.object2, collision.object1);
            });
            collisions.ForEach(collision =>
            {
                RigidBody rigidbody1 = collision.object1.RigidBody, rigidbody2 = collision.object2.RigidBody;

                if (!rigidbody1.CollisionLayerMask.HasOne(rigidbody2.CollisionLayerMask))
                {
                    return;
                }

                (var velocityfix1, var velocityfix2) = RigidBody.ResolveCollide(collision);

                velocityFix.AddIfNotExistStruct(rigidbody1, Vector3.Zero);
                velocityFix[rigidbody1] += new Vector3(velocityfix1, 1);

                velocityFix.AddIfNotExistStruct(rigidbody2, Vector3.Zero);
                velocityFix[rigidbody2] += new Vector3(velocityfix2, 1);

                locationFix.AddIfNotExistStruct(rigidbody1, Vector3.Zero);
                var f1 = collision.side.Select(velocityfix1.DivS(velocityfix1.Abs() + velocityfix2.Abs()) * collision.depth);
                locationFix[rigidbody1] += new Vector3(f1, 1);

                locationFix.AddIfNotExistStruct(rigidbody2, Vector3.Zero);
                var f2 = collision.side.Select(velocityfix2.DivS(velocityfix1.Abs() + velocityfix2.Abs()) * collision.depth);
                locationFix[rigidbody2] += new Vector3(f2, 1);
            });
            locationFix.Consume((rigidbody, dp) =>
            {
                dp /= dp.Z;
                rigidbody.Object.Location += new Vector2(dp.X, dp.Y);
            });
            velocityFix.Consume((rigidbody, dv) =>
            {
                dv /= dv.Z;
                rigidbody.Velocity += new Vector2(dv.X, dv.Y);
            });
            collisions.Consume(collision =>
            {
                CollisionHandler.PostCollide(collision.object1, collision.object2, collision.side);
                CollisionHandler.PostCollide(collision.object2, collision.object1, collision.side.Invert());
            });
        }