From d82c3b99597033dcdc04aac2a0a6b8be2a1e9dfd Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Wed, 12 Oct 2022 15:03:33 +0200 Subject: [PATCH] added physics --- assets/level1.json | 91 +----------------------------- src/BoulderDash.cs | 2 +- src/actors/Tiles/Diamond.cs | 23 ++++++-- src/actors/Tiles/DiamondFalling.cs | 44 +++++++++++++++ src/actors/Tiles/Explosion.cs | 16 ++++++ src/actors/Tiles/Rock.cs | 19 +++++++ src/actors/Tiles/RockFalling.cs | 33 +++++++++++ src/scenes/Level.cs | 6 ++ src/scenes/MainMenu.cs | 6 +- 9 files changed, 143 insertions(+), 97 deletions(-) create mode 100644 src/actors/Tiles/DiamondFalling.cs create mode 100644 src/actors/Tiles/Explosion.cs create mode 100644 src/actors/Tiles/RockFalling.cs diff --git a/assets/level1.json b/assets/level1.json index a1d7a45..dcc1a53 100644 --- a/assets/level1.json +++ b/assets/level1.json @@ -1,90 +1 @@ -[ - [ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - ], - [ - 1, 2, 2, 2, 2, 2, 2, 0, 2, 2, 3, 2, 4, 0, 2, 2, 2, 2, 2, 4, 2, 4, 2, 2, 2, - 2, 2, 2, 2, 0, 2, 2, 2, 2, 4, 2, 2, 2, 2, 1 - ], - [ - 1, 2, 4, 9, 4, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 3, 2, 2, - 4, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 1 - ], - [ - 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 4, 2, 4, 2, 2, - 4, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 1 - ], - [ - 1, 4, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4, 2, 2, 4, - 2, 2, 2, 2, 4, 2, 2, 2, 4, 2, 2, 2, 2, 2, 1 - ], - [ - 1, 4, 2, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, - 2, 2, 4, 2, 2, 2, 2, 2, 2, 4, 2, 4, 0, 2, 1 - ], - [ - 1, 2, 2, 2, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 4, 2, 0, - 4, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 4, 4, 2, 1 - ], - [ - 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 2, 2, 2, 4, 2, 2, 4, 2, 1 - ], - [ - 1, 2, 0, 2, 2, 2, 4, 2, 2, 3, 2, 0, 2, 2, 4, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 3, 2, 4, 0, 2, 2, 2, 2, 2, 2, 4, 2, 1 - ], - [ - 1, 2, 2, 3, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 4, - 0, 0, 4, 2, 2, 3, 2, 2, 2, 2, 4, 2, 2, 2, 1 - ], - [ - 1, 2, 2, 2, 4, 2, 2, 4, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, - 4, 2, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 1 - ], - [ - 1, 2, 0, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 2, 2, 2, - 2, 2, 4, 2, 2, 4, 2, 3, 2, 2, 2, 2, 0, 2, 1 - ], - [ - 1, 2, 4, 2, 2, 2, 2, 2, 4, 2, 2, 0, 0, 2, 2, 2, 2, 4, 2, 4, 3, 2, 2, 3, 2, - 2, 2, 2, 4, 2, 2, 2, 4, 2, 2, 3, 2, 4, 2, 1 - ], - [ - 1, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 2, 2, 4, 2, - 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 4, 1 - ], - [ - 1, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1 - ], - [ - 1, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 3, 2, 2, 2, 2, 4, 2, 2, 2, - 2, 2, 4, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 1 - ], - [ - 1, 0, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 4, 2, 2, 0, 0, 0, 2, 2, 2, - 4, 2, 2, 2, 2, 2, 2, 4, 2, 4, 0, 2, 2, 1, 1 - ], - [ - 1, 2, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 4, 2, 0, 0, 2, - 2, 2, 2, 3, 2, 2, 2, 4, 2, 4, 4, 2, 2, 2, 1 - ], - [ - 1, 2, 2, 2, 2, 4, 3, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, - 4, 2, 4, 3, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 1 - ], - [ - 1, 2, 2, 2, 0, 2, 2, 0, 2, 4, 2, 2, 4, 2, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 4, 2, 4, 3, 2, 2, 2, 2, 2, 2, 4, 2, 2, 4, 1 - ], - [ - 1, 2, 3, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, - 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 1 - ], - [ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - ] -] +[[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,2,2,2,2,2,2,0,2,2,3,2,4,0,2,2,2,2,2,4,2,4,2,2,2,2,2,2,2,0,2,2,2,2,4,2,2,2,2,1],[1,2,4,9,4,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,4,3,2,2,4,2,2,2,2,0,2,2,2,2,2,0,2,2,1],[1,2,2,2,2,2,2,2,2,2,2,0,2,2,0,2,2,2,2,2,4,2,4,2,2,4,2,2,2,2,2,2,2,2,4,2,2,2,2,1],[1,4,2,0,0,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,4,2,2,2,2,4,2,2,2,4,2,2,2,2,2,1],[1,4,2,4,4,2,2,2,2,2,2,2,2,2,4,4,2,2,4,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,4,0,2,1],[1,2,2,2,4,2,2,4,2,2,2,2,2,2,2,2,4,2,2,2,2,2,4,2,0,4,2,2,2,2,2,2,2,2,4,2,4,4,2,1],[1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,2,2,2,4,2,2,4,2,1],[1,2,0,2,2,2,4,2,2,3,2,0,2,2,4,2,4,2,2,2,2,2,2,2,2,2,2,3,2,4,0,2,2,2,2,2,2,4,2,1],[1,2,2,3,2,2,2,2,2,4,2,2,2,2,2,0,2,2,2,2,2,2,2,2,4,0,0,4,2,2,3,2,2,2,2,4,2,2,2,1],[1,2,2,2,4,2,2,4,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,4,2,2,4,2,2,2,2,2,2,2,2,1],[1,2,0,2,2,2,2,2,4,2,2,2,2,2,2,2,2,4,4,2,2,2,2,2,2,2,2,4,2,2,4,2,3,2,2,2,2,0,2,1],[1,2,4,2,2,2,2,2,4,2,2,0,0,2,2,2,2,4,2,4,3,2,2,3,2,2,2,2,4,2,2,2,4,2,2,3,2,4,2,1],[1,2,3,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,2,2,4,2,2,2,2,2,2,2,2,3,2,2,2,2,2,4,1],[1,2,2,2,2,2,2,2,2,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1],[1,0,0,2,2,2,2,2,2,2,2,2,0,2,2,2,3,2,2,2,2,4,2,2,2,2,2,4,2,2,2,4,2,2,2,2,2,2,2,1],[1,0,4,2,2,2,2,2,2,2,2,2,4,4,2,2,4,2,2,0,0,0,2,2,2,4,2,2,2,2,2,2,4,2,4,0,2,2,1,1],[1,2,4,2,2,4,2,2,2,2,2,2,2,2,4,2,2,2,2,2,4,2,0,0,2,2,2,2,3,2,2,2,4,2,4,4,2,2,2,1],[1,2,2,2,2,4,3,2,2,0,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,4,3,2,2,2,2,2,2,4,2,2,2,1],[1,2,2,2,0,2,2,0,2,4,2,2,4,2,4,4,2,2,2,2,2,2,2,2,2,4,2,4,3,2,2,2,2,2,2,4,2,2,4,1],[1,2,3,2,2,2,2,4,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,0,2,4,2,2,4,2,2,2,2,2,2,2,2,4,2,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]] \ No newline at end of file diff --git a/src/BoulderDash.cs b/src/BoulderDash.cs index 2dab464..167c560 100644 --- a/src/BoulderDash.cs +++ b/src/BoulderDash.cs @@ -45,7 +45,7 @@ class BoulderDash : Game } } GameState.keyState = new KeyState(); - GameState.tick = (GameState.tick + 1) % Game.TPS; + GameState.tick = (GameState.tick + 1); GameState.sceneManager.GetCurrentScene()?.Update(context); } diff --git a/src/actors/Tiles/Diamond.cs b/src/actors/Tiles/Diamond.cs index cc2130f..0a05477 100644 --- a/src/actors/Tiles/Diamond.cs +++ b/src/actors/Tiles/Diamond.cs @@ -1,7 +1,6 @@ -class Diamond : Rock +class Diamond : Tile { private TileSet tileSet; - private double i; private int tileX; public Diamond(TileSet tileSet, int srcX, int srcY) : base(tileSet, srcX, srcY) @@ -11,9 +10,23 @@ class Diamond : Rock public override void Update(Context context, Map map, int x, int y) { - ++i; - i = i % 512; - tileX = (int)(i * (8.0 / 512.0)); + if (map.GetTile(x, y + 1) is (int)TileType.AIR) + { + map.SetTile(x, y, 0); + map.SetTile(x, y + 1, (int)TileType.DIAMOND_FALLING); + } + if (map.GetTile(x, y + 1) is (int)TileType.ROCK && map.GetTile(x + 1, y) is (int)TileType.AIR && map.GetTile(x + 1, y + 1) is (int)TileType.AIR) + { + map.SetTile(x, y, 0); + map.SetTile(x + 1, y, (int)TileType.DIAMOND_FALLING); + } + if (map.GetTile(x, y + 1) is (int)TileType.ROCK && map.GetTile(x - 1, y) is (int)TileType.AIR && map.GetTile(x - 1, y + 1) is (int)TileType.AIR) + { + map.SetTile(x, y, 0); + map.SetTile(x - 1, y, (int)TileType.DIAMOND_FALLING); + } + var i = GameState.tick % 32; + tileX = (int)(i * (8.0 / 32.0)); } public override void Draw(Context context, int x, int y) diff --git a/src/actors/Tiles/DiamondFalling.cs b/src/actors/Tiles/DiamondFalling.cs new file mode 100644 index 0000000..fc533fd --- /dev/null +++ b/src/actors/Tiles/DiamondFalling.cs @@ -0,0 +1,44 @@ +class DiamondFalling : Tile +{ + private TileSet tileSet; + private int tileX; + + public DiamondFalling(TileSet tileSet, int srcX, int srcY) : base(tileSet, srcX, srcY) + { + this.tileSet = tileSet; + } + + public override void Update(Context context, Map map, int x, int y) + { + if (GameState.tick % 16 == 0) + if (map.GetTile(x, y + 1) is (int)TileType.AIR) + { + map.SetTile(x, y, 0); + map.SetTile(x, y + 1, (int)TileType.DIAMOND_FALLING); + } + else if (map.GetTile(x, y + 1) is (int)TileType.PLAYER) + { + y += 1; + map.SetTile(x + 1, y, (int)TileType.EXPLOSION); + map.SetTile(x, y, (int)TileType.EXPLOSION); + map.SetTile(x - 1, y, (int)TileType.EXPLOSION); + map.SetTile(x + 1, y + 1, (int)TileType.EXPLOSION); + map.SetTile(x, y + 1, (int)TileType.EXPLOSION); + map.SetTile(x - 1, y + 1, (int)TileType.EXPLOSION); + map.SetTile(x + 1, y - 1, (int)TileType.EXPLOSION); + map.SetTile(x, y - 1, (int)TileType.EXPLOSION); + map.SetTile(x - 1, y - 1, (int)TileType.EXPLOSION); + } + else + { + map.SetTile(x, y, (int)TileType.DIAMOND); + } + var i = GameState.tick % 32; + tileX = (int)(i * (8.0 / 32.0)); + } + + public override void Draw(Context context, int x, int y) + { + context.renderer.DrawTileSet(tileSet, x, y, tileX, 10); + } +} diff --git a/src/actors/Tiles/Explosion.cs b/src/actors/Tiles/Explosion.cs new file mode 100644 index 0000000..3a8bd6e --- /dev/null +++ b/src/actors/Tiles/Explosion.cs @@ -0,0 +1,16 @@ +class Explosion : Tile +{ + private int i = 32 * 9; + public Explosion(TileSet tileSet, int srcX, int srcY) : base(tileSet, srcX, srcY) + { + } + + public override void Update(Context context, Map map, int x, int y) + { + i--; + if (i <= 0) + { + map.SetTile(x, y, 0); + } + } +} diff --git a/src/actors/Tiles/Rock.cs b/src/actors/Tiles/Rock.cs index 374cfbe..549c856 100644 --- a/src/actors/Tiles/Rock.cs +++ b/src/actors/Tiles/Rock.cs @@ -3,4 +3,23 @@ class Rock : Tile public Rock(TileSet tileSet, int srcX, int srcY) : base(tileSet, srcX, srcY) { } + + public override void Update(Context context, Map map, int x, int y) + { + if (map.GetTile(x, y + 1) is (int)TileType.AIR) + { + map.SetTile(x, y, 0); + map.SetTile(x, y + 1, (int)TileType.ROCK_FALLING); + } + if (map.GetTile(x, y + 1) is (int)TileType.ROCK && map.GetTile(x + 1, y) is (int)TileType.AIR && map.GetTile(x + 1, y + 1) is (int)TileType.AIR) + { + map.SetTile(x, y, 0); + map.SetTile(x + 1, y, (int)TileType.ROCK_FALLING); + } + if (map.GetTile(x, y + 1) is (int)TileType.ROCK && map.GetTile(x - 1, y) is (int)TileType.AIR && map.GetTile(x - 1, y + 1) is (int)TileType.AIR) + { + map.SetTile(x, y, 0); + map.SetTile(x - 1, y, (int)TileType.ROCK_FALLING); + } + } } diff --git a/src/actors/Tiles/RockFalling.cs b/src/actors/Tiles/RockFalling.cs new file mode 100644 index 0000000..f35f548 --- /dev/null +++ b/src/actors/Tiles/RockFalling.cs @@ -0,0 +1,33 @@ +class RockFalling : Tile +{ + public RockFalling(TileSet tileSet, int srcX, int srcY) : base(tileSet, srcX, srcY) + { + } + + public override void Update(Context context, Map map, int x, int y) + { + if (GameState.tick % 16 == 0) + if (map.GetTile(x, y + 1) is (int)TileType.AIR) + { + map.SetTile(x, y, 0); + map.SetTile(x, y + 1, (int)TileType.ROCK_FALLING); + } + else if (map.GetTile(x, y + 1) is (int)TileType.PLAYER) + { + y += 1; + map.SetTile(x + 1, y, (int)TileType.EXPLOSION); + map.SetTile(x, y, (int)TileType.EXPLOSION); + map.SetTile(x - 1, y, (int)TileType.EXPLOSION); + map.SetTile(x + 1, y + 1, (int)TileType.EXPLOSION); + map.SetTile(x, y + 1, (int)TileType.EXPLOSION); + map.SetTile(x - 1, y + 1, (int)TileType.EXPLOSION); + map.SetTile(x + 1, y - 1, (int)TileType.EXPLOSION); + map.SetTile(x, y - 1, (int)TileType.EXPLOSION); + map.SetTile(x - 1, y - 1, (int)TileType.EXPLOSION); + } + else + { + map.SetTile(x, y, (int)TileType.ROCK); + } + } +} diff --git a/src/scenes/Level.cs b/src/scenes/Level.cs index b0e2c81..5b7aa01 100644 --- a/src/scenes/Level.cs +++ b/src/scenes/Level.cs @@ -6,6 +6,9 @@ enum TileType : int DIAMOND = 3, ROCK = 4, WALL = 5, + ROCK_FALLING = 6, + DIAMOND_FALLING = 7, + EXPLOSION = 8, PLAYER = 9 } @@ -25,8 +28,11 @@ class Level : Scene tiles.Add((int)TileType.BORDER, new Tile(tileSet, 1, 6)); tiles.Add((int)TileType.DIAMOND, new Diamond(tileSet, 0, 10)); tiles.Add((int)TileType.ROCK, new Rock(tileSet, 0, 7)); + tiles.Add((int)TileType.ROCK_FALLING, new RockFalling(tileSet, 0, 7)); + tiles.Add((int)TileType.DIAMOND_FALLING, new DiamondFalling(tileSet, 0, 10)); tiles.Add((int)TileType.WALL, new Tile(tileSet, 3, 6)); tiles.Add((int)TileType.PLAYER, new Player(tileSet, 0, 0)); + tiles.Add((int)TileType.EXPLOSION, new Explosion(tileSet, 2, 0)); this.map = new Map(levelJson, tiles); this.map.Dump(); } diff --git a/src/scenes/MainMenu.cs b/src/scenes/MainMenu.cs index a5fad7e..8d17658 100644 --- a/src/scenes/MainMenu.cs +++ b/src/scenes/MainMenu.cs @@ -5,6 +5,7 @@ class MainMenu : Scene public override void Create(Context context) { context.fontManager.RegisterFont("MainMenu", "assets.font.ttf", 24); + context.fontManager.RegisterFont("MainMenuSmall", "assets.font.ttf", 16); } public override void Update(Context context) @@ -29,8 +30,11 @@ class MainMenu : Scene { var windowSize = context.window.GetSize(); var font = context.fontManager.GetFont("MainMenu"); + var fontSmall = context.fontManager.GetFont("MainMenuSmall"); context.renderer.SetFont(font, new Color(255, 255, 255)); - context.renderer.DrawText("Main Menu", windowSize.width / 2, windowSize.height / 2, true); + context.renderer.DrawText("Boulder Dash", windowSize.width / 2, windowSize.height / 2, true); + context.renderer.SetFont(fontSmall, new Color(255, 255, 255)); + context.renderer.DrawText("Press Space to Start!", windowSize.width / 2, windowSize.height / 2 + 30, true); context.renderer.SetColor(255, 255, 255); context.renderer.DrawRect(x, 0, 30, 30); }