Пример #1
0
        public static void CircleCollider_IsHitByTest(
            float cx, float cy, float r,
            float rx, float ry, float directionX, float directionY, float distance,
            bool shouldHit, float ix = 0f, float iy = 0f, float nx = 0f, float ny = 0f)
        {
            using (var circleBody = new DynamicBody()) {
                circleBody.SetWorldPosition(new Vector2(cx, cy));
                circleBody.Collider = new CircleCollider(r);
                circleBody.Initialize(null);

                var ray = new LineSegment(new Vector2(rx, ry), new Vector2(directionX, directionY), distance);
                Assert.AreEqual(shouldHit, circleBody.Collider.IsHitBy(ray, out var hit));

                if (shouldHit)
                {
                    var normal       = new Vector2(nx, ny);
                    var intersection = new Vector2(ix, iy);

                    Assert.AreEqual(normal.X, hit.Normal.X, 0.0001f);
                    Assert.AreEqual(normal.Y, hit.Normal.Y, 0.0001f);
                    Assert.AreEqual(intersection.X, hit.ContactPoint.X, 0.0001f);
                    Assert.AreEqual(intersection.Y, hit.ContactPoint.Y, 0.0001f);
                    Assert.AreEqual(circleBody.Collider, hit.Collider);
                }
            }
        }
    // Start is called before the first frame update
    void Start()
    {
        dynamicBody = GetComponent <DynamicBody>();

        DragManager.OnDragEnded += OnLaunch;
        DragManager.OnDrag      += OnPlanning;
    }
Пример #3
0
        public void ApplyCollision(IEventTriggerer eventTriggerer, DynamicBody body)
        {
            var perp = _line.Normal.Perpendicular();
            var impulse = perp*-1.8*perp.Dot(body.Velocity); //TODO: requires mass;

            body.State = new BodyState(body.Position, body.Velocity + impulse, false);
        }
Пример #4
0
        public DynamicBodyUnitEntity(Team team, DynamicBody body, float angle, RootEntity root) : base(team, body, angle, root)
        {
            AnimationComponent animation = new AnimationComponent(root);

            GetComponent <BodyComponent>().SetAnimationComponent(animation);

            AddComponent(animation);
        }
Пример #5
0
        public Vector2 CalculateForce(DynamicBody body)
        {
            var path = (_centre - body.Position);

            if(path.Length < 10)
                return Vector2.Zero;

            return path.Normal*(_magnitude/10);
        }
Пример #6
0
        public static void PolygonCollider_ContainsPoint(float x1, float y1, float w, float h, float x2, float y2, bool shouldContain)
        {
            using (var quadBody = new DynamicBody()) {
                quadBody.SetWorldPosition(new Vector2(x1, y1));
                quadBody.Collider = PolygonCollider.CreateRectangle(w, h);
                quadBody.Initialize(null);

                Assert.AreEqual(shouldContain, quadBody.Collider.Contains(new Vector2(x2, y2)));
            }
        }
Пример #7
0
 public void SwitchToLunging()
 {
     if (_movementDirection != Vector2.Zero)
     {
         DynamicBody.ApplyLinearImpulse(20.0f * Vector2.Normalize(_movementDirection));
         CurrentState = State.Lunging;
         PlayNewCharacterAnimation();
         _lungeTime = 0;
     }
 }
Пример #8
0
        private void MoveTowards(Vector2 to)
        {
            Vector2 v = to * MovementSpeed;

            if (IsPlayerSucking())
            {
                v = to * MovementSpeed * Tweak.SUCK_SPEED_MULTIPLIER;
            }
            DynamicBody.ApplyForce(v);
        }
Пример #9
0
        public static void CircleCollider_ContainsPointTest(float x1, float y1, float r1, float x2, float y2, bool shouldContain)
        {
            using (var circleBody = new DynamicBody()) {
                circleBody.SetWorldPosition(new Vector2(x1, y1));
                circleBody.Collider = new CircleCollider(r1);
                var circle = circleBody.Collider as CircleCollider;
                circleBody.Initialize(null);

                Assert.AreEqual(shouldContain, circle.Contains(new Vector2(x2, y2)));
            }
        }
Пример #10
0
        public static void PolygonCollider_ContainsPolygon(float x1, float y1, float w1, float h1, float x2, float y2, float w2, float h2, bool shouldContain)
        {
            using (var quadBody1 = new DynamicBody())
                using (var quadBody2 = new DynamicBody()) {
                    quadBody1.SetWorldPosition(new Vector2(x1, y1));
                    quadBody1.Collider = PolygonCollider.CreateRectangle(w1, w1);
                    quadBody1.Initialize(null);

                    quadBody2.SetWorldPosition(new Vector2(x2, y2));
                    quadBody2.Collider = PolygonCollider.CreateRectangle(w2, w2);
                    quadBody2.Initialize(null);

                    Assert.AreEqual(shouldContain, quadBody1.Collider.Contains(quadBody2.Collider));
                }
        }
Пример #11
0
        public static void CircleCollider_ContainsCircleTest(float x1, float y1, float r1, float x2, float y2, float r2, bool shouldContain)
        {
            using (var circleBody1 = new DynamicBody())
                using (var circleBody2 = new DynamicBody()) {
                    circleBody1.SetWorldPosition(new Vector2(x1, y1));
                    circleBody1.Collider = new CircleCollider(r1);
                    circleBody1.Initialize(null);

                    circleBody2.SetWorldPosition(new Vector2(x2, y2));
                    circleBody2.Collider = new CircleCollider(r2);
                    circleBody2.Initialize(null);

                    Assert.AreEqual(shouldContain, circleBody1.Collider.Contains(circleBody2.Collider));
                }
        }
Пример #12
0
        public static void CircleCollider_ContainsQuadTest(float x1, float y1, float r1, float x2, float y2, float w, float h, bool shouldContain)
        {
            using (var circleBody = new DynamicBody())
                using (var quadBody = new DynamicBody()) {
                    circleBody.SetWorldPosition(new Vector2(x1, y1));
                    circleBody.Collider = new CircleCollider(r1);
                    circleBody.Initialize(null);

                    quadBody.SetWorldPosition(new Vector2(x2, y2));
                    quadBody.Collider = PolygonCollider.CreateRectangle(w, h);
                    quadBody.Initialize(null);

                    Assert.AreEqual(shouldContain, circleBody.Collider.Contains(quadBody.Collider));
                }
        }
Пример #13
0
        public GameEntryPoint()
        {
            var graphics = new GraphicsDeviceManager(this);

            Content.RootDirectory = "Content";

            _world = new WorldGrid(new AspectStorageContainer());

            _player = new Character
            {
                Position = new Vector2(10, 10)
            };

            _physics    = new GridBasedPhysicsEngine(_world);
            _playerBody = new DynamicBody();
        }
Пример #14
0
        public void HandleKeyboardInput()
        {
            _movementDirection = Vector2.Zero;
            if (Input.ButtonJustDownMapped((int)Controls.Select))
            {
                CurrentWeapon = CurrentWeapon == Weapon.Melee ? Weapon.Pistol : Weapon.Melee;
                SwitchToIdleOrMoving(CurrentState);
            }

            switch (CurrentState)
            {
            case State.Idle:
            case State.Run:
            {
                if (Input.ButtonDownMapped((int)Controls.Attack1))
                {
                    SwitchToAttacking();
                    break;
                }

                _movementDirection = GetFacingDirectionFromControls();
                if (_movementDirection != Vector2.Zero)
                {
                    _sensorRotation = MathHelper.ToDegrees((float)Math.Atan2(_movementDirection.Y, _movementDirection.X) - MathHelper.PiOver2);
                    _movementDirection.Normalize();
                    DynamicBody.ApplyForce(_movementDirection * MOVEMENT_FORCE);
                }

                break;
            }

            case State.Attack:
            {
                if (Input.ButtonDownMapped((int)Controls.Attack1))
                {
                    SuckIn();
                }
                else
                {
                    SwitchToMoving();
                }
                break;
            }
            }
        }
Пример #15
0
        public void HandleKeyboardInput()
        {
            _movementDirection = Vector2.Zero;

            switch (CurrentState)
            {
            case State.Eating:
                break;

            case State.Idle:
            case State.Moving:
            {
                if (Input.ButtonDownMapped((int)Controls.Suck))
                {
                    SwitchToSucking();
                    SuckIn();
                    break;
                }

                _movementDirection = GetFacingDirectionFromControls();
                if (_movementDirection != Vector2.Zero)
                {
                    _sensorRotation = MathHelper.ToDegrees((float)Math.Atan2(_movementDirection.Y, _movementDirection.X) - MathHelper.PiOver2);
                    _movementDirection.Normalize();
                    DynamicBody.ApplyForce(_movementDirection * MOVEMENT_FORCE);
                }

                break;
            }

            case State.Sucking:
            {
                if (Input.ButtonDownMapped((int)Controls.Suck))
                {
                    SuckIn();
                }
                else
                {
                    SwitchToMoving();
                }
                break;
            }
            }
        }
Пример #16
0
        public static void PolyGonCollider_QuadIsHitByTest(float qx, float qy, float qw, float qh, float rx, float ry, float directionX, float directionY, float distance, bool shouldHit, float ix = 0f, float iy = 0f, float nx = 0f, float ny = 0f)
        {
            using (var quadBody = new DynamicBody()) {
                quadBody.SetWorldPosition(new Vector2(qx, qy));
                quadBody.Collider = PolygonCollider.CreateRectangle(qw, qh);
                quadBody.Initialize(null);

                var ray = new LineSegment(new Vector2(rx, ry), new Vector2(directionX, directionY), distance);
                Assert.AreEqual(shouldHit, quadBody.Collider.IsHitBy(ray, out var hit));

                if (shouldHit)
                {
                    var normal       = new Vector2(nx, ny);
                    var intersection = new Vector2(ix, iy);

                    Assert.AreEqual(normal, hit.Normal);
                    Assert.AreEqual(intersection, hit.ContactPoint);
                    Assert.AreEqual(quadBody.Collider, hit.Collider);
                }
            }
        }
Пример #17
0
        public static void RectangleCollider_RectangleCollidesWithRectangleTest(float x1, float y1, float w1, float h1, float x2, float y2, float w2, float h2, bool collisionOccured)
        {
            using (var rectangleBody1 = new DynamicBody())
                using (var rectangleBody2 = new DynamicBody()) {
                    rectangleBody1.SetWorldPosition(new Vector2(x1, y1));
                    rectangleBody1.Collider = new RectangleCollider(w1, h2);
                    rectangleBody1.Initialize(null);

                    rectangleBody2.SetWorldPosition(new Vector2(x2, y2));
                    rectangleBody2.Collider = new RectangleCollider(w2, h2);
                    rectangleBody2.Initialize(null);

                    Assert.AreEqual(collisionOccured, rectangleBody1.Collider.CollidesWith(rectangleBody2.Collider, out var collision1));
                    Assert.AreEqual(collisionOccured, rectangleBody2.Collider.CollidesWith(rectangleBody1.Collider, out var collision2));

                    if (collisionOccured)
                    {
                        Assert.AreEqual(collision1.MinimumTranslationVector.Length(), collision2.MinimumTranslationVector.Length(), 0.0001f);
                        Assert.AreEqual(collision1.FirstCollider, collision2.SecondCollider);
                        Assert.AreEqual(collision1.SecondCollider, collision2.FirstCollider);
                        Assert.AreEqual(collision1.FirstContainsSecond, collision2.SecondContainsFirst);
                        Assert.AreEqual(collision1.SecondContainsFirst, collision2.FirstContainsSecond);

                        var originalPosition = rectangleBody1.WorldTransform.Position;
                        rectangleBody1.SetWorldPosition(originalPosition + collision1.MinimumTranslationVector);
                        Assert.False(rectangleBody1.Collider.CollidesWith(rectangleBody2.Collider, out collision1));
                        rectangleBody1.SetWorldPosition(originalPosition);

                        rectangleBody2.SetWorldPosition(rectangleBody2.WorldTransform.Position + collision2.MinimumTranslationVector);
                        Assert.False(rectangleBody2.Collider.CollidesWith(rectangleBody1.Collider, out collision2));
                    }
                    else
                    {
                        Assert.Null(collision1);
                        Assert.Null(collision2);
                    }
                }
        }
Пример #18
0
        public static void CircleCollider_CollidesWithQuadTest(float x1, float y1, float r1, float x2, float y2, float w, float h, bool collisionOccured)
        {
            using (var circleBody = new DynamicBody())
                using (var quadBody = new DynamicBody()) {
                    circleBody.SetWorldPosition(new Vector2(x1, y1));
                    circleBody.Collider = new CircleCollider(r1);
                    circleBody.Initialize(null);

                    quadBody.SetWorldPosition(new Vector2(x2, y2));
                    quadBody.Collider = PolygonCollider.CreateRectangle(w, h);
                    quadBody.Initialize(null);

                    Assert.AreEqual(collisionOccured, circleBody.Collider.CollidesWith(quadBody.Collider, out var collision1));
                    Assert.AreEqual(collisionOccured, quadBody.Collider.CollidesWith(circleBody.Collider, out var collision2));

                    if (collisionOccured)
                    {
                        Assert.AreEqual(collision1.MinimumTranslationVector.Length(), collision2.MinimumTranslationVector.Length(), 0.0001f);
                        Assert.AreEqual(collision1.FirstCollider, collision2.SecondCollider);
                        Assert.AreEqual(collision1.SecondCollider, collision2.FirstCollider);
                        Assert.AreEqual(collision1.FirstContainsSecond, collision2.SecondContainsFirst);
                        Assert.AreEqual(collision1.SecondContainsFirst, collision2.FirstContainsSecond);

                        var originalPosition = circleBody.WorldTransform.Position;
                        circleBody.SetWorldPosition(originalPosition + collision1.MinimumTranslationVector);
                        Assert.False(circleBody.Collider.CollidesWith(quadBody.Collider, out collision1));
                        circleBody.SetWorldPosition(originalPosition);

                        quadBody.SetWorldPosition(quadBody.WorldTransform.Position + collision2.MinimumTranslationVector);
                        Assert.False(quadBody.Collider.CollidesWith(circleBody.Collider, out collision2));
                    }
                    else
                    {
                        Assert.Null(collision1);
                        Assert.Null(collision2);
                    }
                }
        }
Пример #19
0
        public static void LineCollider_IsHitByTest(
            float x1, float y1, float x2, float y2,
            float rx1, float ry1, float rx2, float ry2,
            bool shouldHit, float ix = 0f, float iy = 0f, float nx = 0f, float ny = 0f)
        {
            using (var lineBody = new DynamicBody()) {
                lineBody.Collider = new LineCollider(new Vector2(x1, y1), new Vector2(x2, y2));
                lineBody.Initialize(null);

                var ray = new LineSegment(new Vector2(rx1, ry1), new Vector2(rx2, ry2));
                Assert.AreEqual(shouldHit, lineBody.Collider.IsHitBy(ray, out var hit));

                if (shouldHit)
                {
                    var normal       = new Vector2(nx, ny);
                    var intersection = new Vector2(ix, iy);

                    Assert.AreEqual(normal, hit.Normal);
                    Assert.AreEqual(intersection, hit.ContactPoint);
                    Assert.AreEqual(lineBody.Collider, hit.Collider);
                }
            }
        }
Пример #20
0
    protected override void Update(GameTime gameTime)
    {
        lastGameTime = gameTime;
        lastDT       = (float)lastGameTime.ElapsedGameTime.TotalSeconds;

        // update our input
        OnBeforeInputUpdate?.Invoke();
        Input.Update();

        // update the UI
        UI.UpdateUI();

        // update our game logic
        OnBeforeLogicUpdate?.Invoke();
        Behavior.UpdateAllBehaviorSystems();

        // update physics stuff
        OnBeforePhysicsUpdate?.Invoke();
        Physics.World.Step(lastDT);
        DynamicBody.UpdateAllBodies();

        OnEndUpdate?.Invoke();
        base.Update(gameTime);
    }
Пример #21
0
        private void MoveTowards(Vector2 to)
        {
            Vector2 v = to * MovementSpeed;

            DynamicBody.ApplyForce(v);
        }
 void OnEnable()
 {
     boxDetection = serializedObject.targetObject as DynamicBody;
 }
Пример #23
0
 public DynamicResponse(DynamicBody body) => Body = body;
Пример #24
0
 protected override void Initialize()
 {
     this._body = this.Parent as DynamicBody;
 }
Пример #25
0
 public Vector2 CalculateForce(DynamicBody body)
 {
     return _force;
 }
Пример #26
0
 void AddGameObject(AddGameObjectRequest
          message)
 {
     var dynamicBody = new DynamicBody();
     message.GameObject.Body = dynamicBody;
     _physicsObjects.Add(new PhysicsObject(message.GameObject, dynamicBody));
     _eventTriggerer.Trigger(new GameObjectAdded(message.GameObject));
 }
Пример #27
0
        public bool IsCollision(DynamicBody body, BodyState startState, BodyState endState)
        {
            var perp = _line.Normal.Perpendicular();

            var barrierDistance = perp.Dot(_leftPoint);

            var startDistance = perp.Dot(startState.Position) - barrierDistance;
            var endDistance = perp.Dot(endState.Position) - barrierDistance;

            if (Math.Sign(startDistance) != Math.Sign(endDistance)) {
                var path = new Line(startState.Position, endState.Position);

                var pathPerp = path.Normal.Perpendicular();

                var ballDistance = pathPerp.Dot(startState.Position);
                var leftDistance = pathPerp.Dot(_leftPoint);
                var rightDistance = pathPerp.Dot(_rightPoint);

                if (leftDistance <= ballDistance && ballDistance <= rightDistance)
                    return true;
            }

            return false;
        }
Пример #28
0
        ICollision CalculateCollision(IBarrier barrier, DynamicBody body, TimeSpan start, TimeSpan end, int depth)
        {
            var startState = CalculateState(body, start);
            var endState = CalculateState(body, end);

            if (barrier.IsCollision(body, startState, endState)) {
                if (++depth == MaxCollisionDepth)
                    return new Collision(start, barrier, body);

                var middle = TimeSpan.FromSeconds((start + end).TotalSeconds/2.0);
                var firstHalfCollision = CalculateCollision(barrier, body, start, middle, depth);

                if (firstHalfCollision != null)
                    return firstHalfCollision;

                var secondHalfCollision = CalculateCollision(barrier, body, middle, end, depth);

                return secondHalfCollision;
            }
            return null;
        }
Пример #29
0
 public Collision(TimeSpan collisionTime, IBarrier barrier, DynamicBody body)
 {
     CollisionTime = collisionTime;
     Barrier = barrier;
     Body = body;
 }
Пример #30
0
        BodyState CalculateState(DynamicBody body, TimeSpan elapsed)
        {
            var position = body.Position + body.Velocity*elapsed.TotalSeconds;
            var velocityResult = CalculateVelocity(body, elapsed);

            return new BodyState(
                position,
                velocityResult.Velocity,
                velocityResult.IsInRest
                );
        }
Пример #31
0
        VelocityResult CalculateVelocity(DynamicBody body, TimeSpan elapsed)
        {
            var impulse = body.Forces.Aggregate(Vector2.Zero,
                                                (current, force) =>
                                                current + force.CalculateForce(body))
                          *elapsed.TotalSeconds; //TODO: requires mass;

            var velocityBeforeResistance = body.Velocity + impulse;

            var resistiveImpulse = body.ResistiveForces.Aggregate(Vector2.Zero,
                                                                  (c, f) =>
                                                                  c +
                                                                  f.CalculateForce(body))
                                   *elapsed.TotalSeconds;

            var velocity = new Vector2(
                AddStickingToZero(velocityBeforeResistance.X, resistiveImpulse.X),
                AddStickingToZero(velocityBeforeResistance.Y, resistiveImpulse.Y));

            var isInRest = (velocity == Vector2.Zero && resistiveImpulse.Length > impulse.Length);

            return new VelocityResult(velocity, isInRest);
        }
Пример #32
0
        protected override void LoadContent()
        {
            base.LoadContent();
            var scene = new Scene();

            var camera = new Camera();

            scene.AddChild(camera);

            var physicsModule = scene.AddModule <PhysicsModule>(1f / 60f);

            physicsModule.Gravity = new Gravity(new Vector2(0f, -9f));

            var circleBody = new DynamicBody();

            circleBody.LocalPosition -= new Vector2(0f, 3f);
            circleBody.IsKinematic    = true;
            circleBody.Mass           = 3f;
            var circleCollider = new CircleCollider(0.75f);

            circleBody.Collider = circleCollider;
            var circleDrawer = new ColliderDrawer();

            circleBody.AddChild(circleDrawer);
            circleDrawer.Color         = Color.Green;
            circleDrawer.LineThickness = 2f;
            circleBody.AddChild(new VelocityChanger());
            scene.AddChild(circleBody);

            for (var y = 0; y < 1; y++)
            {
                for (var x = 0; x < 1; x++)
                {
                    var smallCircleBody = new DynamicBody {
                        Name = $"small circle {x}"
                    };
                    smallCircleBody.LocalPosition -= new Vector2(-3 + x, -1f + y);
                    smallCircleBody.IsKinematic    = true;
                    smallCircleBody.Mass           = 1f;
                    var smallCircleCollider = new CircleCollider(0.3f);
                    smallCircleBody.Collider        = smallCircleCollider;
                    smallCircleBody.PhysicsMaterial = new PhysicsMaterial(1f, 0f);
                    var smallCircleDrawer = new ColliderDrawer();
                    smallCircleBody.AddChild(smallCircleDrawer);
                    smallCircleDrawer.Color         = Color.OrangeRed;
                    smallCircleDrawer.LineThickness = 1f;
                    scene.AddChild(smallCircleBody);
                }
            }

            var rectangleBody = new Body();

            rectangleBody.Collider        = PolygonCollider.CreateRectangle(10f, 1f);
            rectangleBody.PhysicsMaterial = new PhysicsMaterial(0.5f, 1f);
            rectangleBody.LocalPosition  -= new Vector2(0f, 4f);
            var rectangleDrawer = new ColliderDrawer();

            rectangleBody.AddChild(rectangleDrawer);
            rectangleDrawer.Color         = Color.White;
            rectangleDrawer.LineThickness = 1f;
            scene.AddChild(rectangleBody);

            var angleBody1 = new Body();

            angleBody1.Collider        = new LineCollider(new Vector2(-8f, 4f), new Vector2(-5f, -3.5f));
            angleBody1.PhysicsMaterial = new PhysicsMaterial(0.5f, 1f);
            var angleDrawer1 = new ColliderDrawer();

            angleBody1.AddChild(angleDrawer1);
            angleDrawer1.Color         = Color.White;
            angleDrawer1.LineThickness = 1f;
            scene.AddChild(angleBody1);

            var angleBody2 = new Body();

            angleBody2.Collider        = new LineCollider(new Vector2(8f, 4f), new Vector2(5f, -3.5f));
            angleBody2.PhysicsMaterial = new PhysicsMaterial(0.5f, 1f);
            var angleDrawer2 = new ColliderDrawer();

            angleBody2.AddChild(angleDrawer2);
            angleDrawer2.Color         = Color.White;
            angleDrawer2.LineThickness = 1f;
            scene.AddChild(angleBody2);

            var lineBody = new Body();

            lineBody.Collider        = new LineCollider(new Vector2(-8f, 4f), new Vector2(8f, 4f));
            lineBody.PhysicsMaterial = new PhysicsMaterial(0.5f, 1f);
            var lineDrawer = new ColliderDrawer();

            lineBody.AddChild(lineDrawer);
            lineDrawer.Color         = Color.White;
            lineDrawer.LineThickness = 1f;
            scene.AddChild(lineBody);

            scene.SaveToFile(@"TestGame - CurrentLevel.json", new Serializer());
            this.CurrentScene = new Serializer().Deserialize <Scene>(@"TestGame - CurrentLevel.json");
        }
Пример #33
0
 public ChampionEntity(uint peerID, Team team, DynamicBody body, float angle, RootEntity root) : base(team, body, angle, root)
 {
     PeerID = peerID;
 }