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); }
public CDimensionCollection(IExpressionCollection c) : base(c.Count) { for (int i = 0, iM = c.Count; i < iM; i++) { this[i] = new CDimension(); // 今のところは全て 0 } }
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() }); }
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() }); }
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; } }
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); } }
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); } }
/// <summary> /// CExtent constructor. /// </summary> public CExtent(CDimension dimension, ulong lowerBound, ulong upperBound) { LowerBound = lowerBound; UpperBound = upperBound; Dimension = dimension; }