using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System; using System.Collections.Generic; namespace SemiColinGames { public sealed class TreeScene : IScene { const int MAX_SEGMENTS = 1000; const int MAX_VERTICES = MAX_SEGMENTS * 6; // 2 triangles per segment private readonly Color backgroundColor = Color.SkyBlue; private readonly GraphicsDevice graphics; private readonly BasicEffect basicEffect; private VertexPositionColor[] vertices; private VertexBuffer vertexBuffer; public TreeScene(GraphicsDevice graphics) { this.graphics = graphics; basicEffect = new BasicEffect(graphics) { World = Matrix.CreateTranslation(0, 0, 0), View = Matrix.CreateLookAt(Vector3.Backward, Vector3.Zero, Vector3.Up), VertexColorEnabled = true, Projection = Matrix.CreateOrthographicOffCenter(-1920 / 2, 1920 / 2, -1080 / 4, 1080 * 3 / 4, -1, 1) }; vertices = new VertexPositionColor[MAX_VERTICES]; vertexBuffer = new VertexBuffer( graphics, typeof(VertexPositionColor), MAX_VERTICES, BufferUsage.WriteOnly); } ~TreeScene() { Dispose(); } public void Dispose() { vertexBuffer.Dispose(); GC.SuppressFinalize(this); } public struct Trapezoid { public Vector2 p1, p2, p3, p4; } public void Draw(bool isRunningSlowly, IWorld iworld, bool paused) { var skeleton = new List { new Vector2(0, 0), new Vector2(0, 100), new Vector2(10, 200), new Vector2(30, 300), new Vector2(60, 400), new Vector2(100, 500), }; graphics.Clear(backgroundColor); var segments = new List(); for (int i = 0; i < skeleton.Count - 1; i++) { Vector2 low = skeleton[i]; Vector2 high = skeleton[i + 1]; Trapezoid t; int width = 10 - i; t.p1 = new Vector2(low.X - width, low.Y); t.p2 = new Vector2(low.X + width, low.Y); t.p3 = new Vector2(high.X - width + 4, high.Y); t.p4 = new Vector2(high.X + width - 4, high.Y); segments.Add(t); } Color color = Color.SaddleBrown; for (int i = 0; i < segments.Count; i++) { Trapezoid t = segments[i]; vertices[i * 6] = new VertexPositionColor(new Vector3(t.p1.X, t.p1.Y, 0), color); vertices[i * 6 + 1] = new VertexPositionColor(new Vector3(t.p2.X, t.p2.Y, 0), color); vertices[i * 6 + 2] = new VertexPositionColor(new Vector3(t.p3.X, t.p3.Y, 0), color); vertices[i * 6 + 3] = new VertexPositionColor(new Vector3(t.p2.X, t.p2.Y, 0), color); vertices[i * 6 + 4] = new VertexPositionColor(new Vector3(t.p3.X, t.p3.Y, 0), color); vertices[i * 6 + 5] = new VertexPositionColor(new Vector3(t.p4.X, t.p4.Y, 0), color); } graphics.SetVertexBuffer(vertexBuffer); vertexBuffer.SetData(vertices); foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes) { pass.Apply(); graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, segments.Count * 2); } } } }