# HG changeset patch # User alys # Date 2020-12-11 21:22:26 # Node ID d36395dd0ac1ecef9ef9b2a97aa74eea1cfe2142 # Parent 38799b4d7ed7b5390f043a3c11ba63e09826410a Add zooming, scrolling, and proper sprite layering (changes from last night). diff --git a/FNA/obj/Debug/FNA.csproj.FileListAbsolute.txt b/FNA/obj/Debug/FNA.csproj.FileListAbsolute.txt --- a/FNA/obj/Debug/FNA.csproj.FileListAbsolute.txt +++ b/FNA/obj/Debug/FNA.csproj.FileListAbsolute.txt @@ -18,3 +18,4 @@ /Users/alys/repos/isometric-park-fna/FNA/obj/Debug/FNA.csproj.CoreCompileInputs.cache /Users/alys/repos/isometric-park-fna/FNA/obj/Debug/FNA.dll /Users/alys/repos/isometric-park-fna/FNA/obj/Debug/FNA.pdb +/Users/alys/repos/isometric-park-fna/FNA/obj/Debug/FNA.csprojAssemblyReference.cache diff --git a/SpriteFontPlus/src/obj/Debug/net45/SpriteFontPlus.FNA.csprojAssemblyReference.cache b/SpriteFontPlus/src/obj/Debug/net45/SpriteFontPlus.FNA.csprojAssemblyReference.cache index 24b92b861f0f1b1390dd6e0dc1b298fc91289d1e..88e932d3f550c06b32a1b8d89f02b171b22edcab GIT binary patch literal 18203 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 Tq*)6IYlvnoBCP!=)`I^6;wYB5 diff --git a/isometric-park-fna/Camera.cs b/isometric-park-fna/Camera.cs new file mode 100644 --- /dev/null +++ b/isometric-park-fna/Camera.cs @@ -0,0 +1,60 @@ +using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace isometricparkfna +{ + public class Camera + { + + public Vector2 position; + + float _zoom; + + + public static int world_width { get; set; } + public static int world_height { get; set; } + public static Vector2 display_offset { get; set; } + + public float zoom + { + get { return _zoom; } + set { _zoom = value; if (zoom < 0.1f) _zoom = 0.1f; } // Negative zoom will flip image + } + + + public Camera() + { + this.zoom = 1.0f; + position = Vector2.Zero; + } + + public void Move(Vector2 change) + { + this.position += change; + } + + public Matrix get_transformation(GraphicsDevice graphicsDevice) + { + Viewport viewPort = graphicsDevice.Viewport; + + + Matrix transformation = Matrix.CreateTranslation(new Vector3(-this.position.X, -this.position.Y, 0)) * + Matrix.CreateScale(new Vector3(this.zoom, this.zoom, 1)) * + Matrix.CreateTranslation(new Vector3(viewPort.Width * 0.5f, viewPort.Height * 0.5f, 0)); + + + return transformation; + } + + public Vector2 world_to_screen(Vector2 worldPosition) + { + return worldPosition - this.position + Camera.display_offset; + } + + public Vector2 screen_to_world(Vector2 screenPosition) + { + return screenPosition + this.position - Camera.display_offset; + } + } +} diff --git a/isometric-park-fna/FNAGame.cs b/isometric-park-fna/FNAGame.cs --- a/isometric-park-fna/FNAGame.cs +++ b/isometric-park-fna/FNAGame.cs @@ -10,6 +10,7 @@ using isometricparkfna; using System.Diagnostics; + struct Entity { public Vector2 loc; @@ -44,10 +45,10 @@ } } -static class Camera -{ - static public Vector2 Location = Vector2.Zero; -} +//static class Camera +//{ +// static public Vector2 Location = Vector2.Zero; +//} class FNAGame : Game { @@ -61,6 +62,10 @@ private Song music; private SpriteFont font; + private Camera camera = new Camera(); + + Random random_generator = new Random(); + int frameRate = 0; int frameCounter = 0; TimeSpan elapsedTime = TimeSpan.Zero; @@ -87,11 +92,13 @@ //new tile stuff TileMap myMap = new TileMap(); - int squaresAcross = 250; - int squaresDown = 250; + int squaresAcross = 25; + int squaresDown = 25; int baseOffsetX = -14; int baseOffsetY = -14; + GraphicsDevice device; + private static void Main(string[] args) { @@ -148,6 +155,8 @@ private FNAGame() { + //this.device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.) + GraphicsDeviceManager gdm = new GraphicsDeviceManager(this) { @@ -261,6 +270,37 @@ } + if (keyboardCur.IsKeyDown(Keys.Down) && keyboardPrev.IsKeyUp(Keys.Down)) + { + this.camera.Move(new Vector2(0, -2)); + } + else if (keyboardCur.IsKeyDown(Keys.Up) && keyboardPrev.IsKeyUp(Keys.Up)) + { + this.camera.Move(new Vector2(0, 2)); + + } + else if (keyboardCur.IsKeyDown(Keys.Left) && keyboardPrev.IsKeyUp(Keys.Left)) + { + this.camera.Move(new Vector2(-2, 0)); + + } + else if (keyboardCur.IsKeyDown(Keys.Right) && keyboardPrev.IsKeyUp(Keys.Right)) + { + this.camera.Move(new Vector2(2, 0)); + + } + else if (keyboardCur.IsKeyDown(Keys.Subtract) && keyboardPrev.IsKeyUp(Keys.Subtract)) + { + this.camera.zoom -= 0.25f; + + } + else if (keyboardCur.IsKeyDown(Keys.Add) && keyboardPrev.IsKeyUp(Keys.Add)) + { + this.camera.zoom += 0.25f; + + } + + if (keyboardCur.IsKeyDown(Keys.Space) && keyboardPrev.IsKeyUp(Keys.Space)) { sound.Play(volume, pitch, pan); @@ -295,20 +335,36 @@ protected void drawTileAt(int x, int y, int tileIndex, int height) { - Vector2 squareOffset = new Vector2(Camera.Location.X % 32, - Camera.Location.Y % 32); + Vector2 firstSquare = Vector2.Zero; + Vector2 squareOffset = Vector2.Zero; int offsetX = (int)squareOffset.X; int offsetY = (int)squareOffset.Y; + int firstX = (int)firstSquare.X; + int firstY = (int)firstSquare.Y; + int rowOffset = 0; + float maxdepth = ((this.squaresAcross + 1) + ((this.squaresDown + 1) * Tile.TileWidth)) * 10; + + + int mapx = (firstX + x); + int mapy = (firstY + y); + float depthOffset = 0.7f - ((mapx + (mapy * Tile.TileWidth)) / maxdepth); + + if ((firstY + y) % 2 == 1) + rowOffset = Tile.OddRowXOffset; batch.Draw( Tile.TileSetTexture, new Rectangle( - (x * Tile.TileStepX) - offsetX + 0 + baseOffsetX, + (x * Tile.TileStepX) - offsetX + rowOffset + baseOffsetX, (y * Tile.TileStepY) - offsetY + baseOffsetY, Tile.TileWidth, Tile.TileHeight*height), Tile.GetExtendedSourceRectangle(tileIndex, height), - Color.White); + Color.White, + 0.0f, + Vector2.Zero, + SpriteEffects.None, + depthOffset); } protected override void Draw(GameTime gameTime) @@ -324,16 +380,20 @@ Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); GraphicsDevice.Clear(Color.CornflowerBlue); - batch.Begin(); + batch.Begin(SpriteSortMode.BackToFront, + BlendState.AlphaBlend, + null, + null, + null, + null, + camera.get_transformation(GraphicsDevice)); //New tile stuff - Vector2 firstSquare = new Vector2(Camera.Location.X / 32, - Camera.Location.Y / 32); + Vector2 firstSquare = Vector2.Zero; int firstX = (int)firstSquare.X; int firstY = (int)firstSquare.Y; - Vector2 squareOffset = new Vector2(Camera.Location.X % 32, - Camera.Location.Y % 32); + Vector2 squareOffset = Vector2.Zero; int offsetX = (int)squareOffset.X; int offsetY = (int)squareOffset.Y; @@ -344,16 +404,21 @@ if ((firstY + y) % 2 == 1) rowOffset = Tile.OddRowXOffset; - for (int x = 0; x < this.squaresAcross; x++) - { + for (int x = 0; x < this.squaresAcross; x++) { + + batch.Draw( Tile.TileSetTexture, - new Rectangle( - (x * Tile.TileStepX) - offsetX + rowOffset + baseOffsetX, - (y * Tile.TileStepY) - offsetY + baseOffsetY, - Tile.TileWidth, Tile.TileHeight), + new Rectangle( + (x * Tile.TileStepX) - offsetX + rowOffset + baseOffsetX, + (y * Tile.TileStepY) - offsetY + baseOffsetY, + Tile.TileWidth, Tile.TileHeight), Tile.GetSourceRectangle(1), - Color.White); + Color.White, + 0.0f, + Vector2.Zero, + SpriteEffects.None, + 0.9f); } } @@ -371,7 +436,7 @@ Vector2 stop = new Vector2(startX + this.squaresAcross* Tile.TileStepX/2, this.squaresDown*Tile.TileStepY- baseOffsetY+4); - Line.drawLine(batch, start, stop, Color.White); + Line.drawLine(batch, start, stop, Color.White, 0.8f); } //Lines going down and to the left: @@ -384,34 +449,57 @@ Vector2 stop_reverse = new Vector2(startX + -(this.squaresAcross * Tile.TileStepX / 2), (this.squaresDown * Tile.TileStepY) - baseOffsetY + 4); - Line.drawLine(batch, start_reverse, stop_reverse, Color.White); + Line.drawLine(batch, start_reverse, stop_reverse, Color.White, 0.8f); } - //int startpos = 140; - //for (int i = startpos; i < startpos + 4; i++) - //{ - // batch.Draw( - // Tile.TileSetTexture, - // new Rectangle( - // ((i - startpos+2) * 2 * Tile.TileStepX) - offsetX + 0 + baseOffsetX, - // (4 * Tile.TileStepY) - offsetY + baseOffsetY, - // Tile.TileWidth, Tile.TileHeight), - // Tile.GetExtendedSourceRectangle(i, 2), - // Color.White); - //} - drawTileAt(4, 4, 140, 3); drawTileAt(6, 4, 141, 3); drawTileAt(8, 4, 142, 2); drawTileAt(10, 4, 142, 3); + drawTileAt(0, 0, 22, 1); - batch.DrawString(font, fps, new Vector2(33, 33), Color.Black); - batch.DrawString(font, fps, new Vector2(32, 32), Color.White); - batch.DrawString(font, this.drawTime.TotalMilliseconds.ToString(), new Vector2(120, 33), Color.Black); - batch.DrawString(font, this.drawTime.TotalMilliseconds.ToString(), new Vector2(119, 32), Color.White); + + //Warning: creates a flashing effect because tree positions update every 1/60th of a second + //* + + + + for (int i = 0; i< 80; i++) + { + for (int j = 0; j < 50; j += 1) + { + if (this.random_generator.NextDouble() > 0.75) + { + drawTileAt(i, j, 142, 2); + } + + + } + }//*/ + batch.End(); + + batch.Begin(SpriteSortMode.BackToFront, + BlendState.AlphaBlend, + null, + null, + null, + null); + + batch.DrawString(font, fps, new Vector2(33, 33), Color.Black, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.5f); + batch.DrawString(font, fps, new Vector2(32, 32), Color.White, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.49f); + batch.DrawString(font, this.drawTime.TotalMilliseconds.ToString(), new Vector2(120, 33), Color.Black, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.5f); + batch.DrawString(font, this.drawTime.TotalMilliseconds.ToString(), new Vector2(119, 32), Color.White, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.49f); + + + batch.DrawString(font, camera.position.ToString(), new Vector2(190, 33), Color.Black, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.5f); + batch.DrawString(font, camera.position.ToString(), new Vector2(189, 32), Color.White, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.49f); + + batch.End(); + + stopWatch.Stop(); this.drawTime = stopWatch.Elapsed; diff --git a/isometric-park-fna/isometric-park-fna.csproj b/isometric-park-fna/isometric-park-fna.csproj --- a/isometric-park-fna/isometric-park-fna.csproj +++ b/isometric-park-fna/isometric-park-fna.csproj @@ -32,6 +32,7 @@ +