コード例 #1
0
 public VertexTransform(CPosition position, CDimension dimension, CTransform transform)
 {
     Scale          = new Vector3(dimension.Width * transform.Scale.X, dimension.Height * transform.Scale.Y, transform.Scale.Z);
     RotationOffset = new Vector3(transform.RotationOffset.X, transform.RotationOffset.Y, 0);
     Rotation       = transform.Rotation;
     Translation    = new Vector3(position.X + transform.Translation.X, position.Y + transform.Translation.Y, position.Z + transform.Translation.Z);
 }
コード例 #2
0
 public CDimensionCollection(IExpressionCollection c) : base(c.Count)
 {
     for (int i = 0, iM = c.Count; i < iM; i++)
     {
         this[i] = new CDimension();                       // 今のところは全て 0
     }
 }
コード例 #3
0
ファイル: Hawk.cs プロジェクト: thismarvin/morro
        public static IComponent[] Create(float x, float y)
        {
            CBoid boid = new CBoid()
            {
                ViewRadius = 16,
                MoveSpeed  = Morro.Maths.Random.Range(60, 80),
                MaxForce   = 0.4f
            };
            CPhysicsBody physicsBody = new CPhysicsBody(Morro.Maths.Random.RandomVector2(boid.MoveSpeed), Microsoft.Xna.Framework.Vector2.Zero);
            CPosition    position    = new CPosition(x, y);
            CDimension   dimension   = new CDimension(4, 4);
            CTransform   transform   = new CTransform()
            {
                Scale          = new Microsoft.Xna.Framework.Vector3(3, 1, 1),
                Rotation       = -(float)Math.Atan2(physicsBody.Velocity.Y, physicsBody.Velocity.X),
                RotationOffset = new Microsoft.Xna.Framework.Vector2(dimension.Width / 2, dimension.Height / 2)
            };
            CColor color = new CColor(PICO8.MidnightBlack);

            return(new IComponent[]
            {
                boid,
                physicsBody,
                position,
                dimension,
                transform,
                color,
                new CTriangle(),
                new CPartitionable(),
                new CPredator()
            });
        }
コード例 #4
0
ファイル: Yoman.cs プロジェクト: thismarvin/morro
        public static IComponent[] Create(float x, float y, float size)
        {
            CPosition  position  = new CPosition(x, y);
            CDimension dimension = new CDimension(size, size);
            CTransform transform = new CTransform()
            {
                Rotation       = (float)Random.Range(0, System.Math.PI * 2),
                RotationOffset = new Vector2(size / 2, size / 2),
            };

            return(new IComponent[]
            {
                position,
                dimension,
                transform,
                new CColor(palette[Random.Range(0, palette.Length - 1)]),
                new CQuad(),
                new CPhysicsBody(Random.RandomVector2(Random.Range(0, 300)), new Vector2(0, 75)),
                new CPartitionable()
            });
        }
コード例 #5
0
ファイル: SWrapAround.cs プロジェクト: thismarvin/morro
        public override void UpdateEntity(int entity)
        {
            CPosition  position  = (CPosition)positions[entity];
            CDimension dimension = (CDimension)dimensions[entity];

            if (position.X + dimension.Width < scene.SceneBounds.Left)
            {
                position.X = scene.SceneBounds.Right;
            }
            else if (position.X > scene.SceneBounds.Right)
            {
                position.X = scene.SceneBounds.Left - dimension.Width;
            }
            if (position.Y + dimension.Height < scene.SceneBounds.Top)
            {
                position.Y = scene.SceneBounds.Bottom;
            }
            else if (position.Y > scene.SceneBounds.Bottom)
            {
                position.Y = scene.SceneBounds.Top - dimension.Height;
            }
        }
コード例 #6
0
        public override void UpdateEntity(int entity)
        {
            CBoid        boid        = (CBoid)boids[entity];
            CPosition    position    = (CPosition)positions[entity];
            CDimension   dimension   = (CDimension)dimensions[entity];
            CTransform   transform   = (CTransform)transforms[entity];
            CPhysicsBody physicsBody = (CPhysicsBody)physicsBodies[entity];

            Vector2 myCenter = new Vector2(position.X + dimension.Width / 2, position.Y + dimension.Height / 2);

            Vector2 cumulativeSeperation = Vector2.Zero;
            int     totalSeperation      = 0;

            Vector2 cumulativeAlignment = Vector2.Zero;
            int     totalAlignment      = 0;

            Vector2 cumulativeCohesion = Vector2.Zero;
            int     totalCohesion      = 0;

            float        distance;
            CPosition    theirPosition;
            CDimension   theirDimension;
            CPhysicsBody theirPhysicsBody;
            Vector2      force;
            Vector2      theirCenter;

            List <int> queryResult = binPartitioner.Query(new Morro.Core.Rectangle(position.X - boid.ViewRadius, position.Y - boid.ViewRadius, dimension.Width + boid.ViewRadius * 2, dimension.Height + boid.ViewRadius * 2));

            for (int i = 0; i < queryResult.Count; i++)
            {
                if (queryResult[i] == entity)
                {
                    continue;
                }

                theirPosition    = (CPosition)positions[queryResult[i]];
                theirDimension   = (CDimension)dimensions[queryResult[i]];
                theirPhysicsBody = (CPhysicsBody)physicsBodies[queryResult[i]];

                theirCenter = new Vector2(theirPosition.X + theirDimension.Width / 2, theirPosition.Y + theirDimension.Height / 2);

                distance = Vector2.Distance(myCenter, theirCenter);

                if (distance > 0)
                {
                    if (distance < boid.ViewRadius)
                    {
                        cumulativeCohesion += theirCenter;
                        totalCohesion++;

                        cumulativeAlignment += theirPhysicsBody.Velocity;
                        totalAlignment++;
                    }

                    if (distance < theirDimension.Width * 2)
                    {
                        force  = myCenter - theirCenter;
                        force /= distance * distance;
                        cumulativeSeperation += force;
                        totalSeperation++;
                    }

                    if (distance < 64 && theirDimension.Width > 2)
                    {
                        force  = myCenter - theirCenter;
                        force /= distance * distance;
                        cumulativeSeperation += force * 4;
                        totalSeperation++;
                    }
                }
            }

            distance = Vector2.Distance(Morro.Input.Mouse.SceneLocation, myCenter);

            if (distance > 0 && distance < 32)
            {
                force  = myCenter - Morro.Input.Mouse.SceneLocation;
                force /= distance * distance;
                cumulativeSeperation += force;
                totalSeperation++;
            }

            Vector2 seperation = CalculateSeperation();
            Vector2 alignment  = CalculateAlignment();
            Vector2 cohesion   = CalculateCohesion();

            Vector2 totalForce = seperation + alignment + cohesion;

            physicsBody.Velocity += totalForce;
            transform.Rotation    = -(float)Math.Atan2(physicsBody.Velocity.Y, physicsBody.Velocity.X);

            Vector2 CalculateSeperation()
            {
                if (totalSeperation <= 0)
                {
                    return(Vector2.Zero);
                }

                cumulativeSeperation /= totalSeperation;
                cumulativeSeperation.SetMagnitude(boid.MoveSpeed);
                Vector2 result = cumulativeSeperation - physicsBody.Velocity;

                result.Limit(boid.MaxForce);

                return(result * seperationIntensity);
            }

            Vector2 CalculateAlignment()
            {
                if (totalAlignment <= 0)
                {
                    return(Vector2.Zero);
                }

                cumulativeAlignment /= totalAlignment;
                cumulativeAlignment.SetMagnitude(boid.MoveSpeed);
                Vector2 result = cumulativeAlignment - physicsBody.Velocity;

                result.Limit(boid.MaxForce);

                return(result * alignmentIntensity);
            }

            Vector2 CalculateCohesion()
            {
                if (totalCohesion <= 0)
                {
                    return(Vector2.Zero);
                }

                cumulativeCohesion /= totalCohesion;
                cumulativeCohesion -= myCenter;
                cumulativeCohesion.SetMagnitude(boid.MoveSpeed);
                Vector2 result = cumulativeCohesion - physicsBody.Velocity;

                result.Limit(boid.MaxForce);

                return(result * cohesionIntensity);
            }
        }
コード例 #7
0
        internal static SchemaShape2D CreateShapeSchema(GeometryData shapeData, CPosition position, CDimension dimension, CTransform transform)
        {
            Matrix vertexTransform = CreateVertexTransform();

            Vector2[]     vertices     = CreateVertices();
            LineSegment[] lineSegments = CreateLineSegments();

            return(new SchemaShape2D(vertices, lineSegments));

            Matrix CreateVertexTransform()
            {
                return
                    (Matrix.CreateScale(dimension.Width * transform.Scale.X, dimension.Height * transform.Scale.Y, 1 * transform.Scale.Z) *

                     Matrix.CreateTranslation(-new Vector3(transform.RotationOffset.X, transform.RotationOffset.Y, 0)) *
                     Matrix.CreateRotationZ(transform.Rotation) *

                     Matrix.CreateTranslation(position.X + transform.Translation.X + transform.RotationOffset.X, position.Y + transform.Translation.Y + transform.RotationOffset.Y, transform.Translation.Z) *

                     Matrix.Identity);
            }

            Vector2[] CreateVertices()
            {
                Vector2[] result = new Vector2[shapeData.TotalVertices];

                for (int i = 0; i < shapeData.TotalVertices; i++)
                {
                    result[i] = Vector2.Transform(new Vector2(shapeData.Vertices[i].X, shapeData.Vertices[i].Y), vertexTransform);
                }

                return(result);
            }

            LineSegment[] CreateLineSegments()
            {
                int totalVertices = shapeData.TotalVertices;

                LineSegment[] result = new LineSegment[totalVertices];

                result[0] = new LineSegment(vertices[totalVertices - 1].X, vertices[totalVertices - 1].Y, vertices[0].X, vertices[0].Y);

                for (int i = 1; i < totalVertices; i++)
                {
                    result[i] = new LineSegment(vertices[i - 1].X, vertices[i - 1].Y, vertices[i].X, vertices[i].Y);
                }

                return(result);
            }
        }
コード例 #8
0
 /// <summary>
 /// CExtent constructor.
 /// </summary>
 public CExtent(CDimension dimension, ulong lowerBound, ulong upperBound)
 {
     LowerBound = lowerBound;
     UpperBound = upperBound;
     Dimension  = dimension;
 }