From 1bb56adcebce3770dfd0009824fc8d52ea27f2dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Grie=C3=9Fhaber?= Date: Thu, 24 Oct 2024 16:16:43 +0200 Subject: [PATCH] Added 3D Variant, still nedds improvment --- GameOfLife.sln | 10 +- GameOfLife3D/.config/dotnet-tools.json | 36 +++++ GameOfLife3D/Content/Content.mgcb | 53 +++++++ GameOfLife3D/Content/Models/Cube.fbx | Bin 0 -> 26700 bytes GameOfLife3D/GameModel/Balancing.cs | 18 +++ GameOfLife3D/GameModel/Cell.cs | 19 +++ GameOfLife3D/GameModel/GameOfLifeModel.cs | 39 +++++ GameOfLife3D/GameModel/Map.cs | 144 +++++++++++++++++ GameOfLife3D/GameOfLife.cs | 178 ++++++++++++++++++++++ GameOfLife3D/GameOfLife3D.csproj | 22 +++ GameOfLife3D/Icon.ico | Bin 0 -> 147541 bytes GameOfLife3D/Program.cs | 3 + GameOfLife3D/app.manifest | 43 ++++++ SFMLGame/Program.cs | 45 ++---- 14 files changed, 577 insertions(+), 33 deletions(-) create mode 100644 GameOfLife3D/.config/dotnet-tools.json create mode 100644 GameOfLife3D/Content/Content.mgcb create mode 100644 GameOfLife3D/Content/Models/Cube.fbx create mode 100644 GameOfLife3D/GameModel/Balancing.cs create mode 100644 GameOfLife3D/GameModel/Cell.cs create mode 100644 GameOfLife3D/GameModel/GameOfLifeModel.cs create mode 100644 GameOfLife3D/GameModel/Map.cs create mode 100644 GameOfLife3D/GameOfLife.cs create mode 100644 GameOfLife3D/GameOfLife3D.csproj create mode 100644 GameOfLife3D/Icon.ico create mode 100644 GameOfLife3D/Program.cs create mode 100644 GameOfLife3D/app.manifest diff --git a/GameOfLife.sln b/GameOfLife.sln index dbcd493..91d17c4 100644 --- a/GameOfLife.sln +++ b/GameOfLife.sln @@ -3,9 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.11.35327.3 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GameOfLife", "GameOfLife\GameOfLife.csproj", "{82A1D4AF-7CCF-4328-8A9A-BA7EEC2889E8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GameOfLife", "GameOfLife\GameOfLife.csproj", "{82A1D4AF-7CCF-4328-8A9A-BA7EEC2889E8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SFMLGame", "SFMLGame\SFMLGame.csproj", "{0B3283B0-16CB-4E2F-B199-6155C3CB6AC0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SFMLGame", "SFMLGame\SFMLGame.csproj", "{0B3283B0-16CB-4E2F-B199-6155C3CB6AC0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GameOfLife3D", "GameOfLife3D\GameOfLife3D.csproj", "{9B25978A-4E8D-4387-8A19-356D2B6BBD0F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,6 +23,10 @@ Global {0B3283B0-16CB-4E2F-B199-6155C3CB6AC0}.Debug|Any CPU.Build.0 = Debug|Any CPU {0B3283B0-16CB-4E2F-B199-6155C3CB6AC0}.Release|Any CPU.ActiveCfg = Release|Any CPU {0B3283B0-16CB-4E2F-B199-6155C3CB6AC0}.Release|Any CPU.Build.0 = Release|Any CPU + {9B25978A-4E8D-4387-8A19-356D2B6BBD0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B25978A-4E8D-4387-8A19-356D2B6BBD0F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B25978A-4E8D-4387-8A19-356D2B6BBD0F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B25978A-4E8D-4387-8A19-356D2B6BBD0F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/GameOfLife3D/.config/dotnet-tools.json b/GameOfLife3D/.config/dotnet-tools.json new file mode 100644 index 0000000..efabe22 --- /dev/null +++ b/GameOfLife3D/.config/dotnet-tools.json @@ -0,0 +1,36 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-mgcb": { + "version": "3.8.1.303", + "commands": [ + "mgcb" + ] + }, + "dotnet-mgcb-editor": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor" + ] + }, + "dotnet-mgcb-editor-linux": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-linux" + ] + }, + "dotnet-mgcb-editor-windows": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-windows" + ] + }, + "dotnet-mgcb-editor-mac": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-mac" + ] + } + } +} \ No newline at end of file diff --git a/GameOfLife3D/Content/Content.mgcb b/GameOfLife3D/Content/Content.mgcb new file mode 100644 index 0000000..c0f6a3f --- /dev/null +++ b/GameOfLife3D/Content/Content.mgcb @@ -0,0 +1,53 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin/$(Platform) +/intermediateDir:obj/$(Platform) +/platform:Windows +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + +#begin Models/Cube.fbx +/importer:FbxImporter +/processor:ModelProcessor +/processorParam:ColorKeyColor=0,0,0,0 +/processorParam:ColorKeyEnabled=True +/processorParam:DefaultEffect=BasicEffect +/processorParam:GenerateMipmaps=True +/processorParam:GenerateTangentFrames=False +/processorParam:PremultiplyTextureAlpha=True +/processorParam:PremultiplyVertexColors=True +/processorParam:ResizeTexturesToPowerOfTwo=False +/processorParam:RotationX=0 +/processorParam:RotationY=0 +/processorParam:RotationZ=0 +/processorParam:Scale=1 +/processorParam:SwapWindingOrder=False +/processorParam:TextureFormat=Compressed +/build:Models/Cube.fbx + +#begin Models/Cube.fbx +/importer:FbxImporter +/processor:ModelProcessor +/processorParam:ColorKeyColor=0,0,0,0 +/processorParam:ColorKeyEnabled=True +/processorParam:DefaultEffect=BasicEffect +/processorParam:GenerateMipmaps=True +/processorParam:GenerateTangentFrames=False +/processorParam:PremultiplyTextureAlpha=True +/processorParam:PremultiplyVertexColors=True +/processorParam:ResizeTexturesToPowerOfTwo=False +/processorParam:RotationX=0 +/processorParam:RotationY=0 +/processorParam:RotationZ=0 +/processorParam:Scale=1 +/processorParam:SwapWindingOrder=False +/processorParam:TextureFormat=Compressed +/build:Models/Cube.fbx + diff --git a/GameOfLife3D/Content/Models/Cube.fbx b/GameOfLife3D/Content/Models/Cube.fbx new file mode 100644 index 0000000000000000000000000000000000000000..cf7b8dbbd5aba5a727ff3919884fe4a35731c036 GIT binary patch literal 26700 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 Vm;LtbUtjZwS7*FXzU|cM{|96P+wlMZ literal 0 HcmV?d00001 diff --git a/GameOfLife3D/GameModel/Balancing.cs b/GameOfLife3D/GameModel/Balancing.cs new file mode 100644 index 0000000..8f0c76e --- /dev/null +++ b/GameOfLife3D/GameModel/Balancing.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GameOfLife3D.GameModel +{ + //Max Val is 27 + internal static class Balancing + { + public static readonly int MIN_ALIVE = 6; + public static readonly int MAX_ALIVE = 11; + public static readonly int CREATE_MIN = 8; + public static readonly int CREATE_MAX = 9; + + } +} diff --git a/GameOfLife3D/GameModel/Cell.cs b/GameOfLife3D/GameModel/Cell.cs new file mode 100644 index 0000000..6a68617 --- /dev/null +++ b/GameOfLife3D/GameModel/Cell.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GameOfLife3D.GameModel +{ + internal struct Cell + { + public bool isAlive; + public int X, Y, Z; + + public override string ToString() + { + return $"{X}:{Y}:{Z}::{isAlive}"; + } + } +} diff --git a/GameOfLife3D/GameModel/GameOfLifeModel.cs b/GameOfLife3D/GameModel/GameOfLifeModel.cs new file mode 100644 index 0000000..cf19063 --- /dev/null +++ b/GameOfLife3D/GameModel/GameOfLifeModel.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GameOfLife3D.GameModel +{ + internal class GameOfLifeModel + { + private int X_DIM,Y_DIM,Z_DIM; + public GameOfLifeModel(int SizeX,int SizeY,int SizeZ) { + Map = new(SizeX,SizeY,SizeZ); + X_DIM = SizeX; + Y_DIM = SizeY; + Z_DIM = SizeZ; + } + + public GameOfLifeModel(int Size) + { + Map = new(Size); + X_DIM = Size; + Y_DIM = Size; + Z_DIM = Size; + } + private GameOfLifeModel() { } + + public Map Map { get; init; } + + + + + + public void Update() + { + Map.Update(); + } + } +} diff --git a/GameOfLife3D/GameModel/Map.cs b/GameOfLife3D/GameModel/Map.cs new file mode 100644 index 0000000..3c027db --- /dev/null +++ b/GameOfLife3D/GameModel/Map.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace GameOfLife3D.GameModel +{ + internal class Map + { + private Cell[,,] _Cells; + private int _SizeX, _SizeY, _SizeZ; + + public Cell[,,] Cells => _Cells; + public int AliveCell => GetAliveCells(); + + public Map SwapMap; + + + + public Map(int XSize, int YSize, int ZSize) + { + _Cells = new Cell[XSize, YSize, ZSize]; + StoreDimensions(XSize, YSize, ZSize); + InitializeCells(); + } + + private void StoreDimensions(int xSize, int ySize, int zSize) + { + _SizeX = xSize; + _SizeY = ySize; + _SizeZ = zSize; + } + + public Map(int Size) + { + _Cells = new Cell[Size, Size, Size]; + StoreDimensions(Size, Size, Size); + InitializeCells(); + } + + public void Update() + { + if (SwapMap == null) + { + SwapMap = new(_SizeX, _SizeY, _SizeZ); + } + foreach (var cell in _Cells) + { + SwapMap.GetCell(cell.X, cell.Y, cell.Z).isAlive = GetNewState(GetAliveCount(cell), cell.isAlive); + } + this.CloneFrom(SwapMap); + } + + private static bool GetNewState(int value, bool CurrentCellState) + { + if (value < Balancing.MIN_ALIVE) + return false; + if (value >= Balancing.MIN_ALIVE && value < Balancing.CREATE_MIN) + return CurrentCellState; + if (value >= Balancing.CREATE_MIN && value < Balancing.CREATE_MAX) + return true; + if (value > Balancing.CREATE_MAX && value < Balancing.MAX_ALIVE) + return CurrentCellState; + return false; + } + + private int GetAliveCount(Cell cell) + { + int AliveCount = 0; + for (int i = -1; i <= 1; i++) + { + for (int j = -1; j <= 1; j++) + { + for (int k = -1; k <= 1; k++) + { + AliveCount += GetCell(cell.X + i, cell.Y + j, cell.Z + k).isAlive ? 1 : 0; + if (AliveCount > Balancing.MAX_ALIVE) + { return AliveCount; } + } + } + } + return AliveCount; + } + + private void CloneFrom(Map source) + { + this._Cells = source.Cells; + } + + private void InitializeCells() + { + for (int i = 0; i < _Cells.GetLength(0); i++) + { + for (int j = 0; j < _Cells.GetLength(1); j++) + { + for (int k = 0; k < _Cells.GetLength(2); k++) + { + _Cells[i, j, k].X = i; + _Cells[i, j, k].Y = j; + _Cells[i, j, k].Z = k; + } + } + } + } + public ref Cell GetCell(int x, int y, int z) + { + //Clamp Values to Bound + x = Math.Clamp(x, 0, _SizeX-1); + y = Math.Clamp(y, 0, _SizeY-1); + z = Math.Clamp(z, 0, _SizeZ-1); + return ref _Cells[x, y, z]; + } + + private int GetAliveCells() + { + int aliveCount = 0; + foreach (Cell cell in _Cells) + { + aliveCount += cell.isAlive ? 1 : 0; + } + return aliveCount; + } + + public void SetRandom(int mod = 2) + { + for (int i = 0; i < _Cells.GetLength(0); i++) + { + for (int j = 0; j < _Cells.GetLength(1); j++) + { + for (int k = 0; k < _Cells.GetLength(2); k++) + { + + _Cells[i, j, k].isAlive = Random.Shared.Next() % mod == 0; + //_Cells[i, j, k].isAlive = true; + + } + } + } + } + } +} diff --git a/GameOfLife3D/GameOfLife.cs b/GameOfLife3D/GameOfLife.cs new file mode 100644 index 0000000..fb43920 --- /dev/null +++ b/GameOfLife3D/GameOfLife.cs @@ -0,0 +1,178 @@ +using GameOfLife3D.GameModel; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using System; + +namespace GameOfLife3D +{ + public class GameOfLife : Game + { + private GraphicsDeviceManager _graphics; + private SpriteBatch _spriteBatch; + private GameOfLifeModel _gameOfLife; + private bool paused= false; + private Model model; + + Vector3 CameraTarget, CameraPosition; + Matrix ProjectionMatrix, ViewMatrix, WorldMatrix; + private bool orbit = false; + Matrix TranslationMatrix; + int tickcount = 0; + public GameOfLife() + { + _graphics = new GraphicsDeviceManager(this); + + _graphics.PreferredBackBufferWidth = 1920; + _graphics.PreferredBackBufferHeight = 1080; + + Content.RootDirectory = "Content"; + IsMouseVisible = true; + } + + protected override void Initialize() + { + // TODO: Add your initialization logic here + _gameOfLife = new(16); + _gameOfLife.Map.SetRandom(2); + model = Content.Load("Models/Cube"); + + CameraTarget = new(0f,0f,0f); + CameraPosition = new(0f, 0f, -30f); + + ProjectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(60f), _graphics.GraphicsDevice.Viewport.AspectRatio, 1f, 1000f); + + ViewMatrix = Matrix.CreateLookAt(CameraPosition, CameraTarget,new Vector3(0f,1f,0f)); + + WorldMatrix = Matrix.CreateWorld(CameraTarget, Vector3.Forward, Vector3.Up); + + TranslationMatrix = Matrix.CreateTranslation(new Vector3(0f, 0f, 0f)); + + + base.Initialize(); + } + + protected override void LoadContent() + { + _spriteBatch = new SpriteBatch(GraphicsDevice); + + // TODO: use this.Content to load your game content here + } + + protected override void Update(GameTime gameTime) + { + if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) + Exit(); + + if(Keyboard.GetState().IsKeyDown(Keys.P)) + { + paused = !paused; + } + + + if (Keyboard.GetState().IsKeyDown(Keys.Left)) + { + CameraPosition.X -= 0.1f; + CameraTarget.X -= 0.1f; + } + if (Keyboard.GetState().IsKeyDown(Keys.Right)) + { + CameraPosition.X += 0.1f; + CameraTarget.X += 0.1f; + } + if (Keyboard.GetState().IsKeyDown(Keys.Up)) + { + CameraPosition.Y -= 0.1f; + CameraTarget.Y -= 0.1f; + } + if (Keyboard.GetState().IsKeyDown(Keys.Down)) + { + CameraPosition.Y += 0.1f; + CameraTarget.Y += 0.1f; + } + if (Keyboard.GetState().IsKeyDown(Keys.OemPlus)) + { + CameraPosition.Z += 0.1f; + } + if (Keyboard.GetState().IsKeyDown(Keys.OemMinus)) + { + CameraPosition.Z -= 0.1f; + } + if (Keyboard.GetState().IsKeyDown(Keys.Space)) + { + orbit = !orbit; + } + + + if (orbit) + { + Matrix rotationMatrix = Matrix.CreateRotationY( + MathHelper.ToRadians(1f)); + CameraPosition = Vector3.Transform(CameraPosition, + rotationMatrix); + } + ViewMatrix = Matrix.CreateLookAt(CameraPosition, CameraTarget, + Vector3.Up); + + + TranslationMatrix = Matrix.CreateTranslation( + new Vector3( + 0f, + 0f, + (float)Math.Sin(gameTime.ElapsedGameTime.TotalMilliseconds)*10f)); + //WorldMatrix.Translation = TranslationMatrix.Translation; + + tickcount++; + + if (!paused) + { + if (tickcount % 20 == 0) + { + _gameOfLife.Update(); + } + } + // TODO: Add your update logic here + + base.Update(gameTime); + + } + + protected override void Draw(GameTime gameTime) + { + GraphicsDevice.Clear(Color.Black); + foreach (var cell in _gameOfLife.Map.Cells) + { + + foreach (ModelMesh mesh in model.Meshes) + { + foreach (BasicEffect effect in mesh.Effects) + { + + effect.EnableDefaultLighting(); + effect.AmbientLightColor = cell.isAlive ? Color.AliceBlue.ToVector3() : Color.Green.ToVector3(); + effect.View = ViewMatrix; + effect.World = Matrix.CreateTranslation(cell.X*2.1f, cell.Y*2.1f, cell.Z * 2.1f); + effect.Projection = ProjectionMatrix; + + } + + if (cell.isAlive) + { + mesh.Draw(); + } + } + + //model.Draw(WorldMatrix * Matrix.CreateTranslation(new Vector3(cell.X, cell.Y, cell.Z)), ViewMatrix, ProjectionMatrix); + } + + // TODO: Add your drawing code here + + base.Draw(gameTime); + } + + protected void GeneratorCubeModel() + { + + } + } +} diff --git a/GameOfLife3D/GameOfLife3D.csproj b/GameOfLife3D/GameOfLife3D.csproj new file mode 100644 index 0000000..7869798 --- /dev/null +++ b/GameOfLife3D/GameOfLife3D.csproj @@ -0,0 +1,22 @@ + + + WinExe + net6.0-windows + Major + false + false + true + + + app.manifest + Icon.ico + + + + + + + + + + \ No newline at end of file diff --git a/GameOfLife3D/Icon.ico b/GameOfLife3D/Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7d9dec18704053ee43cd7c956022ddbdb34d8de1 GIT binary patch literal 147541 zcmeGl2|QHY_o31*DkNL0ilkjLBkemP*sNDHl0|CFz!@@Z9>Xho|^ zX)(&oghZPy%>SM@9z%l}GjCAu{C;oVGIu%KJ@?!l!{o4r7=Rq6i}`C}*jDuH?#_Sj z(ohc5(!wx%d;WXyUJM)FNe&w{sQCXO7?yEW4l^<;{=XB3wJty@=@!4Yz_1(bYu7&fPuJk|nzhy3Q(L-FbInCE!&koEwT+Nz3QDC=VaTw4ZBvK3)IcJncsYp*{AE`PBW!L95G))yFul z?-lXE>GGkuvm7^!8Eg5kO`8KcYn3~kT{rcB*41tf3mQ(_$ow+s`gZsB5p?cbUK`a+ z`Ct9!apHIbdPgqFJ8)o*OST*5@OS#-<p*PFK#mSvsSY!GY0>*?L8*+c77CPyq^ zCT{lK<=XN4?8ECWe>}f_dZ(0MI*T2O)JJlZ9kk`vX68qPZtJh5q_r!r!}n<35|8WW z%rg97OhCw^urtQU36TO}q9-UB7zw675d(-VV88jUEVAImQ2I{}I6|S;V zJHsBkVXEpiwT|;uZ*Tm(mNRzzlf^{?ls(OLJLz-kHG28KIh{m&V!{$F%wlxxhYJP$3YNw# zw?1dLXX_+A`(X=P4D6V6ug$k_t?nhoyqWD;kYI4uYh=0|Jg9y+PMd&rLm z=8D|W#{>0x8+Nzxx#D70=u4Y3bQ^Eq(fo@G*K2F+yOVU$sd4jkC%be!tx{UY>Ks}1(Cz5IL~uSVWfSUzH)msw)peeJ{a zV-I?cV%x1VpIqP*8*6egz0u%^@MhY6sS#_f8u%Q_=)UFtu2~NcjyP{($!=%M>=gi=|`wP@s4m%;wbQ-d5<*7be&59;Y*FI-w5p;ht_gqhpHc{Ue&zRMqn~Gf4x7E*; zbhiE*aI0yoORGtK`gZajHb;!VsK40JJ(0cQ^2tU+- zEsq`%H*nU4@DB#_R$?m_eKqagPe z4O32>v7@hT$llD9^k?mJJs)y+?7YXjADhp&nBCesZB4H2&?dbSw*)tEU!|G0 z%wws?!fT-^szKKoN;!8wT)F=IfA#Iw<}BHBwYS;YgQq={X6>n8>(O(S`&7&HH?H#CVQ>bw9RM0=&;}inb_uM+8 z;bz+jJ2AlZromy;-SwS%?2Mc-yP$XDbECpp-m^Az^}ibww&Ly9G=|6HZefPkJEcd> z3wo1nAH;JRuE3=0TzD}cZttlnR%?bh9pTRMzHF9%q{&y88JSKd&DS0rd?mqn|8cwJ z&91FnA>TXBln$AkIZg6 zhHgvx(I-STwabo=p>bvvZPpSqD)0b>k#fl~mPdrrgpo>Rzep@Sz%UN!t9>?)ar!F`X z60~Pk_{*5?dofmwh1KL^TL!&WU@pmCdvbi2DI1P|d%b{hc=DGogQhARJs+*KdeeIJ z?R!q6`;FI58?dUWUw5ov==!27Id9)svagoIk+AU43@Vw z&<@v|z&4&5oPuRpWInw3p=UtyNUH%wZ9F_19JWkzjP9g3C{#H~?s10RGiRsv9_ReN z$#tsl?lviqQ83|`jqd50YI~Qpp2@2YAN)saet0nUN#okD`mSsCXV+`_bg|z;?M?slYP0NmFm}K1hqm9GZ)97k zSe{!v$|39G#+$B8Iabnzd+E2mt~)CF-Y7Wav)|ZTfthx~8tqHQhKY6_SC$%CO;_>{)ajB*f2(kp-drVd zc!Em8aC6o7cbpr~yWYKbgSICkBOZKxl1dBqPZ*lQ{ngILBjxLO*Cgd{#zP_&cfUJ) z!HP@Hjd+htGgBWf+IhvIXy$2`r~5wS@9d~#5fgv4r-$B%Ia#~A+Rhx{T!eL1X>sbo zrhcPUZ~wPCW`%2O^Q9}Z)*hJp-J!nQ@mF$24s#Fo-D%t_^8rKtkzXgC)u~OZ?!D|B zZ%RLKYj{M_y30N6-+8JhTKXJjyqg&Dsqy@MJy?obJqsLob3?i%Y#ZbLMK5sev3j@E z<{UGzUfceE<8DSLq|gg)8ZaYw)nC2n>cCZVTHbxm{_2?bw#WV01{tX#?w8XOebw^} z`mN+8FP3}acem5Cb=RC&fo)BS0xUnySou|pQ$t{?W|TENhgY7e^i z$y}m-)}1e2!GtibeM>(o!KY0&$0;dcKOHmCG#oLA)pW~gFUTLtXyadULUt6jPJ zzv8^j*QLAHe>Lr2(=?q4cJZELzc=WgrTTXL_a%1P-<=DCjlX=(?DKNjw4QPv=^w6W zycv1zbV8B#kmTb7eD8F9=N3K@3o&c=`iuRfN!dGX4Pxl~RaRu(UY5%p){$mX;Ir9GmE-$;Cq#W%)nu8YZ3nYQJkI$AZ}Ot2j`sf?snY#Q*Emkm zpu7$}3DRKJHiwdoQ`*LC6h0x?W%sv(ZI@*}q2G; z*Wy=Z&zePCYJr_~WPDIxH!LEUX&ds{dFlL47Mab)9@F1-SN?#Go?nsUWY@(j8t81F z74J4>OZ-+X$A5>f4jGpaovAU+$aSrn?v~b;0sD*Yns{kA`X1@po0F5ca_^pypYuBP zUTqcOz3ksjUwcg%<>eYO_2uT7Yg4{%b?G}ePhsfw3(6m(uAjE>=+irJ&$f>j)4S~1 z5_W!4Yvn92?9xp{Iu8Aw_eMr{WGd6j#@fGU`KV669YqqMP zZxFY~_O%Uc_x+RYfswueTW^M+{5t0zD*}Sg^7B0#7kyW!W6w?B487azxzi+Z<>ukn z3zSnJ#D_f6c_>S45r3g-KE zmF12unJ4zWe0}lR7%zv6JG)%_jP2}l&_!$b@(Yi`PhNQ1^A$1!*xdUs*{T`sqf}GZ z_Q_sqacx2Sv*G&enI~Pe?kqF8p1Mlzxa;Ce+q@i-51zFf@#@4Dm($@-0-l6+XyFmx z@_UDAYn3~mI29BA{*>Lw7EhbGXDEyw7;HD}6*!umCttC2`k}sVki71}i)!s+&W7J_ z;Le>nAuQ;c;r`UoZyp%G&0Y1tQ}^+$+?4n&z9&ylv(cE>rsa|3hu6FoVxwN18l%SQ zn$auD&ne0{<-)iK??JPSjh^mcC(hYyHVr#9stId!25pl)X6-F!Z`#1UK?C))O;OOC3D;!J4L6Y)`DqIO--I3of2q>dv?xY^V71*3h?0&-=Ty z8Ek}YAG3Gt$5!f$e^C)@iXB(!iS;qU?yEG#nl;73>M0D`2xY2%WJ0J%aQB`6?YPB2 zrDFR+Y-*!zWJ zCmj3TC7&28{*90T8^*t-R-k?1$ZHB2}4^=Qdrvzo@gm}LZUOh)4d(7PWw9V&v z1)3cue2{yTHo|eZLi9zauGd_Yrp6zPvb}f90U7)I5yo@JsrHzkF!-X=q{bufX%!1irU1xMV~V&VrRUaXg#|4!ZG!fej$AeZh|Ya9D7Xlvk) z8KFP=+zBzCy(wha*G@v9jTM~^bp0xjk)^>@*- zq9;z+zgV+ie1tcuvd1|r9n=mx(c}B}*;&dN2ge-P-&}2*_Ib?a;@D$pmuJa0NEl$P z!QOc?J$Y5L?)z;UVyUrjJ6eRkG(6o=`{sf9w^k<38UHgjC@5)(^I7B6a^E^P&TN5?&6Ss{2Iqk*vp|hA{zlBea@Y}uGcx1o*%bUoZPph|M zd$TAS%AGUoDd*TIt#4f}Ir`U6}J3Amcf0fS+j>gx2 z7@8;TtpBxTJ=)sTFh11dw1rcLFV5~`k=l54@@(21_rTnG002&+M!H$l?-fO5(-wKQ0C>4V{;D zG(^YSr8^sZLI;Jsw!FLuejne)X5JoGTsF=*c)xk0jZNCfTm2KdkEa&KNpMV<(7b4k zW#+8g8>TMIo{_nt`EtW8r#gN-J$F~LRlls|;$LeW)h(DC$#^@dyG@b2+C$IJycyTS zmt%cCczw$<$cqJJl!J?pnC&e7C46 z{eM2XbNsqTSB8aq{siMknX}CMYNox}=k_zC5AWWn?~#k{J$A8q8q_)~oH6dXVZV+= z^@mvjMBiz5#RfGxmwNV`-;q>9wZwk)jZ&ix6`q;{Ri|L?<03%oJlO=5#=u`Awlai7ekXV0P(Uwu~N3Y^O zGWQ5vHr_WeY(e{MpS8KG993s@(;qw`BB1f=h)^w0-^a5i=ICU@oaJRZqz#u z?gEQe%FSNA_H3%1nrWsmu;rK`te&p9=d-PpEhCF`^?7X+Tt6}uba&=l)t(;gr|hx) zv~T+HiPzFIE#{tIt((~+&33+H{kOVG*Yg_q-dMc%Ebphn`sJ2#b2Q|X>&xp&cKh5)v#?t=^J~Ykn z?0h_fVSn<+uXCt7M!r7u9Zpt?+O$Bk|IRMUYz;JSG;0|*WJRlAXEq-CdS-&L)dtsN zAMJZ&r0SiX6zX-^A>HlmegnS-d4;?4zg~CPKWeIue}3~}59r@I)?2*KBJZEksHADZ&OV4|n9`WIkO2?-quUXx`&Am2-N79o5!!%=TpuMo7y?&s} zm29=4RzDfnznN?Pt8nPTh37uq-drfKZF%>qtAVq-<+Y^dmOqzm>}%e%rOHF=>E4g^ z(;qMvb=Axqu-bNreQ?a>p;mVs*hvnyhXdk1U_r|*}Z@EyJ%;5}&v|oDuhNpxp5fdFwa0?ti|kQKq5Yu^CSjE+U((t);7B?6xFw zY0s;N=>=;h_>NsuICS%;+l&CcL47do>4Rg^0R(WzYu@ZfI)Hg-d4^#CN~?F#wZw&IdjaD^t`b_w9r7)u-_n`NbQ6ewdJjs3>@;}ex&2JA3x{aY&<4c^3B_&ECPb^V^h54ibHpY6OQBzN+A+k`|cE05bOWa(F( z>Dn_qJPI$Sx6?3E(>H6Hq|RpD+s6o;BUe$i-G zC8trI zFVNW7h2|%074=-Ty;m?a?+o>_V$IwauFh-!?!LdK+T)b;U5n=5rDcS5J2qGTs9uq7 zClC74{qu~>Z*I>S6S+9VpyB9`_M5M38`^m)hYmh6`@E0KSt~|D^dXfWS}H%%=Zw8M zn3K82G3N4vg7tROc|)gdi@kjJ!ifnUOJ05AVcs_yb+me8G!P9qVxxzf4+|Y)zo`p) zc83pWG!lj@aX>?&wE|31v@jFSM2ybeh%q?97@hq9J%7X)+-!95{_rasrxj?%X-7N& zUI0)2R51R~2+7zI(R&!lHu(>iuO#}5c!PKZyaJxpb)d0L5G{cijs1g?xtMm1&$FY5 zcP4d94S4cM*4D_zJ)&eTrpzm<`}n-H#xTU&+6;8g1SI#Dl-#8x_wxDxyagWDHlU^G zAv=GAk~>Lq|4k1NuLrQf#jjyN_K411jnTNdlj2n%s@zM`uPfuYxQ&)hU4Z*~RDEBz zeANMa13sFhJ|W)5qx}3jCwsylfHqpS+lHubhic!;*lv?xS3ri<=_7)^B|?v=d)?Lp zyq{2vMgjEaQ+>L1Tjqjg7Gw!B6&0wloIgkQgdTuQMFD)C4hi)Tfd_T3Io$%;Rtord z9yNadr|KxoAE?Y1gn2uED(w_qgxx{&h$;XY_aP$g<5x=WfO(@f2#1 z+qE-m;0f?XR(3$JEy!P&Ba1p{QSD@YEy9YyT_hVFK*?iGt521ipvhW9pb-1L;ANjVFuP3_fiIBiEvfBkEYp_XdhtjzR36iM0 zm>dA!ky$p0_4nlF@%Ogx#T55%!3S^+NR>aa_X271NBw#fNX7vg=P7AAP`d91S#7@^ zk`YhEMzTl!;w072r0=90Ai|4&d9-8w1Ymd&= zMEN)V&=&1=ZA4un@_4$-6wYl>Ezc zj|{7I|RsQO9XdeS|BCIDsQ*y*UsO)={88Gn2J+8;Bk>Ht8aV%v z!HpwN{wQr(1KH<4^3MPztIm+^`LErcH$bu{QJ+!TkcTXR?DJpY3}CV9Kyl`a%J}?e zI(HCxv=q}#;|`Xk_%R0JAzAXlWzPvFEq%b7&XwKy?{v-~Qfa~IL3zjufOllc9#0p^ zp3dD!Y94g%L7A}2l-&x^@sm_q__D~xATL<}@QzIRgX~Q>6G_d3!Oq79u)C1XE;?s7 zxpWBBdyp5|06YWUktu(Wy-A7|sd)hYG%gdH#8V)RWejeAjK(e?oen}4{Ji>;Mi1}` zct+$$)*WOIz~Cm6o)?|FnG}98IIS@{JBf7s%gX@I6Xi_?0I$mDC;j*264V)-!!pPZ z+L((<@|4B{BUu@xNoIS$s&+BT8{r^L03JzS)C_TPso!;a-V~)uQJ28LfI2O zA>e{=!VqrN0pNu!>U)9?kTu9$5a{ec+42+lwlwYmk^2WmB`PBPtkLyYws;aU7U>SS zSz~~!C;;ty-~riwJ|TDF4zex}bT*^r_=@*&?Ld89wix}BF-A}Af$!gF!XAlmT8zF2 zBR*x;9DX9nzO;_TamD-97GppI>_-VS0d4&Le4v%Qemz3Y72QGB!hptoSZ8=#5pC4> zQau#L3y^U|z_+iJ#}}3+^{p=P%(^1+VGM^j8>Xr1s9%^%=|COT0gxTYP!fPXD;hV4(t$dr10XYyoiu>Ku|j>+ zg_I7|6&(OsA(=@NOg=eK@~s52kSyg-x=YQy1uDxSMKM|i+W4(FxMJ5TtLLAwwClcS*0I$XE z&lj0^2?D~L(%LeA0M=;GIRU7iZ(D7OATFdK%e5ty*&X1m;Jn>x6Gmo47&kz3AZuza z8Q$-O)@T~1c9a^GkQS^ht*LeopOeCqH124hbbK>AA zPFQ@c5#+&*A)OxJ8St*6xtikOUDILl_7$u#!Pgl{Ypq!}M&n%P*V8GTWlkak^7XJmI@qcGu!&pwFX z^HIB#F7tgjDq{z}?+C&P#|_~KxB|`$?q?x(A{(cb*n5FkgH5c(tSlcA{^Rj@xkR!$ z=mmj0@h*qI77?!)<^~_KO5c^>omKj-2=DHt?~s5%bUcBA(!VjxR3LZwu2Uv?3_}^P z1jC~Yn1b&LWwOICl%e3?sKP9hJwl*N_6ULU?#NPxjW$<2xt0+I}9RyblGT=uU5tqK8Cxn9x-jTdPtN8?@2kKoiey}hMY;g%c z%e=ecMiu>ETK<{1l_`EV#f>boI>q)v2RE|Fw1O>k$L$MxKx%>B!Tu=m6LKT$kpe%W zDVS>bUyfg#m7r#jL*Fnr_`wu#dxt;5D<2eC#1sFnSk-$OOM!4HZ?DV0m$&!j--~%b zVBuE2J`t?mfVAK0qcR91CYM1FDLEe@;0pr8T0R1bEO-S|%|}3qAI*(dT*2w!(V#x% z;UV4dU?5{W1N4VGijLO|@DKU}g1N!}@Q*2;4;~#bz#rTpcOGoaVvjB+y5ulj^owM? z7r&AG!;`}Xa1D?zCfeP1><5sGab=h6YW{pQ-Q%* zK+R!Avcc!^B3_WW50jwH8^GyXV|~D4+lvZxmyC3vFBf=28i0-GtU&Vq_1D=NQRM}^ z0Uk-ao*vF^g6vHg#dlH56XF%{Od5dC<&r_ayr?=>cfz5u3<>u!!^cIab>r18_xPB3 zHD!R?97^x2&HK`F8Y8|fLUk==@1@u_NA-a?bu!f9rSg*^9-`J?e_%M=FA||b#{GNB z$CSGMfp1z>`v7m(*66;Me|lMqtF)aAeF~J_Az23ykA(sBBT;LTN#;GO*MP^u`s|=D zkJ5ee`42n>UY7yr+aaqD8Lb_oac?8p?!fak;o4)h`Qq#04nEE#tw{u43;LrBjwuPc zkLEmawqvw(jWVLHOD}*s&>+2ea02BE@tgo@?^8}=-$y#$j!3@F-+>mONvif4jiccJ zZCz=O8KSnHsQcvBCBfkP6ic%Y81Woz5R5BJORk_Je~9;gOWKS)#kZ?+)zFBw*bFR7NEV_{3GV)NSGG*n046C5m#?;zepOs zDLWFCB{a{d+VbPe4gCAR4ft&u3H287UOMyAWP2WJZICscyHjGll@9NPw5MwWgGk1q zHucv)f5P7eK(nNFTUzlc{!3a9NEV+g{?j?SrtFR2dI<@l8TQ~F<*^;c5dDgCGPUs4^a%ke4wr}V!r>#wA^ zQ~FQozoa@;m*Z3V|A*>7*9^@MaQ>q&X_Py%^#5-dQ>OS|vr?w`Pw~HIIZ(5?Q~FQw zzh*g5v$@x1{fF}w=v;S+E=Yq6prsf|gcm_qZRWo;=3hY?WB~Zw(%_vm(jd$Kr}!^g zyPD#^Xnc}}t_w?p;y=ZIVR`}IDEnXi+K;mTqLnMk{)on>ipr>@-zol6{I5udDEm*@ z|B7@&THh)AL)o8-bcwP*)we$k&IQT)SWp^d0F?QPWG?IPzwKuxC4w2;C@IhwB_(Xi zCL^u&*V0)7PtN`W3@%Fw{AZPAoRr>RKRZeFyyTppTDbp)Nm?6;=_B|9X-ONTwf_bK z-vdR$`kRFPXQWlWK?c&ckJ8OW4S^!6W4DzTBkhT9L;8Gj*Up4t;f%g3ULL%?^GJrfFFL8j>{a11R zo034cX!{S-KN;7|Stn>ORmi(Ckk$UfV1s0{|2CY7Iuq>^x)O~G9zu5SEeUcbY>kL_ zgahCLI00^ae?+$XZ-Wj<&kqujZfW?ubu8s{MhAk=fMij6t{ZW_Rk?G1*!jg{jcASunxDx(%f=crO;slgtCDmf5B|Dt zbbby#zchi53&M$zP0748b|m`dkMMKCX(EB=JYE(bH6)zYg3?`Q=6jZuk%A82*eaxgwN2B_6JO3UE^d zodjJ)HwDmDcf=120pbNb6ClSVo=`Z!XIANVMZssmGKKOdpiH^L+0OsRv{X-#Jc!V! zEaT<@#{`upCi(-<9hE1@K#_%hP#J;@@RW7R#Z(;eB@%f&ttniD~SFH(7$*?8VK4hR>hJIVAFVXiNovjyeD zt^ry_^W6Y9z)_m>l6$ioBbw29+uWSmOLsZl!*NA81MZRl?b856voz-FizvTxbX2bY zqNK^ffQIUT$tQHNrcTv-OZ1#l9V4rnt$J5HQpEd`a$1nE8u<6B9?!k8QRV?_Ir`#5B@_tQji60XxDQeb>1S}Bh-_!Xk_lO~3QJc4`BU^$ z@~^deElk&ieWUch+UB1s|5W*>%DAx85UrPTe{jVkmDEq&Q#Bqk|kAKlPi6Y|#VXF(`kAI0X z23WoEPg7n!vE~=S{2Yi=9T0c?Qx@ajCfp$+%bxH@A&$6Eo$+s&13=^{%Dp=CA873V z#L5HkfH>kpb>=^iJ^zKqogy~vgd8BQs8HScFE9s)$WPR}sPms_pUhF(;@Fq+ZP9Er zU)8)y7DzJxNs{?*49;4i^I_<0Z8WdyAex_7BsOnmTXdTbN0TR!Mg74BsTB_4oMIU;juT$6x=tO)7dylZkEH8g2_C>*qV>=0=Sa4TMA}mZ_ML&S3_MQx_COWyB&>fHwkp843PE4-Z9k4QPKL{$6=rNbm0;oh7eMgS7d1puAwuK1ue)1H3uY5x%d` zRfT;a?f+Le4&u@Q=cn-bP*Zr9%@=S1oJ0XScM!5^nKj7svbYnn2b=)6%7Bl1Zmq+; zl!n|2X~56isfBzea3}5{hu?GwFRNf%gv+kBeTVWOSf=@Qrf%R)@Dgyw0r6fO8;Sd% zuvaAP11I9VpQ^&)`?{et#cMOZ!exNBwM5bz+?{~r{s9g8yoaIu*Pn5(U&)@MaizmO1t=yjhovevH zGa=8a%R}Y35OuM4hnzC zb2nF6mZXWlDE=FS5fz~9RfS(w|BF+8Dg4VyhT^~U{Rdg=KeXXQ1!?QQG}@2Qh87j* zZ09QN1%we5L~FlS-UlI0{|SS8x=Q>Zj3^*#|A|QBET~VfDu6z1k@jswdprKt|1BhO z=&P*SwnLw}JJ~v0{p!3&6>PH2CItGI{6@fVYhZ6PQLf`eLVQ5U`r5L#L+XHwU z6j!hxzdHT55TC(C=c0(nJG@U1m1#Qr1{(M0h#aq?^dSvM3(9KM{e^;Up@b6J>-6{q zC}ABRKLQf!^!ObRfS@jqpYkanXpqwQHD@atb3&JhwxP0cqKsb?G=MINRIgQl7tB?o zb0!eU;m?xHUjtl3sq;!Qga^D#i#dOT{SEPZyU;TS;jBUYKL}F+-M@dY-u#X7bnxpq zVyvvxU*gvVaK;$gKjza^k&}eSpjg z(gU>r2K$+4zGp>xk9<-*4U`t7Sry>tc5?qGMmZAnJF0%BL)sOb8)}@|5tZXNq~%>= z15h52mmu(Mhz#;3se-YN3S6@(6Vm(7#{@mo!GX=}$Rb0jd^DTK^BvxLP1;%kGNw<{O6_sz` zn&H9l%wsupWc|gh6HXFJG61=pb5CB@E~s&kFO0 z|AaxM{s(Fs2rYxqc0lKf6MhJ+O%rAB4G2T5V}rPmM#cT-KKOboq4^ivMZVtx{jj3U zTP64iVbOWgRrsHrrRHYLv`9;H10#hyNAN{M_9cE--NWkAb$YhgDA3~ zu?tW-yYTtD{J#BNNY?0EMR^js1nn$=b{9X_-+zgAiJ*VZ?~g%aDI7PUXVSyj^7wyf z45g&+2Feh$;VW)`qkb737V1%8qTU5})Kvf%27p$3!8yTjq19hZ1r$)|g?dR~iJn5P z4hmEDlFL$ZhYK4dk0M<$;dg2^W$~^0`=6LTgVPQ1r_^T`@3}0` zgz-mY1ridlynKYEZ~Q^!w{iyG$^+D;5MS^TC4FJ~1K-L6q+33{^6$d%uifdFFT=mv z2L^YX5W2^eXAcVVyM5r>pi&(wZ{NUIWw3Alo<90U_`r}+h4xLzcp%>n0xpZu75jVI zCH@Nh2Vp9<&t%sxIBncXmEc&)yYjkL`TL|Y@?oGnDyt{?ejM=3rBa`cpGMiViHwN) zlBjneO};GrF-A&fA{hS6;QHhL@$;?FKVe~t7!y;#+>6~aNJ9ZF&R682f83EXRsKR- z6DV#(|CPHGP$~pKT9777T@eF642Fkv(M9-SgX*CdVSwu@@JEC_O8H@2N^}^H%ef}L zoKYMiUqN}(xM=M%>iZCO!GD5bahVF>4Exx@{u~tn{3p2AoglrCc4cviG$G9Ic%b=@ z<@#$xY1<0YBK`QQh4QdGUkMz_=TFdE)xDzlu-{TiUg%j67~JHN|0<5}ULtGYr654M zL_FeNUVdfgyLpvFFE2kq9U$}v_bb?+O7nnc5Xl^+`W2eMf| zO7SSM@5pu*mmeUEC`SY>d|P%J8_4O3UoaPvu#x4;ue)4llmP!yWOYWP&7Cn#^iEtl RJoIeLznU7AhJ`o~_y6Yy51#-4 literal 0 HcmV?d00001 diff --git a/GameOfLife3D/Program.cs b/GameOfLife3D/Program.cs new file mode 100644 index 0000000..1fa4633 --- /dev/null +++ b/GameOfLife3D/Program.cs @@ -0,0 +1,3 @@ + +using var game = new GameOfLife3D.GameOfLife(); +game.Run(); diff --git a/GameOfLife3D/app.manifest b/GameOfLife3D/app.manifest new file mode 100644 index 0000000..afa95cd --- /dev/null +++ b/GameOfLife3D/app.manifest @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true/pm + permonitorv2,permonitor + + + + diff --git a/SFMLGame/Program.cs b/SFMLGame/Program.cs index 29a10d9..fbc8c94 100644 --- a/SFMLGame/Program.cs +++ b/SFMLGame/Program.cs @@ -81,7 +81,7 @@ namespace SFMLGame //DrawAll(ref window, ref objects); watch.Restart(); - window.Draw(GetFPSText(CurrentFPS, font)); + DrawFPSText(CurrentFPS, font, ref window); window.Draw(GetCellCountText(CellCount, font)); window.Draw(GetIterationText(game.Iteration, font)); @@ -150,7 +150,7 @@ namespace SFMLGame private static Drawable GetCellCountText(int value, Font font) { - Text ret = new Text($"CellCOunt: {value}", font); + Text ret = new Text($"Cell Count: {value}", font); ret.Position = new Vector2f(0, 40); return ret; } @@ -184,11 +184,13 @@ namespace SFMLGame //game.getActiveMap().GetCell(e.Y/4, e.X/4).isAlive = true; } - private static Text GetFPSText(int currentFPS, Font font) + private static void DrawFPSText(int currentFPS, Font font, ref RenderWindow window) { Text txt = new($"FPS: {currentFPS}", font); - return txt; + window.Draw(txt); + txt.Dispose(); + } private static void Render(in GameMap gameMap, ref VertexArray vtx) @@ -204,32 +206,11 @@ namespace SFMLGame private static void Render(in GameMap gameMap, out int DrawCalls, ref RenderWindow window) { - /** - drawables = [];//int ctn=0; - var sizeScalar = new Vector2f(4f, 4f); - RectangleShape shape = new(sizeScalar); - int drawCalls = 0; - foreach (var cell in gameMap.GetAllCells()) - { - - shape.Position = new Vector2f(cell.YCoord * 4, cell.XCoord * 4); - //shape.Scale = new(2f, 2f); - //shape.Radius = 1f; - //shape.Size = sizeScalar; - shape.FillColor = GetColor(cell); - shape.OutlineThickness = 1f; - shape.OutlineColor = Color.Black; - //window.Draw(shape); - window.Draw(shape); - drawCalls++; - //drawables.Add(shape); - //ctn++; - //vtx.Append(new Vertex(new Vector2f(cell.YCoord * 4, cell.XCoord * 4), GetColor(cell))); - }**/ - //shape.Dispose(); - +#if DEBUG + Stopwatch stopwatch = new Stopwatch(); - stopwatch.Start(); + stopwatch.Start(); +#endif var sizeScalar = new Vector2f(4f, 4f); DrawCalls = 0; VertexArray vtx = new VertexArray(PrimitiveType.Quads); @@ -256,11 +237,13 @@ namespace SFMLGame } window.Draw(vtx); vtx.Dispose(); - if(dmsg) +#if DEBUG + if (dmsg) { Console.WriteLine($"Drawing took {stopwatch.ElapsedMilliseconds}ms | {stopwatch.ElapsedTicks}ticks"); } - stopwatch.Stop(); + stopwatch.Stop(); +#endif //Console.WriteLine($"Draw Calls per Frame: {drawCalls}"); return; }