Exemplo n.º 1
0
            public Shape(SchemaShape2D shapeScheme)
            {
                Vertices = shapeScheme.Vertices;
                Edges    = shapeScheme.Edges;

                CreateBounds();
            }
Exemplo n.º 2
0
        public override void UpdateEntity(int entity)
        {
            CPosition  position  = (CPosition)positions[entity];
            CDimension dimension = (CDimension)dimensions[entity];
            CTransform transform = (CTransform)transforms[entity];

            List <int> queryResult = binPartitioner.Query(CreateQueryBounds());

            if (queryResult.Count == 0)
            {
                return;
            }

            SchemaShape2D collisionInformation = SchemaShape2DHelper.CreateShapeSchema(CBoxColliderHelper.ShapeData, position, dimension, transform);
            Shape         shape = new Shape(collisionInformation);

            SchemaShape2D theirCollisionInformation;
            Shape         theirShape;
            CPosition     theirPosition;
            CDimension    theirDimension;
            CTransform    theirTransform;

            for (int i = 0; i < queryResult.Count; i++)
            {
                if (!scene.EntityContains(queryResult[i], typeof(CTransform), typeof(CBoxCollider)))
                {
                    continue;
                }

                if (entity == queryResult[i])
                {
                    continue;
                }

                theirPosition  = (CPosition)positions[queryResult[i]];
                theirDimension = (CDimension)dimensions[queryResult[i]];
                theirTransform = (CTransform)transforms[queryResult[i]];

                theirCollisionInformation = SchemaShape2DHelper.CreateShapeSchema(CBoxColliderHelper.ShapeData, theirPosition, theirDimension, theirTransform);
                theirShape = new Shape(theirCollisionInformation);

                ProcessResolution(CollisionHelper.GetResolution(shape, theirShape));
            }

            RectangleF CreateQueryBounds()
            {
                return(new RectangleF(position.X - queryBuffer, position.Y - queryBuffer, dimension.Width + queryBuffer * 2, dimension.Height + queryBuffer * 2));
            }

            void ProcessResolution(Vector2 resolution)
            {
                position.X += resolution.X;
                position.Y += resolution.Y;
            }
        }
Exemplo n.º 3
0
        private void HandleRotation()
        {
            if (Rotation == 0)
            {
                return;
            }

            exactBounds.RotationOffset = new Vector2(Width / 2, Height / 2);
            exactBounds.Rotation       = Rotation;

            SchemaShape2D collisionInformation = exactBounds.GetCollisionInformation();

            float xMin   = VertexFinder(collisionInformation.Vertices, "x", "minimum");
            float xMax   = VertexFinder(collisionInformation.Vertices, "x", "maximum");
            float yMin   = VertexFinder(collisionInformation.Vertices, "y", "minimum");
            float yMax   = VertexFinder(collisionInformation.Vertices, "y", "maximum");
            float width  = xMax - xMin;
            float height = yMax - yMin;

            broadBounds.SetBounds(xMin, yMin, width, height);
        }