Show More
Commit Description:
Added tag 0.24.30 for changeset cd33afae1ee2
Commit Description:
Added tag 0.24.30 for changeset cd33afae1ee2
References:
File last commit:
Show/Diff file:
Action:
isometric-park-fna/FNAGame.cs
770 lines | 19.7 KiB | text/x-csharp | CSharpLexer
770 lines | 19.7 KiB | text/x-csharp | CSharpLexer
r16 | using System.Collections.Generic; | |||
using Microsoft.Xna.Framework; | ||||
r1 | using Microsoft.Xna.Framework.Audio; | |||
using Microsoft.Xna.Framework.Input; | ||||
using Microsoft.Xna.Framework.Graphics; | ||||
using Microsoft.Xna.Framework.Media; | ||||
using System; | ||||
using System.IO; | ||||
using SpriteFontPlus; | ||||
using isometricparkfna; | ||||
r3 | using System.Diagnostics; | |||
r28 | using static isometricparkfna.TileMap; | |||
r21 | ||||
#if DEBUG | ||||
r16 | using ImGuiNET.SampleProgram.XNA; | |||
r18 | using ImGuiNET; | |||
r21 | #endif | |||
r4 | ||||
r1 | class FNAGame : Game | |||
{ | ||||
private KeyboardState keyboardPrev = new KeyboardState(); | ||||
private SpriteBatch batch; | ||||
private Texture2D texture; | ||||
private SoundEffect sound; | ||||
private Song music; | ||||
private SpriteFont font; | ||||
r17 | private SpriteFont monoFont; | |||
r1 | ||||
r13 | private Camera camera = new Camera(new float[] { 0.25f, 0.5f, 1.0f, 2.0f, 4.0f }); | |||
r4 | ||||
Random random_generator = new Random(); | ||||
r1 | int frameRate = 0; | |||
int frameCounter = 0; | ||||
TimeSpan elapsedTime = TimeSpan.Zero; | ||||
r3 | TimeSpan drawTime = TimeSpan.Zero; | |||
r16 | Queue<float> past_fps = new Queue<float>(100); | |||
r19 | int tilesDrawn = 0; | |||
r1 | ||||
private const int width = 1280; | ||||
private const int height = 640; | ||||
//new tile stuff | ||||
r28 | int squaresAcross = 150; | |||
int squaresDown = 150; | ||||
r1 | int baseOffsetX = -14; | |||
int baseOffsetY = -14; | ||||
r4 | GraphicsDevice device; | |||
r27 | Simulation simulation; | |||
r9 | ||||
r11 | Vector2 mouseGrid; | |||
Vector2 original_point; | ||||
r12 | Vector2 mousePos; | |||
r21 | #if DEBUG | |||
r16 | private ImGuiRenderer _imGuiRenderer; | |||
private DebugWindow debugWindow; | ||||
r21 | #endif | |||
r17 | bool show_another_window; | |||
r18 | private bool showInitial; | |||
int messageIndex; | ||||
r1 | ||||
r19 | //buggy | |||
r20 | private static bool enableCulling = false; | |||
r19 | ||||
r21 | private bool showGrid = true; | |||
r19 | private static void Main(string[] args) | |||
r1 | { | |||
using FNAGame g = new FNAGame(); | ||||
g.Run(); | ||||
} | ||||
private FNAGame() | ||||
{ | ||||
r4 | //this.device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.) | |||
r1 | GraphicsDeviceManager gdm = new GraphicsDeviceManager(this) | |||
{ | ||||
// Typically you would load a config here... | ||||
PreferredBackBufferWidth = width, | ||||
r5 | PreferredBackBufferHeight = height, | |||
r1 | IsFullScreen = false, | |||
SynchronizeWithVerticalRetrace = true | ||||
}; | ||||
//gdm.SynchronizeWithVerticalRetrace = false; | ||||
IsFixedTimeStep = false; | ||||
r28 | this.simulation = new Simulation(this.squaresAcross, this.squaresDown, 16.66667f*30); | |||
r9 | ||||
r27 | foreach (List<Cell> row in this.simulation.map.cells) | |||
r9 | { | |||
foreach (Cell cell in row) | ||||
{ | ||||
if (this.random_generator.NextDouble() > 0.75) | ||||
{ | ||||
cell.hasTree = true; | ||||
} | ||||
} | ||||
} | ||||
r18 | showInitial = true; | |||
messageIndex = 0; | ||||
r1 | Content.RootDirectory = "Content"; | |||
} | ||||
protected override void Initialize() | ||||
{ | ||||
/* This is a nice place to start up the engine, after | ||||
* loading configuration stuff in the constructor | ||||
*/ | ||||
r5 | this.IsMouseVisible = true; | |||
r21 | #if DEBUG | |||
r18 | _imGuiRenderer = new ImGuiRenderer(this); | |||
r16 | _imGuiRenderer.RebuildFontAtlas(); // Required so fonts are available for rendering | |||
r21 | #endif | |||
r1 | base.Initialize(); | |||
} | ||||
protected override void LoadContent() | ||||
{ | ||||
// Load textures, sounds, and so on in here... | ||||
// Create the batch... | ||||
batch = new SpriteBatch(GraphicsDevice); | ||||
// ... then load a texture from ./Content/FNATexture.png | ||||
texture = Content.Load<Texture2D>("FNATexture"); | ||||
sound = Content.Load<SoundEffect>("FNASound"); | ||||
music = Content.Load<Song>("IfImWrong"); | ||||
Tile.TileSetTexture = Content.Load<Texture2D>(@"part4_tileset"); | ||||
Line.initialize(GraphicsDevice); | ||||
var fontBakeResult = TtfFontBaker.Bake(File.OpenRead(@"Content/DroidSans.ttf"), | ||||
25, | ||||
1024, | ||||
1024, | ||||
new[] | ||||
{ | ||||
CharacterRange.BasicLatin, | ||||
CharacterRange.Latin1Supplement, | ||||
r27 | CharacterRange.LatinExtendedA | |||
r1 | } | |||
); | ||||
r17 | ||||
var bakedMono = TtfFontBaker.Bake(File.OpenRead(@"Content/iosevka-medium.ttf"), | ||||
15, | ||||
1024, | ||||
1024, | ||||
new[] | ||||
{ | ||||
CharacterRange.BasicLatin, | ||||
CharacterRange.Latin1Supplement, | ||||
CharacterRange.LatinExtendedA, | ||||
r27 | CharacterRange.Cyrillic, | |||
CharacterRange.LatinExtendedB, | ||||
new CharacterRange((char) 0x00B7) | ||||
r17 | } | |||
); | ||||
r27 | ||||
r21 | #if DEBUG | |||
r16 | this.debugWindow = new DebugWindow(this._imGuiRenderer, GraphicsDevice); | |||
r21 | #endif | |||
r1 | font = fontBakeResult.CreateSpriteFont(GraphicsDevice); | |||
r17 | monoFont = bakedMono.CreateSpriteFont(GraphicsDevice); | |||
r1 | //DynamicSpriteFont font = DynamicSpriteFont.FromTtf(File.ReadAllBytes(@"Content/DroidSans.ttf"), 20); | |||
} | ||||
protected override void UnloadContent() | ||||
{ | ||||
// Clean up after yourself! | ||||
batch.Dispose(); | ||||
texture.Dispose(); | ||||
sound.Dispose(); | ||||
music.Dispose(); | ||||
} | ||||
r11 | Vector2 calculateMousegrid(Vector2 normalizedMousePos) | |||
r13 | { | |||
r12 | ||||
//int gridx = (int)(normalizedMousePos.X / Tile.TileSpriteWidth); | ||||
//int gridy = (int)(normalizedMousePos.Y / Tile.TileSpriteHeight); | ||||
Vector2 adjust = new Vector2(Tile.TileSpriteWidth / 2, Tile.TileSpriteHeight); | ||||
Vector2 adjustedMousePos = normalizedMousePos - adjust; | ||||
r13 | float boardx = ((adjustedMousePos.X / Tile.TileSpriteWidth) + (adjustedMousePos.Y / Tile.TileSpriteHeight)); | |||
r12 | float boardy = ((adjustedMousePos.Y / Tile.TileSpriteHeight) - (adjustedMousePos.X / Tile.TileSpriteWidth)); | |||
r14 | return new Vector2((int)boardx, (int)boardy); | |||
r12 | /* | |||
int gridx = (int)((normalizedMousePos.X + (this.baseOffsetX + 4)) / Tile.TileWidth) ; | ||||
int gridy = (int)((normalizedMousePos.Y + (this.baseOffsetX + 4) + (2*baseOffsetY)) / (Tile.TileStepY)); | ||||
r11 | ||||
r12 | int within_gridx = (int)((normalizedMousePos.X) % Tile.TileWidth) - (Tile.TileWidth/2); | |||
int within_gridy = (int)((normalizedMousePos.Y) % Tile.TileHeight) - (Tile.TileHeight / 2); | ||||
r11 | ||||
int middle_distance = Math.Abs(within_gridx) + Math.Abs(within_gridx); | ||||
Vector2 adjustment_vector; | ||||
r12 | return new Vector2(gridx, gridy); | |||
r11 | if (middle_distance < (Tile.TileWidth / 2)) | |||
{ | ||||
return new Vector2(gridx, gridy); | ||||
} | ||||
else if ((Math.Sign(within_gridx) == -1) && (Math.Sign(within_gridy) == 1)) | ||||
{ | ||||
adjustment_vector = new Vector2(-1, -1); | ||||
return new Vector2(gridx, gridy) + adjustment_vector; | ||||
} | ||||
else if ((Math.Sign(within_gridx) == -1) && (Math.Sign(within_gridy) == -1)) | ||||
{ | ||||
adjustment_vector = new Vector2(-1, 1); | ||||
return new Vector2(gridx, gridy) + adjustment_vector; | ||||
} | ||||
else if ((Math.Sign(within_gridx) == 1) && (Math.Sign(within_gridy) == 1)) | ||||
{ | ||||
adjustment_vector = new Vector2(0, -1); | ||||
return new Vector2(gridx, gridy) + adjustment_vector; | ||||
} | ||||
else if ((Math.Sign(within_gridx) == 1) && (Math.Sign(within_gridy) == -1)) | ||||
{ | ||||
adjustment_vector = new Vector2(0, 1); | ||||
return new Vector2(gridx, gridy) + adjustment_vector; | ||||
} | ||||
else { | ||||
return new Vector2(gridx, gridy); | ||||
} | ||||
r12 | */ | |||
r11 | ||||
} | ||||
r1 | ||||
protected override void Update(GameTime gameTime) | ||||
{ | ||||
float volume = 1.0f; | ||||
float pitch = 0.0f; | ||||
float pan = 0.0f; | ||||
// Run game logic in here. Do NOT render anything here! | ||||
KeyboardState keyboardCur = Keyboard.GetState(); | ||||
if (keyboardCur.IsKeyDown(Keys.Q) && keyboardPrev.IsKeyUp(Keys.Q)) | ||||
{ | ||||
System.Console.WriteLine("Quitting"); | ||||
Environment.Exit(0); | ||||
} | ||||
r13 | if (keyboardCur.IsKeyDown(Keys.Down)) | |||
r4 | { | |||
r21 | this.camera.Move(new Vector2(0, 2)); | |||
r4 | } | |||
r13 | else if (keyboardCur.IsKeyDown(Keys.Up)) | |||
{ | ||||
r21 | this.camera.Move(new Vector2(0, -2)); | |||
r4 | ||||
} | ||||
r13 | else if (keyboardCur.IsKeyDown(Keys.Left)) | |||
r4 | { | |||
this.camera.Move(new Vector2(-2, 0)); | ||||
} | ||||
r13 | else if (keyboardCur.IsKeyDown(Keys.Right)) | |||
r4 | { | |||
this.camera.Move(new Vector2(2, 0)); | ||||
} | ||||
else if (keyboardCur.IsKeyDown(Keys.Subtract) && keyboardPrev.IsKeyUp(Keys.Subtract)) | ||||
{ | ||||
r7 | this.camera.ZoomOut(); | |||
r4 | } | |||
else if (keyboardCur.IsKeyDown(Keys.Add) && keyboardPrev.IsKeyUp(Keys.Add)) | ||||
{ | ||||
r7 | this.camera.ZoomIn(); | |||
r4 | } | |||
r18 | if (keyboardCur.IsKeyDown(Keys.OemBackslash) && keyboardPrev.IsKeyUp(Keys.OemBackslash)) | |||
r17 | { | |||
r18 | this.show_another_window = !this.show_another_window; | |||
r17 | ||||
} | ||||
r21 | if (keyboardCur.IsKeyDown(Keys.G) && keyboardPrev.IsKeyUp(Keys.G)) | |||
{ | ||||
this.showGrid = !this.showGrid; | ||||
} | ||||
r4 | ||||
r5 | ||||
r1 | if (keyboardCur.IsKeyDown(Keys.Space) && keyboardPrev.IsKeyUp(Keys.Space)) | |||
{ | ||||
sound.Play(volume, pitch, pan); | ||||
} | ||||
//if (keyboardCur.IsKeyDown(Keys.P) && keyboardPrev.IsKeyUp(Keys.P)) | ||||
// { | ||||
// this.player_state = !this.player_state; | ||||
// } | ||||
//if (player_state ) | ||||
//{ | ||||
// MediaPlayer.Play(music); | ||||
//} | ||||
r5 | MouseState mouseCur = Mouse.GetState(); | |||
r6 | if (MathUtils.Between(mouseCur.X, 0, 50)) | |||
r5 | { | |||
this.camera.Move(new Vector2(-4, 0)); | ||||
} | ||||
r6 | else if (MathUtils.Between(mouseCur.X, (FNAGame.width - 50), FNAGame.width)) | |||
r5 | { | |||
this.camera.Move(new Vector2(4, 0)); | ||||
} | ||||
r6 | if (MathUtils.Between(mouseCur.Y, 0, 50)) | |||
r5 | { | |||
this.camera.Move(new Vector2(0, -4)); | ||||
} | ||||
r13 | else if (MathUtils.Between(mouseCur.Y, (FNAGame.height - 50), FNAGame.height)) | |||
r5 | { | |||
this.camera.Move(new Vector2(0, 4)); | ||||
} | ||||
r12 | ||||
r28 | this.simulation.update(gameTime.ElapsedGameTime); | |||
r11 | ||||
this.original_point = Vector2.Transform(new Vector2(mouseCur.X, mouseCur.Y), Matrix.Invert(camera.get_transformation(GraphicsDevice))); | ||||
//int gridx = (int)((this.original_point.X-baseOffsetX) / Tile.TileStepX); | ||||
/* int gridx = (int)(this.original_point.Y / Tile.TileHeight + this.original_point.X / Tile.TileWidth); */ | ||||
//int gridy = (int)((this.original_point.Y-baseOffsetY) / (Tile.TileStepY*2)); | ||||
/* int gridy = (int)(this.original_point.Y / Tile.TileHeight - this.original_point.X / Tile.TileWidth); */ | ||||
//this.mouseGrid = new Vector2(gridx, gridy); | ||||
this.mouseGrid = this.calculateMousegrid(this.original_point); | ||||
r1 | elapsedTime += gameTime.ElapsedGameTime; | |||
if (elapsedTime > TimeSpan.FromSeconds(1)) | ||||
{ | ||||
elapsedTime -= TimeSpan.FromSeconds(1); | ||||
frameRate = frameCounter; | ||||
frameCounter = 0; | ||||
} | ||||
r7 | this.keyboardPrev = keyboardCur; | |||
r1 | base.Update(gameTime); | |||
} | ||||
r13 | ||||
r2 | protected void drawTileAt(int x, int y, int tileIndex, int height) | |||
r13 | { | |||
float maxdepth = ((this.squaresAcross + 1) + ((this.squaresDown + 1) * Tile.TileWidth)) * 10; | ||||
float depthOffset = 0.7f - ((0 + (0 * Tile.TileWidth)) / maxdepth); | ||||
drawTileAt(x, y, tileIndex, height, depthOffset); | ||||
} | ||||
r19 | protected Boolean cull(int gridX, int gridY) | |||
{ | ||||
int screenX = (gridX - gridY) * Tile.TileSpriteWidth / 2; | ||||
int screenY = (gridX + gridY) * Tile.TileSpriteHeight / 2; | ||||
Vector2 original = Vector2.Transform(new Vector2(screenX, screenY), camera.get_transformation(GraphicsDevice)); | ||||
return (!FNAGame.enableCulling || | ||||
(MathUtils.Between(original.X, -Tile.TileSpriteWidth, FNAGame.width) | ||||
&& MathUtils.Between(original.Y, -Tile.TileSpriteHeight, FNAGame.height))); | ||||
} | ||||
r13 | protected void drawTileAt(int x, int y, int tileIndex, int height, float depth) | |||
r2 | { | |||
r12 | /* | |||
r4 | Vector2 firstSquare = Vector2.Zero; | |||
Vector2 squareOffset = Vector2.Zero; | ||||
r2 | ||||
int offsetX = (int)squareOffset.X; | ||||
int offsetY = (int)squareOffset.Y; | ||||
r4 | 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; | ||||
r2 | ||||
batch.Draw( | ||||
Tile.TileSetTexture, | ||||
new Rectangle( | ||||
r4 | (x * Tile.TileStepX) - offsetX + rowOffset + baseOffsetX, | |||
r9 | (y * Tile.TileStepY) - offsetY + baseOffsetY-(Tile.TileHeight*(height-1)), | |||
r2 | Tile.TileWidth, Tile.TileHeight*height), | |||
Tile.GetExtendedSourceRectangle(tileIndex, height), | ||||
r4 | Color.White, | |||
0.0f, | ||||
Vector2.Zero, | ||||
SpriteEffects.None, | ||||
depthOffset); | ||||
r12 | */ | |||
r14 | int height_adjust = 0; | |||
r12 | ||||
r14 | if (height > 1) //not sure why this is necessary :/ | |||
{ | ||||
height_adjust = height; | ||||
} | ||||
int adjustedx = x - height_adjust; | ||||
int adjustedy = y - height_adjust; | ||||
int screenx = (adjustedx - adjustedy) * Tile.TileSpriteWidth / 2; | ||||
int screeny = (adjustedx + adjustedy) * Tile.TileSpriteHeight / 2; | ||||
r12 | ||||
r19 | if (this.cull(x, y)) | |||
{ | ||||
batch.Draw( | ||||
r12 | Tile.TileSetTexture, | |||
new Rectangle( | ||||
screenx, | ||||
screeny, | ||||
Tile.TileWidth, Tile.TileHeight * height), | ||||
Tile.GetExtendedSourceRectangle(tileIndex, height), | ||||
Color.White, | ||||
0.0f, | ||||
Vector2.Zero, | ||||
SpriteEffects.None, | ||||
r13 | depth); | |||
r19 | } | |||
r28 | ||||
r2 | } | |||
r16 | ||||
r1 | protected override void Draw(GameTime gameTime) | |||
{ | ||||
// Render stuff in here. Do NOT run game logic in here! | ||||
frameCounter++; | ||||
string fps = string.Format("fps: {0}", frameRate); | ||||
r3 | Stopwatch stopWatch = new Stopwatch(); | |||
stopWatch.Start(); | ||||
r1 | GraphicsDevice.Clear(Color.CornflowerBlue); | |||
r4 | batch.Begin(SpriteSortMode.BackToFront, | |||
BlendState.AlphaBlend, | ||||
null, | ||||
null, | ||||
null, | ||||
null, | ||||
camera.get_transformation(GraphicsDevice)); | ||||
r1 | ||||
//New tile stuff | ||||
r12 | /* | |||
r4 | Vector2 firstSquare = Vector2.Zero; | |||
r1 | int firstX = (int)firstSquare.X; | |||
int firstY = (int)firstSquare.Y; | ||||
r4 | Vector2 squareOffset = Vector2.Zero; | |||
r1 | ||||
int offsetX = (int)squareOffset.X; | ||||
int offsetY = (int)squareOffset.Y; | ||||
r12 | ||||
r1 | for (int y = 0; y < this.squaresDown; y++) | |||
{ | ||||
int rowOffset = 0; | ||||
if ((firstY + y) % 2 == 1) | ||||
rowOffset = Tile.OddRowXOffset; | ||||
r4 | for (int x = 0; x < this.squaresAcross; x++) { | |||
r1 | batch.Draw( | |||
Tile.TileSetTexture, | ||||
r4 | new Rectangle( | |||
r9 | ((x * Tile.TileStepX) - offsetX + rowOffset + baseOffsetX), | |||
((y * Tile.TileStepY) - offsetY + baseOffsetY), | ||||
Tile.TileWidth, Tile.TileHeight), | ||||
r1 | Tile.GetSourceRectangle(1), | |||
r4 | Color.White, | |||
0.0f, | ||||
Vector2.Zero, | ||||
SpriteEffects.None, | ||||
0.9f); | ||||
r11 | ||||
r1 | } | |||
r12 | }*/ | |||
r19 | //reset | |||
this.tilesDrawn = 0; | ||||
r16 | ||||
r12 | for (int y = 0; y < this.squaresDown; y++) | |||
{ | ||||
for (int x = 0; x < this.squaresAcross; x++) | ||||
{ | ||||
int screenx = (x - y) * Tile.TileSpriteWidth/2; | ||||
int screeny = (x + y) * Tile.TileSpriteHeight / 2; | ||||
r19 | if (this.cull(x, y)) { | |||
batch.Draw( | ||||
r12 | Tile.TileSetTexture, | |||
new Rectangle( | ||||
screenx, | ||||
screeny, | ||||
Tile.TileWidth, Tile.TileHeight), | ||||
Tile.GetSourceRectangle(1), | ||||
Color.White, | ||||
0.0f, | ||||
Vector2.Zero, | ||||
SpriteEffects.None, | ||||
0.9f); | ||||
r19 | ||||
this.tilesDrawn++; | ||||
} | ||||
r12 | } | |||
} | ||||
r21 | if (this.showGrid) | |||
r12 | { | |||
r21 | //need to go one extra so gridlines include the far side of the final tile: | |||
for (int y = 0; y < (this.squaresDown + 1); y++) | ||||
{ | ||||
r12 | ||||
r21 | Vector2 adjust = new Vector2(Tile.TileSpriteWidth / 2, Tile.TileSpriteHeight); //TODO figure out why this second value shouldn't be halved | |||
r12 | ||||
r21 | Line.drawLine(batch, | |||
new Vector2(((0 - y) * Tile.TileSpriteWidth / 2), (0 + y) * Tile.TileSpriteHeight / 2) + adjust, | ||||
//new Vector2(this.squaresAcross * Tile.TileSpriteWidth, (y+1) * Tile.TileSpriteHeight), | ||||
new Vector2((this.squaresAcross - (y)) * Tile.TileSpriteWidth / 2, (this.squaresAcross + (y)) * Tile.TileSpriteHeight / 2) + adjust, | ||||
Color.White, 0.8f); | ||||
r12 | ||||
r21 | } | |||
r12 | ||||
r21 | for (int x = 0; x < (this.squaresAcross + 1); x++) | |||
{ | ||||
Vector2 adjust = new Vector2(Tile.TileSpriteWidth / 2, Tile.TileSpriteHeight); //TODO figure out why this second value shouldn't be halved | ||||
r12 | ||||
r21 | Line.drawLine(batch, | |||
new Vector2(((x - 0) * Tile.TileSpriteWidth / 2), (x + 0) * Tile.TileSpriteHeight / 2) + adjust, | ||||
//new Vector2(this.squaresAcross * Tile.TileSpriteWidth, (y+1) * Tile.TileSpriteHeight), | ||||
new Vector2((x - this.squaresDown) * Tile.TileSpriteWidth / 2, (x + this.squaresDown) * Tile.TileSpriteHeight / 2) + adjust, | ||||
Color.White, 0.8f); | ||||
r12 | ||||
r21 | } | |||
r12 | } | |||
r1 | ||||
//Gridlines | ||||
//Lines going down and to the right: | ||||
r12 | /* | |||
for (int x = (int)(-this.squaresAcross/2); x < this.squaresAcross; x++) | ||||
r1 | { | |||
int rowOffset = 0; | ||||
r12 | ||||
r1 | float startX = (x * Tile.TileStepX) + baseOffsetX - (Tile.TileStepX / 2); | |||
Vector2 start = new Vector2(startX, -baseOffsetY+4); | ||||
Vector2 stop = new Vector2(startX + this.squaresAcross* Tile.TileStepX/2, | ||||
this.squaresDown*Tile.TileStepY- baseOffsetY+4); | ||||
r12 | ||||
r8 | ||||
Line.drawLine(batch, | ||||
Line.departurePoint(stop, start, this.squaresAcross * Tile.TileWidth, this.squaresDown * Tile.TileHeight), | ||||
Line.departurePoint(start, stop, this.squaresAcross * Tile.TileWidth, this.squaresDown * Tile.TileHeight), | ||||
Color.White, 0.8f); | ||||
r1 | ||||
} | ||||
//Lines going down and to the left: | ||||
r8 | for (int x = 0; x < (int)(1.5*this.squaresAcross); x++) | |||
r1 | { | |||
r12 | ||||
r1 | float startX = (x * Tile.TileStepX) + baseOffsetX - (Tile.TileStepX / 2); | |||
Vector2 start_reverse = new Vector2(startX, -baseOffsetY + 4); | ||||
Vector2 stop_reverse = new Vector2(startX + -(this.squaresAcross * Tile.TileStepX / 2), | ||||
(this.squaresDown * Tile.TileStepY) - baseOffsetY + 4); | ||||
r8 | Line.drawLine(batch, | |||
Line.departurePoint(stop_reverse, start_reverse, this.squaresAcross * Tile.TileWidth, this.squaresDown * Tile.TileHeight), | ||||
Line.departurePoint(start_reverse, stop_reverse, this.squaresAcross * Tile.TileWidth, this.squaresDown * Tile.TileHeight), | ||||
Color.White, 0.8f); | ||||
r1 | ||||
} | ||||
r12 | */ | |||
r1 | ||||
r2 | drawTileAt(4, 4, 140, 3); | |||
drawTileAt(6, 4, 141, 3); | ||||
drawTileAt(8, 4, 142, 2); | ||||
drawTileAt(10, 4, 142, 3); | ||||
r4 | ||||
r13 | drawTileAt((int)this.mouseGrid.X, (int)this.mouseGrid.Y, 2, 1, 0.85f); //between tiles and gridlines | |||
r11 | ||||
r8 | /* | |||
r4 | ||||
for (int i = 0; i< 80; i++) | ||||
{ | ||||
for (int j = 0; j < 50; j += 1) | ||||
{ | ||||
r7 | //Warning: creates a flashing effect because tree positions update every 1/60th of a second | |||
r4 | if (this.random_generator.NextDouble() > 0.75) | |||
{ | ||||
drawTileAt(i, j, 142, 2); | ||||
r8 | } | |||
r7 | ||||
if ((i + j) % 3 == 0) | ||||
{ | ||||
drawTileAt(i, j, 142, 2); | ||||
r4 | } | |||
r7 | ||||
r4 | } | |||
}//*/ | ||||
r3 | ||||
r27 | for (int i = 0; i < this.simulation.map.MapHeight; i++) | |||
r9 | { | |||
r27 | for (int j = 0; j < this.simulation.map.MapWidth; j += 1) | |||
r9 | { | |||
r27 | if (this.simulation.map.cells[i][j].hasTree) | |||
{ //until we actually simulate: | ||||
if((i+j)%8 == 0) | ||||
{ | ||||
drawTileAt(i, j, 141, 2); | ||||
} | ||||
else | ||||
{ | ||||
drawTileAt(i, j, 142, 2); | ||||
} | ||||
r21 | ||||
r9 | } | |||
} | ||||
} | ||||
r21 | drawTileAt(2, 2, 140, 2); | |||
drawTileAt(1, 1, 140, 2); | ||||
drawTileAt(3, 2, 140, 2); | ||||
r9 | ||||
r1 | batch.End(); | |||
r4 | ||||
batch.Begin(SpriteSortMode.BackToFront, | ||||
BlendState.AlphaBlend, | ||||
null, | ||||
null, | ||||
null, | ||||
null); | ||||
r16 | bool has_tree = false; | |||
r14 | if (MathUtils.Between(this.mouseGrid.X, 0, this.squaresAcross) && MathUtils.Between(this.mouseGrid.Y, 0, this.squaresAcross)) | |||
{ | ||||
r27 | has_tree = this.simulation.map.cells[(int)this.mouseGrid.X][(int)this.mouseGrid.Y].hasTree; | |||
r16 | //batch.DrawString(font, has_tree.ToString(), new Vector2(500, 33), Color.Black, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.5f); | |||
//batch.DrawString(font, has_tree.ToString(), new Vector2(499, 32), Color.White, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.49f); | ||||
r17 | } | |||
//*/ | ||||
r14 | ||||
r27 | ||||
String header_left = String.Format("${0:}|{1:} trees⚘𐂷🌳", this.simulation.money, this.simulation.map.tree_count); | ||||
String header_middle = String.Format("{0:yyyy MMMMM}", this.simulation.DateTime); | ||||
r17 | Vector2 dimensions = monoFont.MeasureString(header_middle); | |||
float middle_start = (FNAGame.width / 2) - (dimensions.X / 2); | ||||
FilledRectangle.drawFilledRectangle(batch, new Rectangle(0, 0, width, (int)dimensions.Y), Color.White, 0.51f); | ||||
batch.DrawString(monoFont, header_left, new Vector2(1, 1), Color.Black, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.5f); | ||||
batch.DrawString(monoFont, header_middle, new Vector2(middle_start, 1), Color.Black, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.5f); | ||||
r14 | ||||
r4 | batch.End(); | |||
r16 | //Calcs for debug window: | |||
if ((this.frameCounter % 15) == 0) { | ||||
past_fps.Enqueue(this.frameRate); | ||||
} | ||||
r17 | ||||
r16 | DebugInfo debugInfo = new DebugInfo | |||
{ | ||||
fps = this.frameRate, | ||||
pastFps = past_fps.ToArray(), | ||||
cameraPosition = camera.position, | ||||
drawTime = this.drawTime, | ||||
r27 | treeCount = this.simulation.map.tree_count, | |||
r16 | mouseGrid = this.mouseGrid, | |||
r19 | hasTree = has_tree, | |||
tilesDrawn = this.tilesDrawn | ||||
r16 | }; | |||
r21 | #if DEBUG | |||
r16 | //Finally, draw the debug window | |||
_imGuiRenderer.BeforeLayout(gameTime); | ||||
r17 | debugWindow.Layout(debugInfo, new Dictionary<string, string>(),ref show_another_window); | |||
r16 | ||||
r18 | String[] messages = { "Message1", "Message2" }; | |||
if (showInitial && (messageIndex < messages.Length)) | ||||
{ | ||||
ImGui.Begin("Welcome", ref showInitial); | ||||
ImGui.PushFont(debugWindow.monoFont); | ||||
ImGui.Text(messages[messageIndex]); | ||||
if(ImGui.Button("Okay")) | ||||
{ | ||||
messageIndex++; | ||||
} | ||||
ImGui.PopFont(); | ||||
} | ||||
_imGuiRenderer.AfterLayout(); | ||||
r21 | #endif | |||
r16 | ||||
r3 | stopWatch.Stop(); | |||
this.drawTime = stopWatch.Elapsed; | ||||
r1 | ||||
base.Draw(gameTime); | ||||
} | ||||
r11 | } | |||