diff --git a/DangerousD/Content/Content.mgcb b/DangerousD/Content/Content.mgcb index c977303..dbbe74b 100644 --- a/DangerousD/Content/Content.mgcb +++ b/DangerousD/Content/Content.mgcb @@ -14,14 +14,7 @@ #---------------------------------- Content ---------------------------------# -#begin ButtonFont.spritefont -/importer:FontDescriptionImporter -/processor:FontDescriptionProcessor -/processorParam:PremultiplyAlpha=True -/processorParam:TextureFormat=Compressed -/build:ButtonFont.spritefont - -#begin checkboxs_off-on.png +#begin MonstersAnimations.png /importer:TextureImporter /processor:TextureProcessor /processorParam:ColorKeyColor=255,0,255,255 @@ -87,6 +80,13 @@ /processorParam:Quality=Best /build:DoomTestSong.mp3 +#begin Font_12.spritefont +/importer:FontDescriptionImporter +/processor:FontDescriptionProcessor +/processorParam:PremultiplyAlpha=True +/processorParam:TextureFormat=Compressed +/build:Font_12.spritefont + #begin Font_25.spritefont /importer:FontDescriptionImporter /processor:FontDescriptionProcessor @@ -252,7 +252,19 @@ /processorParam:TextureFormat=Color /build:textboxbackground6-1.png -#begin tiles.png +#begin MonstersAnimations.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:MonstersAnimations.png + +#begin PC_Computer_Dangerous_Dave_In_The_Haunted_Mansion_Death_Sequences.png /importer:TextureImporter /processor:TextureProcessor /processorParam:ColorKeyColor=255,0,255,255 @@ -264,6 +276,18 @@ /processorParam:TextureFormat=Color /build:tiles.png +#begin playerAnimation.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:playerAnimation.png + #begin wall.jpg /importer:TextureImporter /processor:TextureProcessor diff --git a/DangerousD/Content/Font_12.spritefont b/DangerousD/Content/Font_12.spritefont new file mode 100644 index 0000000..4cffaf7 --- /dev/null +++ b/DangerousD/Content/Font_12.spritefont @@ -0,0 +1,64 @@ + + + + + + + Arial + + + 12 + + + 0 + + + true + + + + + + + + + + + + ~ + + + а + я + + + + diff --git a/DangerousD/Content/animations/HunchmanAttackLeft b/DangerousD/Content/animations/HunchmanAttackLeft new file mode 100644 index 0000000..f6b0634 --- /dev/null +++ b/DangerousD/Content/animations/HunchmanAttackLeft @@ -0,0 +1 @@ +{"id":"HunchmanAttackLeft","textureName":"MonstersAnimations","startSpriteRectangle":{"X":101,"Y":124,"Width":40,"Height":24},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":3,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/HunchmanAttackRight b/DangerousD/Content/animations/HunchmanAttackRight new file mode 100644 index 0000000..482d7f3 --- /dev/null +++ b/DangerousD/Content/animations/HunchmanAttackRight @@ -0,0 +1 @@ +{"id":"HunchmanAttackRight","textureName":"MonstersAnimations","startSpriteRectangle":{"X":101,"Y":99,"Width":40,"Height":24},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":3,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/HunchmanMoveLeft b/DangerousD/Content/animations/HunchmanMoveLeft new file mode 100644 index 0000000..47d627e --- /dev/null +++ b/DangerousD/Content/animations/HunchmanMoveLeft @@ -0,0 +1 @@ +{"id":"HunchmanMoveLeft","textureName":"MonstersAnimations","startSpriteRectangle":{"X":1,"Y":124,"Width":24,"Height":24},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":4,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/HunchmanMoveRight b/DangerousD/Content/animations/HunchmanMoveRight new file mode 100644 index 0000000..a289fa5 --- /dev/null +++ b/DangerousD/Content/animations/HunchmanMoveRight @@ -0,0 +1,3 @@ + +{"id":"HunchmanMoveRight","textureName":"MonstersAnimations","startSpriteRectangle":{"X":1,"Y":99,"Width":24,"Height":24},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":4,"isCycle":true,"offset":"0, 0"} + diff --git a/DangerousD/Content/animations/playerJumpLeft b/DangerousD/Content/animations/playerJumpLeft new file mode 100644 index 0000000..763ccd7 --- /dev/null +++ b/DangerousD/Content/animations/playerJumpLeft @@ -0,0 +1 @@ +{"id":"playerJumpLeft","textureName":"playerAnimation","startSpriteRectangle":{"X":101,"Y":34,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":3,"isCycle":false,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/playerJumpRight b/DangerousD/Content/animations/playerJumpRight new file mode 100644 index 0000000..816b2d3 --- /dev/null +++ b/DangerousD/Content/animations/playerJumpRight @@ -0,0 +1 @@ +{"id":"playerJumpRight","textureName":"playerAnimation","startSpriteRectangle":{"X":126,"Y":1,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":3,"isCycle":false,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/playerMoveLeft b/DangerousD/Content/animations/playerMoveLeft new file mode 100644 index 0000000..d167573 --- /dev/null +++ b/DangerousD/Content/animations/playerMoveLeft @@ -0,0 +1,20 @@ +{ + "id": "playerMoveLeft", + "textureName": "playerAnimation", + "startSpriteRectangle": { + "X": 26, + "Y": 34, + "Width": 24, + "Height": 32 + }, + "frameSecond": [ + { + "Item1": 0, + "Item2": 8 + } + ], + "textureFrameInterval": 1, + "framesCount": 4, + "isCycle": true, + "offset": "0, 0" +} diff --git a/DangerousD/Content/animations/playerMoveRight b/DangerousD/Content/animations/playerMoveRight new file mode 100644 index 0000000..42d7327 --- /dev/null +++ b/DangerousD/Content/animations/playerMoveRight @@ -0,0 +1,20 @@ +{ + "id": "playerMoveRight", + "textureName": "playerAnimation", + "startSpriteRectangle": { + "X": 26, + "Y": 1, + "Width": 24, + "Height": 32 + }, + "frameSecond": [ + { + "Item1": 0, + "Item2": 8 + } + ], + "textureFrameInterval": 1, + "framesCount": 4, + "isCycle": true, + "offset": "0, 0" +} diff --git a/DangerousD/Content/animations/playerRightStay b/DangerousD/Content/animations/playerRightStay new file mode 100644 index 0000000..bbeb120 --- /dev/null +++ b/DangerousD/Content/animations/playerRightStay @@ -0,0 +1 @@ +{"id":"playerRightStay","textureName":"playerAnimation","startSpriteRectangle":{"X":1,"Y":1,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":1,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/playerStayLeft b/DangerousD/Content/animations/playerStayLeft new file mode 100644 index 0000000..993f1e1 --- /dev/null +++ b/DangerousD/Content/animations/playerStayLeft @@ -0,0 +1 @@ +{"id":"playerStayLeft","textureName":"playerAnimation","startSpriteRectangle":{"X":1,"Y":34,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":1,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/Content/playerAnimation.png b/DangerousD/Content/playerAnimation.png new file mode 100644 index 0000000..ed061f3 Binary files /dev/null and b/DangerousD/Content/playerAnimation.png differ diff --git a/DangerousD/GameCore/GUI/DebugHUD.cs b/DangerousD/GameCore/GUI/DebugHUD.cs new file mode 100644 index 0000000..b56d90a --- /dev/null +++ b/DangerousD/GameCore/GUI/DebugHUD.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using MonogameLibrary.UI.Elements; +using static System.String; + +namespace DangerousD.GameCore.GUI +{ + public class DebugHUD : IDrawableObject + { + private SpriteFont _spriteFont; + private Dictionary _text = new(); + + public void Initialize() + { + } + + public void LoadContent() + { + _spriteFont = AppManager.Instance.Content.Load("Font_12"); + } + + public void Update(GameTime gameTime) + { + } + + public void Draw(SpriteBatch spriteBatch) + { + spriteBatch.Begin(); + spriteBatch.DrawString( + _spriteFont, + Join("\n", _text.Select(el => el.Key + ": " + el.Value).ToList()), + new Vector2(10, 10), + Color.Cyan, + 0, + Vector2.Zero, + 1, + SpriteEffects.None, + 0 + ); + spriteBatch.End(); + } + + public void Set(string key, string value) + { + _text[key] = value; + } + } +} \ No newline at end of file diff --git a/DangerousD/GameCore/GameObjects/GameObject.cs b/DangerousD/GameCore/GameObjects/GameObject.cs index d276984..96ff4ad 100644 --- a/DangerousD/GameCore/GameObjects/GameObject.cs +++ b/DangerousD/GameCore/GameObjects/GameObject.cs @@ -17,8 +17,6 @@ namespace DangerousD.GameCore public int Width { get; set; } public int Height { get; set; } public Rectangle Rectangle => new Rectangle((int)Pos.X, (int)Pos.Y, Width, Height); - public Vector2 velocity; - public Vector2 acceleration; protected abstract GraphicsComponent GraphicsComponent { get; } public GameObject(Vector2 pos) { diff --git a/DangerousD/GameCore/GameObjects/IDrawableObject.cs b/DangerousD/GameCore/GameObjects/IDrawableObject.cs index 1d9ca5c..42d8320 100644 --- a/DangerousD/GameCore/GameObjects/IDrawableObject.cs +++ b/DangerousD/GameCore/GameObjects/IDrawableObject.cs @@ -4,7 +4,7 @@ using Microsoft.Xna.Framework.Graphics; namespace DangerousD.GameCore.GUI { - interface IDrawableObject + public interface IDrawableObject { void Initialize(); void LoadContent(); diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs index e309d9e..ba342ec 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs @@ -4,7 +4,9 @@ using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; +using System.Security.Authentication.ExtendedProtection; using System.Text; using System.Threading.Tasks; @@ -12,15 +14,71 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Hunchman : CoreEnemy { + GameManager gameManager; + bool isAttacking; public Hunchman(Vector2 position) : base(position) { + Width = 48; + Height = 48; + monster_speed = -2; + monster_health = 1; + name = "HunchMan"; + velocity = new Vector2(monster_speed, 0); + gameManager = AppManager.Instance.GameManager; + isAttacking = false; + isAlive = true; } - protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "HunchmanMoveLeft", "HunchmanMoveRight", "HunchmanAttackLeft", "HunchmanAttackRight" }, "HunchmanMoveRight"); + protected override GraphicsComponent GraphicsComponent { get; } = new(new List + { "HunchmanMoveLeft", "HunchmanMoveRight", "HunchmanAttackLeft", "HunchmanAttackRight" }, "HunchmanMoveLeft"); + + public override void Update(GameTime gameTime) + { + // P.S. Всё в классе можешь смело удалять и переписывать с нуля. + gameManager = AppManager.Instance.GameManager; + + if (!isAttacking) + { + Attack(); + Move(gameTime); + } + else + { + velocity.X = 0; + } + Death(); + + } public override void Attack() { - + GameObject gameObject; + foreach (var player in gameManager.players) + { + if (player.Pos.Y + player.Height >= Pos.Y && player.Pos.Y <= Pos.Y + Height) + { + gameObject = gameManager.physicsManager.RayCast(this, player); + if (gameObject is null) + { + isAttacking = true; + GraphicsComponent.StopAnimation(); + if (velocity.X > 0) + { + if (GraphicsComponent.GetCurrentAnimation != "HunchmanAttackRight") + { + GraphicsComponent.StartAnimation("HunchmanAttackRight"); + } + } + else if (velocity.X < 0) + { + if (GraphicsComponent.GetCurrentAnimation != "HunchmanAttackLeft") + { + GraphicsComponent.StartAnimation("HunchmanAttackLeft"); + } + } + } + } + } } public override void Attack(GameTime gameTime) @@ -30,12 +88,45 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public override void Death() { + if (monster_health <= 0) + { + } } public override void Move(GameTime gameTime) { + if (gameManager.physicsManager.RayCast(this, new Vector2(Pos.X + Width + 10, Pos.Y + Height)) is not null) + { + monster_speed *= -1; + } + + velocity.X = monster_speed; + if (velocity.X > 0) + { + if (GraphicsComponent.GetCurrentAnimation != "HunchmanMoveRight") + { + GraphicsComponent.StartAnimation("HunchmanMoveRight"); + } + + } + + else if (velocity.X < 0) + { + if (GraphicsComponent.GetCurrentAnimation != "HunchmanMoveLeft") + { + GraphicsComponent.StartAnimation("HunchmanMoveLeft"); + } + } + + } + + public override void OnCollision(GameObject gameObject) + { + monster_speed *= -1; + _pos.X += 5 * monster_speed; + Debug.WriteLine("Collision"); } public override void Target() diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index f2dc98a..4ab4494 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -13,7 +13,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Zombie : CoreEnemy { - private bool isGoRight = true; float leftBorder; float rightBorder; bool isAttaking = false; @@ -25,9 +24,18 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters Height = 40; monster_speed = 3; name = "Zombie"; - leftBorder = (int)position.X - 100; - rightBorder = (int)position.X + 100; + leftBorder = (int)position.X - 50; + rightBorder = (int)position.X + 50; physicsManager = new PhysicsManager(); + Random random = new Random(); + if(random.Next(0, 2) == 0) + { + isGoRight = true; + } + else + { + isGoRight = false; + } } protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "ZombieMoveRight", "ZombieMoveLeft", "ZombieRightAttack", "ZombieLeftAttack" }, "ZombieMoveLeft"); @@ -38,7 +46,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters Target(); Move(gameTime); } - + fixBorder(); base.Update(gameTime); } @@ -50,7 +58,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { if (GraphicsComponent.GetCurrentAnimation != "ZombieRightAttack") { - GraphicsComponent.StartAnimation("ZombieAttackRight"); + GraphicsComponent.StartAnimation("ZombieRightAttack"); } AppManager.Instance.GameManager.players[0].Death(name); } @@ -71,7 +79,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public override void Move(GameTime gameTime) { - float delta = (float)gameTime.ElapsedGameTime.TotalSeconds; if (isGoRight) { if (GraphicsComponent.GetCurrentAnimation != "ZombieMoveRight") @@ -113,7 +120,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } public override void Target() { - if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 50, (int)Pos.Y, Width + 100, Height), typeof(Player)) != null) + if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 50, (int)Pos.Y, Width + 100, Height), typeof(Player)).Count > 0) { if (isGoRight && this._pos.X <= AppManager.Instance.GameManager.players[0].Pos.X) { @@ -130,10 +137,19 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } } - public override void Attack(GameTime gameTime) + public void fixBorder() { - throw new NotImplementedException(); + if(leftBorder <= 0) + { + leftBorder = 0; + } + if(rightBorder >= 800) + { + rightBorder = 760; + } } - + + public override void Attack(GameTime gameTime) + {} } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/DeathRectangle.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/DeathRectangle.cs index 1867b60..7dda1b1 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/DeathRectangle.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/DeathRectangle.cs @@ -13,8 +13,8 @@ namespace DangerousD.GameCore.GameObjects.PlayerDeath { public DeathRectangle(Vector2 pos, string DeathType) : base(pos) { - Height = 128; - Width = 128; + Height = 48; + Width = 48; PlayDeath(DeathType); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 9a9cc5e..39b1926 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -14,6 +14,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public class Player : LivingEntity { bool isAlive = true; + bool isRight; + string stayAnimation; bool isJump = false; public int health; public bool isGoRight = false; @@ -21,6 +23,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public int rightBorder; public int leftBorder; public bool isVisible = true; + private bool isAttacked = false; public GameObject objectAttack; public Player(Vector2 position) : base(position) @@ -30,7 +33,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities AppManager.Instance.InputManager.ShootEvent += Shoot; - AppManager.Instance.InputManager.MovEventJump += AnimationJump; + AppManager.Instance.InputManager.MovEventJump += Jump; AppManager.Instance.InputManager.MovEventDown += MoveDown; velocity = new Vector2(0, 0); @@ -38,9 +41,11 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities leftBorder = (int)position.X - 100; } + public bool IsAlive { get { return isAlive; } } - protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "ZombieMoveRight", "ZombieMoveLeft", "ZombieRightAttack", "ZombieLeftAttack", "DeathFromZombie" }, "ZombieMoveLeft");//TODO: Change to player + protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "playerMoveLeft", "playerMoveRight", "DeathFromZombie", "playerRightStay", "playerStayLeft", + "playerJumpRight" , "playerJumpLeft"}, "playerStayLeft"); public void Attack() { @@ -66,23 +71,26 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public void Death(string monsterName) { - /*if(monsterName == "Zombie") + isAttacked = true; + if(monsterName == "Zombie") { DeathRectangle deathRectangle = new DeathRectangle(Pos, "DeathFrom" + monsterName); deathRectangle.Gr.actionOfAnimationEnd += (a) => { if (a == "DeathFrom" + monsterName) { - AppManager.Instance.ChangeGameState(GameState.GameOver); + AppManager.Instance.ChangeGameState(GameState.Death); } }; } - isAlive = false;*/ + isAlive = false; } - public void AnimationJump() + public void Jump() { - velocity.Y = -11; - isJump = true; + if (isOnGround) + { + velocity.Y = -11; + } // здесь будет анимация } public void Shoot() @@ -93,33 +101,34 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public override void Update(GameTime gameTime) { GraphicsComponent.CameraPosition = (_pos-new Vector2(200, 350)).ToPoint(); - velocity.X = 0.5f; - if (velocity.Y == 0) + if (!isAttacked) { - isJump = false; + Move(gameTime); + } + else + { + velocity.X = 0; } base.Update(gameTime); - Move(gameTime); } public void Move(GameTime gameTime) { float delta = (float)gameTime.ElapsedGameTime.TotalSeconds; - if (AppManager.Instance.InputManager.VectorMovementDirection.X==1) + velocity.X = 5 * AppManager.Instance.InputManager.VectorMovementDirection.X; + if (AppManager.Instance.InputManager.VectorMovementDirection.X > 0) { - if (GraphicsComponent.GetCurrentAnimation != "ZombieMoveRight")//идёт направо + if (GraphicsComponent.GetCurrentAnimation != "playerMoveRight")//идёт направо { - GraphicsComponent.StartAnimation("ZombieMoveRight"); + GraphicsComponent.StartAnimation("playerMoveRight"); } - velocity.X = 5; } - else if (AppManager.Instance.InputManager.VectorMovementDirection.X == -1)//идёт налево + else if (AppManager.Instance.InputManager.VectorMovementDirection.X < 0)//идёт налево { - if (GraphicsComponent.GetCurrentAnimation != "ZombieMoveLeft") + if (GraphicsComponent.GetCurrentAnimation != "playerMoveLeft") { - GraphicsComponent.StartAnimation("ZombieMoveLeft"); + GraphicsComponent.StartAnimation("playerMoveLeft"); } - velocity.X = -5; } else if(AppManager.Instance.InputManager.VectorMovementDirection.X == 0)//стоит { @@ -127,13 +136,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities { GraphicsComponent.StartAnimation("ZombieMoveLeft"); } - velocity.X = 0; } } public void MoveDown() { + // ПОЧЕМУ velocity.Y = -11; - isJump = true; } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntity.cs b/DangerousD/GameCore/GameObjects/LivingEntity.cs index 5620568..90a2170 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntity.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntity.cs @@ -4,7 +4,7 @@ namespace DangerousD.GameCore.GameObjects; public abstract class LivingEntity : Entity { - private Vector2 targetPosition; + public bool isOnGround = true; public Vector2 velocity; public Vector2 acceleration; public LivingEntity(Vector2 position) : base(position) @@ -13,7 +13,7 @@ public abstract class LivingEntity : Entity } public override void SetPosition(Vector2 position) { - targetPosition = position; _pos = position; + _pos = position; } //TODO befrend targetpos and physics engine diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index bf08797..f2e2179 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -14,7 +14,13 @@ using DangerousD.GameCore.Managers; namespace DangerousD.GameCore { public enum MultiPlayerStatus { SinglePlayer, Host, Client } +<<<<<<< HEAD public enum GameState { Menu, Options, Lobby, Game, Login, Death, HUD } +======= + public enum GameState { Menu, Options, Lobby, Game, Login, Death, + GameOver + } +>>>>>>> e6d0f2b8a092647a5c02741fd70194bfb376b202 public class AppManager : Game { public static AppManager Instance { get; private set; } @@ -24,13 +30,14 @@ namespace DangerousD.GameCore public GameState gameState { get; private set; } public MultiPlayerStatus multiPlayerStatus { get; private set; } = MultiPlayerStatus.SinglePlayer; public Point resolution = new Point(1920, 1080); - public Point inGameResolution = new Point(1920, 1080); + public Point inGameResolution = new Point(1366, 768); IDrawableObject MenuGUI; IDrawableObject OptionsGUI; IDrawableObject LoginGUI; IDrawableObject LobbyGUI; IDrawableObject DeathGUI; IDrawableObject HUD; + public DebugHUD DebugHUD; public GameManager GameManager { get; private set; } = new(); public AnimationBuilder AnimationBuilder { get; private set; } = new AnimationBuilder(); @@ -64,6 +71,7 @@ namespace DangerousD.GameCore LobbyGUI = new LobbyGUI(); DeathGUI = new DeathGUI(); HUD = new HUD(); + DebugHUD = new DebugHUD(); UIManager.resolution = resolution; UIManager.resolutionInGame = inGameResolution; } @@ -74,6 +82,7 @@ namespace DangerousD.GameCore MenuGUI.Initialize(); LoginGUI.Initialize(); + DebugHUD.Initialize(); OptionsGUI.Initialize(); HUD.Initialize(); LobbyGUI.Initialize(); @@ -84,6 +93,7 @@ namespace DangerousD.GameCore protected override void LoadContent() { _spriteBatch = new SpriteBatch(GraphicsDevice); + DebugHUD.LoadContent(); MenuGUI.LoadContent(); LoginGUI.LoadContent(); OptionsGUI.LoadContent(); @@ -131,6 +141,7 @@ namespace DangerousD.GameCore default: break; } + DebugHUD.Update(gameTime); base.Update(gameTime); } @@ -174,6 +185,7 @@ namespace DangerousD.GameCore _spriteBatch.End(); + DebugHUD.Draw(_spriteBatch); base.Draw(gameTime); } diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 342813b..8664666 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -25,7 +25,7 @@ namespace DangerousD.GameCore public List players; public List otherObjects = new(); - public Player GetPlayer1 { get; private set; } + public Player GetPlayer1; public GameManager() { others = new List(); @@ -72,6 +72,35 @@ namespace DangerousD.GameCore } } + public void Remove(GameObject gameObject) + { + GetAllGameObjects.Remove(gameObject); + if (gameObject is Player objPl) + { + livingEntities.Remove(gameObject as LivingEntity); + players.Remove(objPl); + } + else if (gameObject is LivingEntity objLE) + { + livingEntities.Remove(objLE); + } + else if (gameObject is Entity objE) + { + entities.Remove(objE); + } + else if (gameObject is MapObject obj) + { + if (obj.IsColliderOn) + mapObjects.Remove(obj); + else + BackgroundObjects.Remove(obj); + } + else + { + otherObjects.Remove(gameObject); + } + } + public void Draw(SpriteBatch _spriteBatch) { foreach (var item in BackgroundObjects) diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index 980d7b3..7899c98 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using DangerousD.GameCore.GameObjects.LivingEntities; using Microsoft.Xna.Framework; namespace DangerousD.GameCore.Managers @@ -20,9 +21,9 @@ namespace DangerousD.GameCore.Managers item.velocity = item.velocity + item.acceleration * delta; } - CheckCollisions(livingEntities, mapObjects); - OnCollision(entities, livingEntities); - OnCollision(livingEntities); + CheckCollisionsLE_MO(livingEntities, mapObjects); + CheckCollisionsE_LE(entities, livingEntities); + CheckCollisionsLE_LE(livingEntities); //entities dont move //Living entities dont move @@ -33,68 +34,88 @@ namespace DangerousD.GameCore.Managers //OnCollision } - public void CheckCollisions(List livingEntities, + private void CheckCollisionsLE_MO(List livingEntities, List mapObjects) { - LivingEntity currentEntity; - Rectangle oldRect; - for (int i = 0; i < livingEntities.Count; i++) + foreach (var currentEntity in livingEntities) { - currentEntity = livingEntities[i]; - oldRect = currentEntity.Rectangle; - bool isXNormalise = true; - bool isYNormalise = true; + var currentRect = currentEntity.Rectangle; + var newRect = currentRect; - oldRect.Offset((int)currentEntity.velocity.X, 0); - for (int j = 0; j < mapObjects.Count; j++) + #region x collision + var collidedX = false; + var tryingRectX = currentRect; + tryingRectX.Offset((int)Math.Ceiling(currentEntity.velocity.X), 0); + foreach (var mapObject in mapObjects) { - if (Math.Abs(mapObjects[i].Pos.X - currentEntity.Pos.X) < 550 && Math.Abs(mapObjects[i].Pos.Y - currentEntity.Pos.Y) < 550) + if ( + Math.Abs(mapObject.Pos.X - currentEntity.Pos.X) < 550 + && Math.Abs(mapObject.Pos.Y - currentEntity.Pos.Y) < 550 + && tryingRectX.Intersects(mapObject.Rectangle) + ) { - if (oldRect.Intersects(mapObjects[j].Rectangle)) - { - isXNormalise = false; - oldRect.Offset(-(int)currentEntity.velocity.X, 0); - break; - } - } - } - if (!isXNormalise) - currentEntity.velocity.X = 0; - - - oldRect.Offset(0, (int)currentEntity.velocity.Y); - for (int j = 0; j < mapObjects.Count; j++) - { - - if (oldRect.Intersects(mapObjects[j].Rectangle)) - { - isYNormalise = false; - oldRect.Offset(0, -(int)currentEntity.velocity.Y); + collidedX = true; break; } } - if (!isYNormalise) + if (collidedX) + { + currentEntity.velocity.X = 0; + } + else + { + newRect.X = tryingRectX.X; + } + #endregion + + #region y collision + var collidedY = false; + var tryingRectY = currentRect; + tryingRectY.Offset(0, (int)Math.Ceiling(currentEntity.velocity.Y)); + if (currentEntity is Player) + { + AppManager.Instance.DebugHUD.Set("velocity", currentEntity.velocity.ToString()); + AppManager.Instance.DebugHUD.Set("intersects y", ""); + } + foreach (var mapObject in mapObjects) + { + if (tryingRectY.Intersects(mapObject.Rectangle)) + { + if (currentEntity is Player) AppManager.Instance.DebugHUD.Set("intersects y", mapObject.GetType().ToString()); + collidedY = true; + break; + } + } + currentEntity.isOnGround = collidedY && currentEntity.velocity.Y > 0; + if (collidedY) + { currentEntity.velocity.Y = 0; - currentEntity.SetPosition(new Vector2(oldRect.X, oldRect.Y)); + } + else + { + newRect.Y = tryingRectY.Y; + } + #endregion + + currentEntity.SetPosition(new Vector2(newRect.X, newRect.Y)); } } - public void OnCollision(List entities, List livingEntities) + private void CheckCollisionsE_LE(List entities, List livingEntities) { - for (int i = 0; i < entities.Count; i++) + foreach (var entity in entities) { - for (int j = 0; j < livingEntities.Count; j++) + foreach (var livingEntity in livingEntities) { - if (livingEntities[j].Rectangle.Intersects(entities[i].Rectangle)) + if (livingEntity.Rectangle.Intersects(entity.Rectangle)) { - livingEntities[j].OnCollision(entities[i]); - entities[i].OnCollision(livingEntities[j]); + livingEntity.OnCollision(entity); + entity.OnCollision(livingEntity); } } } - } - public void OnCollision(List livingEntities) + private void CheckCollisionsLE_LE(List livingEntities) { for (int i = 0; i < livingEntities.Count; i++) { diff --git a/DangerousD/GameCore/Managers/SoundManager.cs b/DangerousD/GameCore/Managers/SoundManager.cs index 3a1e03f..7da1b17 100644 --- a/DangerousD/GameCore/Managers/SoundManager.cs +++ b/DangerousD/GameCore/Managers/SoundManager.cs @@ -40,6 +40,7 @@ namespace DangerousD.GameCore public void StartAmbientSound(string soundName) // запустить звук у которого нет позиции { + return; var sound = new Sound(Sounds[soundName]); sound.SoundEffect.IsLooped = false; sound.SoundEffect.Play();