diff --git a/AnimationsFileCreator/Program.cs b/AnimationsFileCreator/Program.cs
index bda2baf..9a712a0 100644
--- a/AnimationsFileCreator/Program.cs
+++ b/AnimationsFileCreator/Program.cs
@@ -5,6 +5,7 @@ using System;
using System.Windows.Forms;
using System.IO;
using System.Linq;
+using System.Reflection.Metadata;
namespace AnimationsFileCreator
{
@@ -62,7 +63,7 @@ namespace AnimationsFileCreator
container.TextureFrameInterval = 1;
container.Id = id;
string json = JsonConvert.SerializeObject(container);
- StreamWriter writer = new StreamWriter("../../../../DangerousD/Content/animations/" + id);
+ StreamWriter writer = new StreamWriter("../../../../DangerousD/Content/animations/"+id);
writer.WriteLine(json);
writer.Close();
}
diff --git a/DangerousD/Content/Content.mgcb b/DangerousD/Content/Content.mgcb
index 0ea387f..6729fe5 100644
--- a/DangerousD/Content/Content.mgcb
+++ b/DangerousD/Content/Content.mgcb
@@ -10,6 +10,7 @@
#-------------------------------- References --------------------------------#
+/reference:references/MonoGame.Extended.Content.Pipeline.dll
#---------------------------------- Content ---------------------------------#
@@ -83,6 +84,19 @@
/processorParam:TextureFormat=Color
/build:menuFon.jpg
+#begin MonstersAnimations.png
+#begin menuFon.jpg
+/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:menuFon.jpg
+
#begin MenuFon2.jpg
/importer:TextureImporter
/processor:TextureProcessor
@@ -107,7 +121,7 @@
/processorParam:TextureFormat=Color
/build:menuFon3.jpg
-#begin PC_Computer_Dangerous_Dave_In_The_Haunted_Mansion_Death_Sequences.png
+#begin tiles.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
@@ -117,7 +131,7 @@
/processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False
/processorParam:TextureFormat=Color
-/build:PC_Computer_Dangerous_Dave_In_The_Haunted_Mansion_Death_Sequences.png
+/build:tiles.png
#begin wall.jpg
/importer:TextureImporter
diff --git a/DangerousD/Content/animations/SilasAttack b/DangerousD/Content/animations/SilasAttack
new file mode 100644
index 0000000..4727523
--- /dev/null
+++ b/DangerousD/Content/animations/SilasAttack
@@ -0,0 +1,20 @@
+{
+ "id": "SilasAttack",
+ "textureName": "MonstersAnimations",
+ "startSpriteRectangle": {
+ "X": 1,
+ "Y": 618,
+ "Width": 72,
+ "Height": 80
+ },
+ "frameSecond": [
+ {
+ "Item1": 0,
+ "Item2": 5
+ }
+ ],
+ "textureFrameInterval": 1,
+ "framesCount": 2,
+ "isCycle": true,
+ "offset": "0, 0"
+}
diff --git a/DangerousD/Content/animations/SilasBallMove b/DangerousD/Content/animations/SilasBallMove
new file mode 100644
index 0000000..9a0b5f4
--- /dev/null
+++ b/DangerousD/Content/animations/SilasBallMove
@@ -0,0 +1 @@
+{"id":"SilasBallMove","textureName":"MonstersAnimations","startSpriteRectangle":{"X":147,"Y":618,"Width":24,"Height":24},"frameSecond":[{"Item1":0,"Item2":8}],"textureFrameInterval":1,"framesCount":2,"isCycle":true,"offset":"0, 0"}
diff --git a/DangerousD/Content/animations/SilasHandMove b/DangerousD/Content/animations/SilasHandMove
new file mode 100644
index 0000000..06589c3
--- /dev/null
+++ b/DangerousD/Content/animations/SilasHandMove
@@ -0,0 +1 @@
+{"id":"SilasHandMove","textureName":"MonstersAnimations","startSpriteRectangle":{"X":197,"Y":618,"Width":24,"Height":24},"frameSecond":[{"Item1":0,"Item2":8}],"textureFrameInterval":1,"framesCount":2,"isCycle":true,"offset":"0, 0"}
diff --git a/DangerousD/Content/animations/SilasMove b/DangerousD/Content/animations/SilasMove
new file mode 100644
index 0000000..334d3c5
--- /dev/null
+++ b/DangerousD/Content/animations/SilasMove
@@ -0,0 +1,20 @@
+{
+ "id": "SilasMove",
+ "textureName": "MonstersAnimations",
+ "startSpriteRectangle": {
+ "X": 1,
+ "Y": 618,
+ "Width": 72,
+ "Height": 80
+ },
+ "frameSecond": [
+ {
+ "Item1": 0,
+ "Item2": 60
+ }
+ ],
+ "textureFrameInterval": 1,
+ "framesCount": 2,
+ "isCycle": true,
+ "offset": "0, 0"
+}
diff --git a/DangerousD/Content/lvl.tmx b/DangerousD/Content/lvl.tmx
new file mode 100644
index 0000000..b81ea88
--- /dev/null
+++ b/DangerousD/Content/lvl.tmx
@@ -0,0 +1,759 @@
+
+
diff --git a/DangerousD/Content/map.tsx b/DangerousD/Content/map.tsx
new file mode 100644
index 0000000..288bb53
--- /dev/null
+++ b/DangerousD/Content/map.tsx
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/DangerousD/Content/tiles.png b/DangerousD/Content/tiles.png
new file mode 100644
index 0000000..3e35587
Binary files /dev/null and b/DangerousD/Content/tiles.png differ
diff --git a/DangerousD/Desktop/DangerousD map/map_0.mgcontent b/DangerousD/Desktop/DangerousD map/map_0.mgcontent
new file mode 100644
index 0000000..acc2649
--- /dev/null
+++ b/DangerousD/Desktop/DangerousD map/map_0.mgcontent
@@ -0,0 +1,16 @@
+
+
+ C:/Users/Semejkin_AV/Desktop/DangerousD map/map.tsx
+ 2023-08-16T13:04:13.796245+03:00
+ C:/Users/Semejkin_AV/Documents/Github_repos/DangerousD/DangerousD/Content/bin/DesktopGL/Content/../../../../../Desktop/DangerousD map/map_0.xnb
+ 2023-08-16T15:38:41.8125207+03:00
+ TiledMapTilesetImporter
+ 2023-07-14T20:14:40+03:00
+ TiledMapTilesetProcessor
+ 2023-07-14T20:14:40+03:00
+
+
+ C:/Users/Semejkin_AV/Documents/Github_repos/DangerousD/DangerousD/Content/bin/DesktopGL/Content/../../../../../Desktop/DangerousD map/tiles_0.xnb
+
+
+
\ No newline at end of file
diff --git a/DangerousD/Desktop/DangerousD map/tiles_0.mgcontent b/DangerousD/Desktop/DangerousD map/tiles_0.mgcontent
new file mode 100644
index 0000000..4cfff75
--- /dev/null
+++ b/DangerousD/Desktop/DangerousD map/tiles_0.mgcontent
@@ -0,0 +1,22 @@
+
+
+ C:/Users/Semejkin_AV/Desktop/DangerousD map/tiles.BMP
+ 2023-08-16T12:47:16.3453923+03:00
+ C:/Users/Semejkin_AV/Documents/Github_repos/DangerousD/DangerousD/Content/bin/DesktopGL/Content/../../../../../Desktop/DangerousD map/tiles_0.xnb
+ 2023-08-16T15:38:41.7865192+03:00
+ TextureImporter
+ 2022-07-26T14:44:56+03:00
+ TextureProcessor
+ 2022-07-26T14:44:56+03:00
+
+ ColorKeyColor
+ 0,0,0,0
+
+
+ ColorKeyEnabled
+ True
+
+
+
+
+
\ No newline at end of file
diff --git a/DangerousD/GameCore/GUI/AbstractGui.cs b/DangerousD/GameCore/GUI/AbstractGui.cs
index 24af331..7f7b212 100644
--- a/DangerousD/GameCore/GUI/AbstractGui.cs
+++ b/DangerousD/GameCore/GUI/AbstractGui.cs
@@ -17,9 +17,9 @@ public abstract class AbstractGui : IDrawableObject
protected abstract void CreateUI();
private GraphicsDevice graphicsDevice;
- public virtual void Initialize(GraphicsDevice graphicsDevice)
+ public virtual void Initialize()
{
- Manager.Initialize(graphicsDevice);
+ Manager.Initialize(AppManager.Instance.GraphicsDevice);
this.graphicsDevice = graphicsDevice;
CreateUI();
}
diff --git a/DangerousD/GameCore/GUI/LobbyGUI.cs b/DangerousD/GameCore/GUI/LobbyGUI.cs
index f782750..2927758 100644
--- a/DangerousD/GameCore/GUI/LobbyGUI.cs
+++ b/DangerousD/GameCore/GUI/LobbyGUI.cs
@@ -10,6 +10,7 @@ using System.Threading.Tasks;
using DangerousD.GameCore.Managers;
using MonogameLibrary.UI.Base;
using System.Diagnostics;
+using DangerousD.GameCore.Network;
namespace DangerousD.GameCore.GUI
{
@@ -32,8 +33,32 @@ namespace DangerousD.GameCore.GUI
Elements.Add(new Label(Manager) { rectangle = new Rectangle(screenWidth / 30 * 2, screenHeight / 30 * 5,
screenWidth / 30 * 26, screenHeight / 15 * 10) });
- // Buttons
+ // Buttons and ip textbox
{
+ TextBox searchBarTextBox = new TextBox(Manager)
+ {
+ rectangle = new Rectangle(screenWidth / 30 * 14, screenHeight / 30,
+ screenWidth / 30 * 10, screenHeight / 30 * 3),
+ text = "ip",
+ scale = 0.16f,
+ fontColor = Color.Gray,
+ fontName = "font2",
+ textAligment = TextAligment.Left
+
+ };
+ searchBarTextBox.TextChanged += input => {
+ if (searchBarTextBox.fontColor == Color.Gray)
+ {
+ searchBarTextBox.text = ""; searchBarTextBox.fontColor = Color.Black;
+ }
+ };
+ searchBarTextBox.StopChanging += input => {
+ if (input.Length == 0)
+ {
+ searchBarTextBox.fontColor = Color.Gray;
+ searchBarTextBox.text = "ip";
+ }
+ };
Button backButton = new ButtonText(Manager)
{
rectangle = new Rectangle(screenWidth / 30, screenHeight / 30, 60, 50),
@@ -55,7 +80,9 @@ namespace DangerousD.GameCore.GUI
fontName = "font2"
};
hostButton.LeftButtonPressed += () => {
-
+
+ AppManager.Instance.NetworkManager.HostInit(AppManager.Instance.IpAddress);
+
};
Button refreshButton = new ButtonText(Manager)
@@ -79,7 +106,7 @@ namespace DangerousD.GameCore.GUI
fontName = "font2"
};
joinSelectedButton.LeftButtonPressed += () => {
-
+ AppManager.Instance.NetworkManager.ClientInit(AppManager.Instance.IpAddress);
};
Button joinByIpButton = new ButtonText(Manager)
{
@@ -90,34 +117,7 @@ namespace DangerousD.GameCore.GUI
fontName = "font2"
};
joinByIpButton.LeftButtonPressed += () => {
-
- };
- }
-
- // SearchBar
- {
- TextBox searchBarTextBox = new TextBox(Manager) {
- rectangle = new Rectangle(screenWidth / 30 * 14, screenHeight / 30,
- screenWidth / 30 * 10, screenHeight / 30 * 3),
- text = "ip",
- scale = 0.16f,
- fontColor = Color.Gray,
- fontName = "font2",
- textAligment = TextAligment.Left
-
- };
- searchBarTextBox.TextChanged += input => {
- if (searchBarTextBox.fontColor == Color.Gray)
- {
- searchBarTextBox.text = ""; searchBarTextBox.fontColor = Color.Black;
- }
- };
- searchBarTextBox.StopChanging += input => {
- if (input.Length == 0)
- {
- searchBarTextBox.fontColor = Color.Gray;
- searchBarTextBox.text = "ip";
- }
+ AppManager.Instance.NetworkManager.ClientInit(searchBarTextBox.text);
};
}
}
diff --git a/DangerousD/GameCore/GUI/MenuGUI.cs b/DangerousD/GameCore/GUI/MenuGUI.cs
index f619d5f..b1ac08d 100644
--- a/DangerousD/GameCore/GUI/MenuGUI.cs
+++ b/DangerousD/GameCore/GUI/MenuGUI.cs
@@ -35,6 +35,7 @@ internal class MenuGUI : AbstractGui
butSingle.LeftButtonPressed += () =>
{
AppManager.Instance.ChangeGameState(GameState.Game);
+ AppManager.Instance.SetMultiplayerState(MultiPlayerStatus.SinglePlayer);
};
var butMulti = new ButtonText(Manager) { rectangle = new Rectangle((wigth - 300) / 2, 190, 300, 50), text = "Multiplayer", fontName = "ButtonFont" };
Elements.Add(butMulti);
diff --git a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs
new file mode 100644
index 0000000..b14d8af
--- /dev/null
+++ b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs
@@ -0,0 +1,36 @@
+using DangerousD.GameCore.Graphics;
+using Microsoft.Xna.Framework;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DangerousD.GameCore.GameObjects.Entities
+{
+ public class SilasBall : LivingEntity
+ {
+ public SilasBall(Vector2 position) : base(position)
+ {
+ Height = 60;
+ Width = 60;
+ acceleration = Vector2.Zero;
+
+ }
+ public SilasBall(Vector2 position, Vector2 velosity) : base(position)
+ {
+ Height = 60;
+ Width = 60;
+ acceleration = Vector2.Zero;
+ velocity = velosity;
+
+ }
+
+ protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "SilasBallMove" }, "SilasBallMove");
+ public override void Update(GameTime gameTime)
+ {
+ base.Update(gameTime);
+
+ }
+ }
+}
diff --git a/DangerousD/GameCore/GameObjects/Entity.cs b/DangerousD/GameCore/GameObjects/Entity.cs
index cf2caa9..8876e2c 100644
--- a/DangerousD/GameCore/GameObjects/Entity.cs
+++ b/DangerousD/GameCore/GameObjects/Entity.cs
@@ -7,12 +7,9 @@ using Microsoft.Xna.Framework.Graphics;
namespace DangerousD.GameCore.GameObjects
{
public abstract class Entity : GameObject
- {
-
-
+ {
public Entity(Vector2 position) : base(position) {}
-
+ public virtual void SetPosition(Vector2 position) { _pos = position; }
-
}
}
diff --git a/DangerousD/GameCore/GameObjects/GameObject.cs b/DangerousD/GameCore/GameObjects/GameObject.cs
index c354e3e..ae5cd2c 100644
--- a/DangerousD/GameCore/GameObjects/GameObject.cs
+++ b/DangerousD/GameCore/GameObjects/GameObject.cs
@@ -22,10 +22,12 @@ namespace DangerousD.GameCore
protected abstract GraphicsComponent GraphicsComponent { get; }
public GameObject(Vector2 pos)
{
+ Initialize();
_pos = pos;
Width = 500;
Height = 101;
//Animator = new GraphicsComponent(new() { "playerIdle" });
+
LoadContent();
AppManager.Instance.GameManager.Register(this);
}
@@ -34,7 +36,7 @@ namespace DangerousD.GameCore
{
}
- public virtual void Initialize(GraphicsDevice graphicsDevice)
+ public virtual void Initialize()
{
}
diff --git a/DangerousD/GameCore/GameObjects/IDrawableObject.cs b/DangerousD/GameCore/GameObjects/IDrawableObject.cs
index f157dcb..1d9ca5c 100644
--- a/DangerousD/GameCore/GameObjects/IDrawableObject.cs
+++ b/DangerousD/GameCore/GameObjects/IDrawableObject.cs
@@ -6,7 +6,7 @@ namespace DangerousD.GameCore.GUI
{
interface IDrawableObject
{
- void Initialize(GraphicsDevice graphicsDevice);
+ void Initialize();
void LoadContent();
void Update(GameTime gameTime);
void Draw(SpriteBatch spriteBatch);
diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs
index 6c13e1b..d16936a 100644
--- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs
+++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs
@@ -1,4 +1,8 @@
-using System;
+using DangerousD.GameCore.Graphics;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Content;
+using Microsoft.Xna.Framework.Graphics;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -6,7 +10,61 @@ using System.Threading.Tasks;
namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
{
- internal class SilasHands
+ public class SilasHands : CoreEnemy
{
+ public SilasHands(Vector2 position) : base(position)
+ {
+ name = "SilasHand";
+ Width = 48;
+ Height = 48;
+ monster_health = 2;
+ monster_speed = 2;
+ acceleration = Vector2.Zero;
+
+ }
+
+ protected override GraphicsComponent GraphicsComponent { get; }=new GraphicsComponent(new List() { "SilasHandMove" }, "SilasHandMove");
+
+ public override void Attack()
+ {
+ throw new NotImplementedException();
+ }
+
+ public override void Death()
+ {
+ throw new NotImplementedException();
+ }
+
+ public override void Move(GameTime gameTime)
+ {
+ if (Pos.Y> AppManager.Instance.GameManager.GetPlayer1.Pos.Y)
+ {
+ velocity.Y = -monster_speed;
+
+ }
+ else
+ {
+ velocity.Y = monster_speed;
+ }
+ if (Pos.X> AppManager.Instance.GameManager.GetPlayer1.Pos.X)
+ {
+ velocity.X = -monster_speed;
+ }
+ else
+ {
+ velocity.X = monster_speed;
+ }
+ }
+ public override void Update(GameTime gameTime)
+ {
+ base.Update(gameTime);
+ Move(gameTime);
+ if ((Pos.X + 20 <= AppManager.Instance.GameManager.GetPlayer1.Pos.X || Pos.X - 20 >= AppManager.Instance.GameManager.GetPlayer1.Pos.X)&&(Pos.Y + 20 <= AppManager.Instance.GameManager.GetPlayer1.Pos.Y || Pos.Y - 20 >= AppManager.Instance.GameManager.GetPlayer1.Pos.Y))
+ {
+
+ AppManager.Instance.GameManager.GetPlayer1.Death(name);
+ }
+ GraphicsComponent.Update();
+ }
}
}
diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs
index 4a5d727..d4fb5d2 100644
--- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs
+++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs
@@ -1,4 +1,9 @@
-using System;
+using DangerousD.GameCore.GameObjects.Entities;
+using DangerousD.GameCore.Graphics;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Content;
+using Microsoft.Xna.Framework.Graphics;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -6,7 +11,116 @@ using System.Threading.Tasks;
namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
{
- public class SilasMaster
+ public class SilasMaster : CoreEnemy
{
+ private int attackTime = 60;
+ private int moveTime = 360;
+ private int currentTime = 0;
+ private bool isGoRight = true;
+ int leftBorder;
+ int rightBorder;
+ List hands = new List();
+ List balls = new List();
+ public SilasMaster(Vector2 position) : base(position)
+ {
+ name = "SilasMaster";
+ Width = 144;
+ Height = 160;
+ monster_health = 15;
+ monster_speed = 4;
+ acceleration = Vector2.Zero;
+ leftBorder = (int)position.X - 60;
+ rightBorder = (int)position.X + 120;
+ acceleration = Vector2.Zero;
+ hands.Add(new SilasHands(new Vector2(Pos.X+60,Pos.Y+120)));
+ hands.Add(new SilasHands(new Vector2(Pos.X + 90, Pos.Y + 120)));
+ for (int i = 0; i < 4; i++)
+ {
+ SilasBall silasball = new SilasBall(new Vector2(Pos.X + i * 40, Pos.Y + 120), new Vector2((i - 2) * 4, 6));
+ balls.Add(silasball);
+ }
+ }
+ protected override GraphicsComponent GraphicsComponent { get; } = new GraphicsComponent(new List() { "SilasMove", "SilasAttack" }, "SilasMove");
+ public override void Attack()
+ {
+
+ if (currentTime == 0)
+ {
+ GraphicsComponent.StartAnimation("SilasAttack");
+
+ }
+ else if (currentTime == attackTime / 2)
+ {
+ SpawnAttackBall();
+ }
+ else if (currentTime >= attackTime)
+ {
+
+ GraphicsComponent.StartAnimation("SilasMove");
+ currentTime = 0;
+ }
+ currentTime++;
+ }
+ private void SpawnAttackBall()
+ {
+ for (int i = 0; i < balls.Count; i++)
+ {
+ balls[i].SetPosition(new Vector2(Pos.X + i * 40, Pos.Y + 120));
+ }
+
+
+ }
+ public override void Death()
+ {
+ throw new NotImplementedException();
+ }
+
+ public override void Move(GameTime gameTime)
+ {
+ if (currentTime == 0)
+ {
+ GraphicsComponent.StartAnimation("SilasMove");
+ }
+ else if (currentTime >= moveTime)
+ {
+ GraphicsComponent.StartAnimation("SilasAttack");
+ currentTime = 0;
+ }
+ currentTime++;
+ if (isGoRight)
+ {
+ velocity.X = monster_speed;
+ }
+ else if (!isGoRight)
+ {
+ velocity.X = -monster_speed;
+ }
+
+ if (Pos.X >= rightBorder)
+ {
+ isGoRight = false;
+ }
+ else if (Pos.X <= leftBorder)
+ {
+ isGoRight = true;
+ }
+ }
+ public override void Update(GameTime gameTime)
+ {
+ base.Update(gameTime);
+ if (hands.Count<2)
+ {
+ hands.Add(new SilasHands(new Vector2(Pos.X + 60, Pos.Y + 120)));
+ }
+ if (GraphicsComponent.CurrentAnimation.Id == "SilasMove")
+ {
+ Move(gameTime);
+ }
+ else
+ {
+ velocity = Vector2.Zero;
+ Attack();
+ }
+ }
}
}
diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs
index 34aa9d5..be2f7a2 100644
--- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs
+++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs
@@ -7,23 +7,27 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using DangerousD.GameCore.Managers;
namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
{
public class Zombie : CoreEnemy
{
private bool isGoRight = true;
- int leftBorder;
- int rightBorder;
+ float leftBorder;
+ float rightBorder;
bool isAttaking = false;
+ bool isTarget = false;
+ PhysicsManager physicsManager;
public Zombie(Vector2 position) : base(position)
{
- Width = 72;
- Height = 120;
+ Width = 24;
+ Height = 40;
monster_speed = 3;
name = "Zombie";
- leftBorder = (int)position.X - 60;
- rightBorder = (int)position.X + 120;
+ leftBorder = (int)position.X - 100;
+ rightBorder = (int)position.X + 100;
+ physicsManager = new PhysicsManager();
}
protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "ZombieMoveRight", "ZombieMoveLeft", "ZombieRightAttack", "ZombieLeftAttack" }, "ZombieMoveLeft");
@@ -31,6 +35,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
{
if (!isAttaking)
{
+ Target();
Move(gameTime);
}
@@ -106,5 +111,25 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
}
base.OnCollision(gameObject);
}
+
+ public void Target()
+ {
+ if(physicsManager.RayCast(this, AppManager.Instance.GameManager.players[0]) == null)
+ {
+ if(isGoRight && this._pos.X <= AppManager.Instance.GameManager.players[0].Pos.X)
+ {
+ isTarget = true;
+ leftBorder = Pos.X - 10;
+ rightBorder = Pos.X + AppManager.Instance.GameManager.players[0].Pos.X;
+ }
+
+ else if(!isGoRight && this._pos.X >= AppManager.Instance.GameManager.players[0].Pos.X)
+ {
+ isTarget = true;
+ rightBorder = Pos.X + 10;
+ leftBorder = AppManager.Instance.GameManager.players[0].Pos.X;
+ }
+ }
+ }
}
}
diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/DeathRectangle.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/DeathRectangle.cs
index 1ddaf45..1867b60 100644
--- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/DeathRectangle.cs
+++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/DeathRectangle.cs
@@ -20,6 +20,9 @@ namespace DangerousD.GameCore.GameObjects.PlayerDeath
protected override GraphicsComponent GraphicsComponent { get; } = new(new List {"DeathFromZombie"},
"DeathFromZombie");
+
+ public GraphicsComponent Gr => GraphicsComponent;
+
private void PlayDeath(string deathName)
{
if (GraphicsComponent.GetCurrentAnimation != "DeathFromZombie")
diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs
index 7b9c0d6..1cd7429 100644
--- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs
+++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs
@@ -16,10 +16,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
{
Width = 32;
Height = 64;
- GraphicsComponent.actionOfAnimationEnd += (a) =>
- {
- AppManager.Instance.ChangeGameState(GameState.GameOver);
- };
+ AppManager.Instance.InputManager.MovEventJump += AnimationJump;
}
public bool IsAlive { get { return isAlive; } }
@@ -35,9 +32,19 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
if(monsterName == "Zombie")
{
DeathRectangle deathRectangle = new DeathRectangle(Pos, "DeathFrom" + monsterName);
- GraphicsComponent.actionOfAnimationEnd("0");
+ deathRectangle.Gr.actionOfAnimationEnd += (a) =>
+ {
+ if (a == "DeathFrom" + monsterName)
+ {
+ AppManager.Instance.ChangeGameState(GameState.GameOver);
+ }
+ };
}
isAlive = false;
}
+ public void AnimationJump()
+ {
+ velocity.Y = -300;
+ }
}
}
diff --git a/DangerousD/GameCore/GameObjects/LivingEntity.cs b/DangerousD/GameCore/GameObjects/LivingEntity.cs
index 5c18831..8341080 100644
--- a/DangerousD/GameCore/GameObjects/LivingEntity.cs
+++ b/DangerousD/GameCore/GameObjects/LivingEntity.cs
@@ -11,7 +11,11 @@ public abstract class LivingEntity : Entity
{
acceleration = new Vector2(0, 30);
}
- public void SetPosition(Vector2 position) { targetPosition = position; _pos = position; } //TODO befrend targetpos and physics engine
+ public override void SetPosition(Vector2 position)
+ {
+ targetPosition = position; _pos = position;
+
+ } //TODO befrend targetpos and physics engine
public override void Update(GameTime gameTime)
{
diff --git a/DangerousD/GameCore/GameObjects/MapObject.cs b/DangerousD/GameCore/GameObjects/MapObject.cs
index d4180d0..24add79 100644
--- a/DangerousD/GameCore/GameObjects/MapObject.cs
+++ b/DangerousD/GameCore/GameObjects/MapObject.cs
@@ -1,13 +1,29 @@
-using Microsoft.Xna.Framework;
+using System.Collections.Generic;
+using Microsoft.Xna.Framework;
using System.Security.Cryptography.X509Certificates;
-
+using DangerousD.GameCore.Graphics;
+using Microsoft.Xna.Framework.Graphics;
namespace DangerousD.GameCore.GameObjects;
public abstract class MapObject : GameObject
{
public bool IsColliderOn;
- public MapObject(Vector2 position) : base(position)
+ private Rectangle _sourceRectangle;
+ protected override GraphicsComponent GraphicsComponent { get; } = new("tiles");
+ public MapObject(Vector2 position, Vector2 size, Rectangle sourceRectangle) : base(position)
+ {
+ _sourceRectangle = sourceRectangle;
+ Width = (int)size.X;
+ Height = (int)size.Y;
+ }
+
+ public override void Initialize()
{
}
+
+ public void Draw(SpriteBatch spriteBatch)
+ {
+ GraphicsComponent.DrawAnimation(Rectangle, spriteBatch, _sourceRectangle);
+ }
}
\ No newline at end of file
diff --git a/DangerousD/GameCore/GameObjects/MapObjects/GrassBlock.cs b/DangerousD/GameCore/GameObjects/MapObjects/GrassBlock.cs
deleted file mode 100644
index 3ada6f5..0000000
--- a/DangerousD/GameCore/GameObjects/MapObjects/GrassBlock.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using Microsoft.Xna.Framework;
-using Microsoft.Xna.Framework.Content;
-using Microsoft.Xna.Framework.Graphics;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using DangerousD.GameCore.Graphics;
-
-namespace DangerousD.GameCore.GameObjects.MapObjects
-{
- internal class GrassBlock : MapObject
- {
- protected override GraphicsComponent GraphicsComponent { get; } = new("wall");
-
- public GrassBlock(Vector2 position) : base(position)
- {
- Width = 32;
- Height = 32;
- }
- }
-}
diff --git a/DangerousD/GameCore/GameObjects/MapObjects/Platform.cs b/DangerousD/GameCore/GameObjects/MapObjects/Platform.cs
new file mode 100644
index 0000000..f3648f9
--- /dev/null
+++ b/DangerousD/GameCore/GameObjects/MapObjects/Platform.cs
@@ -0,0 +1,12 @@
+using DangerousD.GameCore.Graphics;
+using Microsoft.Xna.Framework;
+
+namespace DangerousD.GameCore.GameObjects.MapObjects;
+
+public class Platform : MapObject
+{
+ public Platform(Vector2 position, Vector2 size, Rectangle sourceRectangle) : base(position, size, sourceRectangle)
+ {
+ IsColliderOn = true;
+ }
+}
\ No newline at end of file
diff --git a/DangerousD/GameCore/GameObjects/MapObjects/StopTile.cs b/DangerousD/GameCore/GameObjects/MapObjects/StopTile.cs
new file mode 100644
index 0000000..096973b
--- /dev/null
+++ b/DangerousD/GameCore/GameObjects/MapObjects/StopTile.cs
@@ -0,0 +1,12 @@
+using DangerousD.GameCore.Graphics;
+using Microsoft.Xna.Framework;
+
+namespace DangerousD.GameCore.GameObjects.MapObjects;
+
+public class StopTile : MapObject
+{
+ public StopTile(Vector2 position, Vector2 size, Rectangle sourceRectangle) : base(position, size, sourceRectangle)
+ {
+ IsColliderOn = true;
+ }
+}
\ No newline at end of file
diff --git a/DangerousD/GameCore/GameObjects/MapObjects/TestAnimationDeath.cs b/DangerousD/GameCore/GameObjects/MapObjects/TestAnimationDeath.cs
deleted file mode 100644
index 8e9be4d..0000000
--- a/DangerousD/GameCore/GameObjects/MapObjects/TestAnimationDeath.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using DangerousD.GameCore.Graphics;
-using Microsoft.Xna.Framework;
-using Microsoft.Xna.Framework.Graphics;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace DangerousD.GameCore.GameObjects.MapObjects
-{
- internal class TestAnimationDeath : Entity
- {
- protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "death1", "deathbear" },"death1");
-
- public TestAnimationDeath(Vector2 position) : base(position)
- {
- Width =512;
- Height = 512;
-
- GraphicsComponent.StartAnimation("deathbear");
-
- }
- }
-}
diff --git a/DangerousD/GameCore/GameObjects/MapObjects/Tile.cs b/DangerousD/GameCore/GameObjects/MapObjects/Tile.cs
new file mode 100644
index 0000000..2b11dda
--- /dev/null
+++ b/DangerousD/GameCore/GameObjects/MapObjects/Tile.cs
@@ -0,0 +1,12 @@
+using DangerousD.GameCore.Graphics;
+using Microsoft.Xna.Framework;
+
+namespace DangerousD.GameCore.GameObjects.MapObjects;
+
+public class Tile : MapObject
+{
+ public Tile(Vector2 position, Vector2 size, Rectangle sourceRectangle) : base(position, size, sourceRectangle)
+ {
+ IsColliderOn = false;
+ }
+}
\ No newline at end of file
diff --git a/DangerousD/GameCore/Graphics/GraphicsComponent.cs b/DangerousD/GameCore/Graphics/GraphicsComponent.cs
index 6c86077..beb6928 100644
--- a/DangerousD/GameCore/Graphics/GraphicsComponent.cs
+++ b/DangerousD/GameCore/Graphics/GraphicsComponent.cs
@@ -11,12 +11,19 @@ namespace DangerousD.GameCore.Graphics
public class GraphicsComponent
{
- public Action actionOfAnimationEnd;
+ public event Action actionOfAnimationEnd;
private List animations;
private List textures;
private List texturesNames;
private AnimationContainer currentAnimation;
-
+ public AnimationContainer CurrentAnimation
+ {
+ get
+ {
+ return currentAnimation;
+ }
+ }
+ public string LastAnimation { get; set; }
public string GetCurrentAnimation
{
get { return currentAnimation.Id; }
@@ -26,16 +33,21 @@ namespace DangerousD.GameCore.Graphics
//private SpriteBatch _spriteBatch;
private int currentFrame;
+ public int CurrentFrame
+ {
+ get
+ {
+ return currentFrame;
+ }
+ }
private int interval;
private int lastInterval;
private Rectangle sourceRectangle;
-
public GraphicsComponent(List animationsId, string neitralAnimationId)
{
//this._spriteBatch = _spriteBatch;
currentFrame = 0;
lastInterval = 1;
-
LoadAnimations(animationsId, neitralAnimationId);
currentAnimation = neitralAnimation;
SetInterval();
diff --git a/DangerousD/GameCore/Levels/ILevel.cs b/DangerousD/GameCore/Levels/ILevel.cs
deleted file mode 100644
index 7fbec35..0000000
--- a/DangerousD/GameCore/Levels/ILevel.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace DangerousD.GameCore.Levels
-{
- interface ILevel
- {
- void InitLevel();
- }
-}
diff --git a/DangerousD/GameCore/Levels/Level1.cs b/DangerousD/GameCore/Levels/Level1.cs
deleted file mode 100644
index c3558d9..0000000
--- a/DangerousD/GameCore/Levels/Level1.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using DangerousD.GameCore.GameObjects.LivingEntities;
-using DangerousD.GameCore.GameObjects.MapObjects;
-using Microsoft.Xna.Framework;
-using DangerousD.GameCore.GameObjects.LivingEntities.Monsters;
-using System.Collections.Generic;
-
-namespace DangerousD.GameCore.Levels
-{
- public class Level1 : ILevel
- {
- public void InitLevel()
- {
- new Player(new Vector2(80,0));
- var Zombie = new Zombie(new Vector2(140, 128));
- var Frank = new Frank(new Vector2(384, 128));
-
- var Spider = new Spider(new Vector2(112, 0));
- var FlameSkull = new FlameSkull(new Vector2(512, 0));
- var Werewolf = new Werewolf(new Vector2(640, 0));
- var Ghost = new Ghost(new Vector2(730, 0));
- var FrankBalls = new FrankBalls(new Vector2(Frank.Pos.X, Frank.Pos.Y));
-
- new GrassBlock(new Vector2(0, 224));
- for (int i = 0; i < 50; i++)
- {
- new GrassBlock(new Vector2(i*32, 256));
- }
- new GrassBlock(new Vector2(500, 224));
- }
- }
-}
diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs
index ab061b9..f800998 100644
--- a/DangerousD/GameCore/Managers/AppManager.cs
+++ b/DangerousD/GameCore/Managers/AppManager.cs
@@ -14,12 +14,15 @@ using DangerousD.GameCore.Managers;
namespace DangerousD.GameCore
{
public enum GameState { Menu, Options, Lobby, Game, Login, GameOver }
+ public enum MultiPlayerStatus { SinglePlayer, Host, Client }
public class AppManager : Game
{
- public static AppManager Instance { get; private set; }
+ public static AppManager Instance { get; private set; }
+ public string IpAddress { get; private set; } = "127.0.0.1";
private GraphicsDeviceManager _graphics;
- private SpriteBatch _spriteBatch;
- GameState gameState;
+ private SpriteBatch _spriteBatch;
+ public GameState gameState { get; private set; }
+ public MultiPlayerStatus multiPlayerStatus { get; private set; } = MultiPlayerStatus.SinglePlayer;
IDrawableObject MenuGUI;
IDrawableObject OptionsGUI;
IDrawableObject LoginGUI;
@@ -28,7 +31,7 @@ namespace DangerousD.GameCore
public Point inGameResolution = new Point(800, 480);
private RenderTarget2D renderTarget;
- public GameManager GameManager { get; private set; } = new GameManager();
+ public GameManager GameManager { get; private set; } = new();
public AnimationBuilder AnimationBuilder { get; private set; } = new AnimationBuilder();
public NetworkManager NetworkManager { get; private set; } = new NetworkManager();
public InputManager InputManager { get; private set; } = new InputManager();
@@ -36,15 +39,17 @@ namespace DangerousD.GameCore
public SettingsManager SettingsManager { get; private set; } = new SettingsManager();
public AppManager()
{
+ Content.RootDirectory = "Content";
Instance = this;
_graphics = new GraphicsDeviceManager(this);
- Content.RootDirectory = "Content";
IsMouseVisible = true;
TargetElapsedTime = TimeSpan.FromMilliseconds(1000 / 30);
SettingsManager = new SettingsManager();
SettingsManager.LoadSettings();
+ NetworkManager.GetReceivingMessages += NetworkSync;
+
resolution = SettingsManager.Resolution;
_graphics.PreferredBackBufferWidth = resolution.X;
_graphics.PreferredBackBufferHeight = resolution.Y;
@@ -59,10 +64,11 @@ namespace DangerousD.GameCore
protected override void Initialize()
{
+ GameManager.Initialize();
AnimationBuilder.LoadAnimations();
- MenuGUI.Initialize(GraphicsDevice);
- LoginGUI.Initialize(GraphicsDevice);
- LobbyGUI.Initialize(GraphicsDevice);
+ MenuGUI.Initialize();
+ LoginGUI.Initialize();
+ LobbyGUI.Initialize();
base.Initialize();
}
@@ -160,12 +166,45 @@ namespace DangerousD.GameCore
case GameState.Lobby:
break;
case GameState.Game:
- GameManager.mapManager.LoadLevel("");
+ GameManager.mapManager.LoadLevel("lvl");
+ break;
+ case GameState.GameOver:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
+ public void NetworkSync(List networkTasks)
+ {
+ foreach (NetworkTask networkTask in networkTasks)
+ {
+ switch (networkTask.operation)
+ {
+ case NetworkTaskOperationEnum.TakeDamage:
+ break;
+ case NetworkTaskOperationEnum.SendSound:
+ SoundManager.StartSound(networkTask.name, networkTask.position, GameManager.GetPlayer1.Pos);
+ break;
+ case NetworkTaskOperationEnum.CreateEntity:
+ break;
+ case NetworkTaskOperationEnum.SendPosition:
+ break;
+ case NetworkTaskOperationEnum.ChangeState:
+ break;
+ case NetworkTaskOperationEnum.ConnectToHost:
+ break;
+ case NetworkTaskOperationEnum.GetClientPlayerId:
+ break;
+ default:
+ break;
+ }
+ }
+
+ }
+ public void SetMultiplayerState(MultiPlayerStatus multiPlayerStatus)
+ {
+ this.multiPlayerStatus = multiPlayerStatus;
+ }
}
}
diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs
index 55d83c2..f2ce8c8 100644
--- a/DangerousD/GameCore/Managers/GameManager.cs
+++ b/DangerousD/GameCore/Managers/GameManager.cs
@@ -7,15 +7,17 @@ using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using System.Text;
+using DangerousD.GameCore.GameObjects.LivingEntities.Monsters;
namespace DangerousD.GameCore
{
public class GameManager
{
-
+ public List GetAllGameObjects { get; private set; }
public List livingEntities;
public List entities;
public List mapObjects;
+ public List others;
public MapManager mapManager;
public PhysicsManager physicsManager;
public List players;
@@ -23,13 +25,23 @@ namespace DangerousD.GameCore
public Player GetPlayer1 { get; private set; }
public GameManager()
{
+ others = new List();
+ GetAllGameObjects = new List();
livingEntities = new List();
mapObjects = new List();
entities = new List();
players = new List();
- mapManager = new MapManager();
+ mapManager = new MapManager(1);
physicsManager = new PhysicsManager();
- mapManager.Init();
+ }
+
+ public void Initialize()
+ {
+ //mapManager.LoadLevel("Level1");
+ }
+
+ public void LoadContent()
+ {
}
internal void Register(GameObject gameObject)
@@ -76,8 +88,11 @@ namespace DangerousD.GameCore
item.Update(gameTime);
foreach (var item in entities)
item.Update(gameTime);
- foreach (var item in livingEntities)
- item.Update(gameTime);
+
+ for (int i = 0; i < livingEntities.Count; i++)
+ {
+ livingEntities[i].Update(gameTime);
+ }
foreach (var item in otherObjects)
item.Update(gameTime);
@@ -86,4 +101,4 @@ namespace DangerousD.GameCore
}
}
-}
\ No newline at end of file
+}
diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs
index f5c9d28..36a0f6b 100644
--- a/DangerousD/GameCore/Managers/MapManager.cs
+++ b/DangerousD/GameCore/Managers/MapManager.cs
@@ -1,26 +1,115 @@
-using DangerousD.GameCore.GameObjects;
-using DangerousD.GameCore.Graphics;
-using DangerousD.GameCore.Levels;
-using System;
+using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Linq;
-using System.Net.Security;
-using System.Text;
-using System.Threading.Tasks;
+using System.Xml;
+using DangerousD.GameCore.GameObjects.MapObjects;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using System.Xml.Serialization;
+using DangerousD.GameCore.GameObjects;
namespace DangerousD.GameCore.Managers
{
public class MapManager
{
- ILevel Level;
- public void Init()
+ private int _columns;
+ private int _scale;
+
+ public MapManager(int scale)
{
- Level = new Level1();
+ _scale = scale;
}
+
//Level
public void LoadLevel(string level)
{
- Level.InitLevel();
+ LoadTilesData();
+
+ XmlDocument xml = new();
+ xml.Load($"../../../Content/{level}.tmx");
+ Vector2 tileSize = new(int.Parse(xml.DocumentElement.Attributes["tilewidth"].Value),
+ int.Parse(xml.DocumentElement.Attributes["tileheight"].Value));
+ //tileSize *= _scale;
+
+ foreach (XmlNode layer in xml.DocumentElement.SelectNodes("layer"))
+ {
+ InstantiateTiles(layer, tileSize);
+ }
+
+ foreach (XmlNode layer in xml.DocumentElement.SelectNodes("objectgroup"))
+ {
+ InstantiateEntities(layer);
+ }
+ }
+
+ private void InstantiateTiles(XmlNode layer, Vector2 tileSize)
+ {
+ string tileType = layer.Attributes["class"].Value;
+ float offsetX = layer.Attributes["offsetx"] is not null ? float.Parse(layer.Attributes["offsetx"].Value) : 0;
+ float offsetY = layer.Attributes["offsety"] is not null ? float.Parse(layer.Attributes["offsety"].Value) : 0;
+
+
+ Debug.Write(layer.SelectNodes("data/chunk").Count);
+ foreach (XmlNode chunk in layer.SelectNodes("data/chunk"))
+ {
+ int chunkW = int.Parse(chunk.Attributes["width"].Value);
+ int chunkX = int.Parse(chunk.Attributes["x"].Value);
+ int chunkY = int.Parse(chunk.Attributes["y"].Value);
+
+
+ List tiles = chunk.InnerText.Split(',').Select(int.Parse).ToList();
+ for (int i = 0; i < tiles.Count; i++)
+ {
+ if (tiles[i] != 0)
+ {
+ Vector2 pos = new(((chunkX+ i % chunkW) * tileSize.X + offsetX) * _scale,
+ ((chunkY + i / chunkW) * tileSize.Y + offsetY) * _scale);
+ //pos *= _scale;
+ Rectangle sourceRect = new(new Point((tiles[i] -1) % _columns, (tiles[i] -1) / _columns) * tileSize.ToPoint(), tileSize.ToPoint());
+ Type type = Type.GetType($"DangerousD.GameCore.GameObjects.MapObjects.{tileType}");
+ Activator.CreateInstance(type, pos, tileSize * _scale, sourceRect);
+
+ /*switch (tileType)
+ {
+ case "collidable":
+ new StopTile(pos, tileSize * _scale, sourceRect);
+ break;
+ case "platform":
+ new Platform(pos, tileSize * _scale, sourceRect);
+ break;
+ case "non_collidable":
+ new Tile(pos, tileSize * _scale, sourceRect);
+ break;
+ }*/
+ }
+
+ }
+ }
+ }
+
+ private void LoadTilesData()
+ {
+ XmlDocument xml = new();
+ xml.Load($"../../../Content/map.tsx");
+ XmlNode root = xml.DocumentElement;
+
+ _columns = int.Parse(root.Attributes["columns"].Value);
+ }
+
+ private void InstantiateEntities(XmlNode group)
+ {
+ string entityType = group.Attributes["class"].Value;
+ float offsetX = group.Attributes["offsetx"] is not null ? float.Parse(group.Attributes["offsetx"].Value) : 0;
+ float offsetY = group.Attributes["offsety"] is not null ? float.Parse(group.Attributes["offsety"].Value) : 0;
+ foreach (XmlNode entity in group.ChildNodes)
+ {
+ Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityType}");
+ Entity inst = (Entity)Activator.CreateInstance(type, new Vector2(float.Parse(entity.Attributes["x"].Value) + offsetX, float.Parse(entity.Attributes["y"].Value) + offsetY) * _scale);
+ inst.SetPosition(new Vector2(inst.Pos.X, inst.Pos.Y - inst.Height));
+ inst.Height *= _scale;
+ inst.Width *= _scale;
+ }
}
}
}
diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs
index 7ae99f9..28ecf14 100644
--- a/DangerousD/GameCore/Managers/PhysicsManager.cs
+++ b/DangerousD/GameCore/Managers/PhysicsManager.cs
@@ -136,7 +136,7 @@ namespace DangerousD.GameCore.Managers
Rectangle rectangle;
Vector2 distance = entity1.Pos - entity2.Pos;
- rectangle = new Rectangle((int)entity1.Pos.X, (int)entity1.Pos.Y, entity2.Width, entity2.Height);
+ rectangle = new Rectangle((int)entity1.Pos.X, (int)entity1.Pos.Y - 5, entity2.Width, entity2.Height);
GameObject gameObject = null;
double length = distance.Length();
@@ -144,30 +144,36 @@ namespace DangerousD.GameCore.Managers
{
rectangle.X = (int)(entity2.Pos.X + (i / length) * distance.X);
rectangle.Y = (int)(entity2.Pos.Y + (i / length) * distance.Y);
- }
-
- for (int i = 0; i < AppManager.Instance.GameManager.entities.Count; i++)
- {
- if (AppManager.Instance.GameManager.entities[i].Rectangle.Intersects(rectangle))
+ if (i == length - 1)
{
- return AppManager.Instance.GameManager.entities[i];
+ return null;
}
- }
- for (int i = 0; i < AppManager.Instance.GameManager.mapObjects.Count; i++)
- {
- if (AppManager.Instance.GameManager.mapObjects[i].Rectangle.Intersects(rectangle))
+ for (int j = 0; j < AppManager.Instance.GameManager.entities.Count; j++)
{
- return AppManager.Instance.GameManager.mapObjects[i];
+ if (AppManager.Instance.GameManager.entities[j].Rectangle.Intersects(rectangle))
+ {
+ gameObject = AppManager.Instance.GameManager.entities[j];
+ }
+ }
+ for (int r = 0; r < AppManager.Instance.GameManager.mapObjects.Count; r++)
+ {
+ if (AppManager.Instance.GameManager.mapObjects[r].Rectangle.Intersects(rectangle))
+ {
+ gameObject = AppManager.Instance.GameManager.mapObjects[r];
+ }
+ }
+ for (int w = 0; w < AppManager.Instance.GameManager.livingEntities.Count; w++)
+ {
+ if (AppManager.Instance.GameManager.livingEntities[w].Rectangle.Intersects(rectangle))
+ {
+ gameObject = AppManager.Instance.GameManager.livingEntities[w];
+ }
}
}
-
- for (int i = 0; i < AppManager.Instance.GameManager.livingEntities.Count; i++)
+ if (gameObject == entity1)
{
- if (AppManager.Instance.GameManager.livingEntities[i].Rectangle.Intersects(rectangle))
- {
- return AppManager.Instance.GameManager.livingEntities[i];
- }
+ return null;
}
return gameObject;
}
@@ -176,35 +182,57 @@ namespace DangerousD.GameCore.Managers
Rectangle rectangle;
Vector2 direction = entity1.Pos - targetCast;
rectangle = new Rectangle((int)targetCast.X, (int)targetCast.Y, 1, 1);
+ GameObject gameObject = null;
double k = direction.Length();
for (int i = 0; i < k; i++)
{
rectangle.X = (int)(targetCast.X + (i / k) * direction.X);
rectangle.Y = (int)(targetCast.Y + (i / k) * direction.X);
- }
- for (int i = 0; i < AppManager.Instance.GameManager.entities.Count; i++)
- {
- if (AppManager.Instance.GameManager.entities[i].Rectangle.Intersects(rectangle))
+ for (int j = 0; j < AppManager.Instance.GameManager.entities.Count; j++)
{
- return AppManager.Instance.GameManager.entities[i];
+ if (AppManager.Instance.GameManager.entities[j].Rectangle.Intersects(rectangle))
+ {
+ gameObject = AppManager.Instance.GameManager.entities[j];
+ }
+ }
+ for (int r = 0; r < AppManager.Instance.GameManager.mapObjects.Count; r++)
+ {
+ if (AppManager.Instance.GameManager.mapObjects[r].Rectangle.Intersects(rectangle))
+ {
+ gameObject = AppManager.Instance.GameManager.mapObjects[r];
+ }
+ }
+ for (int w = 0; w < AppManager.Instance.GameManager.livingEntities.Count; w++)
+ {
+ if (AppManager.Instance.GameManager.livingEntities[w].Rectangle.Intersects(rectangle))
+ {
+ gameObject = AppManager.Instance.GameManager.livingEntities[w];
+ }
}
}
- for (int i = 0; i < AppManager.Instance.GameManager.mapObjects.Count; i++)
+ if (gameObject == entity1)
{
- if (AppManager.Instance.GameManager.mapObjects[i].Rectangle.Intersects(rectangle))
+ return null;
+ }
+ return gameObject;
+ }
+
+ public List CheckRectangle(Rectangle rectangle, Type type)
+ {
+ var gameObjects = AppManager.Instance.GameManager.GetAllGameObjects;
+ List intersected = new List();
+ for (int i = 0; i < gameObjects.Count; i++)
+ {
+ if (gameObjects[i].GetType() == type)
{
- return AppManager.Instance.GameManager.mapObjects[i];
+ if (gameObjects[i].Rectangle.Intersects(rectangle))
+ {
+ intersected.Add(gameObjects[i]);
+ }
}
}
- for (int i = 0; i < AppManager.Instance.GameManager.livingEntities.Count; i++)
- {
- if (AppManager.Instance.GameManager.livingEntities[i].Rectangle.Intersects(rectangle))
- {
- return AppManager.Instance.GameManager.livingEntities[i];
- }
- }
- return null;
+ return intersected;
}
}
}
\ No newline at end of file
diff --git a/DangerousD/GameCore/Managers/SoundManager.cs b/DangerousD/GameCore/Managers/SoundManager.cs
index 92feea5..aed8571 100644
--- a/DangerousD/GameCore/Managers/SoundManager.cs
+++ b/DangerousD/GameCore/Managers/SoundManager.cs
@@ -38,8 +38,11 @@ namespace DangerousD.GameCore
sound.SoundEffect.IsLooped = false;
sound.SoundEffect.Play();
PlayingSounds.Add(sound);
+ if (AppManager.Instance.multiPlayerStatus == MultiPlayerStatus.Host)
+ {
+ AppManager.Instance.NetworkManager.SendMsg(new Network.NetworkTask(Vector2.Zero, soundName));
+ }
}
-
public void StartSound(string soundName, Vector2 soundPos, Vector2 playerPos) // запустить звук у которого есть позиция
{
var sound = new Sound(Sounds[soundName], soundPos);
@@ -47,6 +50,10 @@ namespace DangerousD.GameCore
sound.SoundEffect.Volume = (float)sound.GetDistance(playerPos) / MaxSoundDistance;
sound.SoundEffect.Play();
PlayingSounds.Add(sound);
+ if (AppManager.Instance.multiPlayerStatus == MultiPlayerStatus.Host)
+ {
+ AppManager.Instance.NetworkManager.SendMsg(new Network.NetworkTask(soundPos, soundName));
+ }
}
public void StopAllSounds() // остановка всех звуков
{
diff --git a/DangerousD/GameCore/Network/NetworkManager.cs b/DangerousD/GameCore/Network/NetworkManager.cs
index b56f9f1..caf16a1 100644
--- a/DangerousD/GameCore/Network/NetworkManager.cs
+++ b/DangerousD/GameCore/Network/NetworkManager.cs
@@ -10,7 +10,7 @@ namespace DangerousD.GameCore.Network
{
public class NetworkManager
{
- public delegate void ReceivingHandler(NetworkTask networkTask);
+ public delegate void ReceivingHandler(List networkTask);
public event ReceivingHandler GetReceivingMessages;
@@ -21,20 +21,27 @@ namespace DangerousD.GameCore.Network
private void Init(string IpAddress)
{
- socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- IPAddress address = IPAddress.Parse(IpAddress);
- int port = 8000;
- endPoint = new IPEndPoint(address, port);
+ try
+ {
+ socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ IPAddress address = IPAddress.Parse(IpAddress);
+ int port = 8000;
+ endPoint = new IPEndPoint(address, port);
+ }
+ catch { }
}
private void AcceptSockets()
{
while (true)
{
- Socket clientSocket = socket.Accept();
- clientSockets.Add(clientSocket);
- Thread receiveThread = new Thread(BeginHostReceive);
- receiveThread.Start(clientSocket);
- Console.WriteLine("Connected");
+ try
+ {
+ Socket clientSocket = socket.Accept();
+ clientSockets.Add(clientSocket);
+ Thread receiveThread = new Thread(BeginHostReceive);
+ receiveThread.Start(clientSocket);
+ }
+ catch { }
}
}
@@ -43,77 +50,104 @@ namespace DangerousD.GameCore.Network
Socket clientSocket = clSocket as Socket;
while (clientSocket != null)
{
- byte[] bytesCount = new byte[4];
- clientSocket.Receive(bytesCount);
- byte[] Data = new byte[BitConverter.ToInt32(bytesCount)];
- StateObject so = new StateObject(clientSocket, Data);
- IAsyncResult count = clientSocket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, AsyncReceiveCallback, so);
+ try
+ {
+ byte[] bytesCount = new byte[4];
+ clientSocket.Receive(bytesCount);
+ byte[] Data = new byte[BitConverter.ToInt32(bytesCount)];
+ StateObject so = new StateObject(clientSocket, Data);
+ IAsyncResult count = clientSocket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, AsyncReceiveCallback, so);
+ }
+ catch { }
}
}
public void HostInit(string IpAddress)
{
- Init(IpAddress);
- socket.Bind(endPoint);
- socket.Listen(4);
- Thread acceptThread = new Thread(AcceptSockets);
- acceptThread.Start();
- state = "Host";
- Console.WriteLine("Start Accept");
+ try
+ {
+ Init(IpAddress);
+ socket.Bind(endPoint);
+ socket.Listen(4);
+ Thread acceptThread = new Thread(AcceptSockets);
+ acceptThread.Start();
+ state = "Host";
+ }
+ catch { }
}
public void ClientInit(string IpAddress)
{
- Init(IpAddress);
- socket.Connect(endPoint);
- state = "Client";
- Thread.Sleep(10);
- Thread ReceivingThread = new Thread(ReceiveMsgFromHost);
- ReceivingThread.Start();
+ try
+ {
+ Init(IpAddress);
+ socket.Connect(endPoint);
+ state = "Client";
+ Thread.Sleep(10);
+ Thread ReceivingThread = new Thread(ReceiveMsgFromHost);
+ ReceivingThread.Start();
+ }
+ catch { }
}
public void SendMsg(NetworkTask networkTask)
- {
+ {
byte[] Data = Encoding.Unicode.GetBytes(JsonConvert.SerializeObject(networkTask));
int count = Data.Length;
if (state == "Host")
{
- foreach (Socket socket in clientSockets)
+ try
+ {
+ foreach (Socket socket in clientSockets)
+ {
+ socket.Send(BitConverter.GetBytes(count));
+ socket.Send(Data);
+ }
+ }
+ catch { }
+ }
+ else
+ {
+ try
{
socket.Send(BitConverter.GetBytes(count));
socket.Send(Data);
}
- }
- else
- {
- socket.Send(BitConverter.GetBytes(count));
- socket.Send(Data);
+ catch { }
}
}
private void ReceiveMsgFromHost()
{
while (true)
{
- byte[] bytesCount = new byte[4];
- socket.Receive(bytesCount);
- byte[] Data = new byte[BitConverter.ToInt32(bytesCount)];
- StateObject so = new StateObject(socket, Data);
- IAsyncResult count = socket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, AsyncReceiveCallback, so);
+ try
+ {
+ byte[] bytesCount = new byte[4];
+ socket.Receive(bytesCount);
+ byte[] Data = new byte[BitConverter.ToInt32(bytesCount)];
+ StateObject so = new StateObject(socket, Data);
+ IAsyncResult count = socket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, AsyncReceiveCallback, so);
+ }
+ catch { }
}
}
private void AsyncReceiveCallback(IAsyncResult ar)
{
- StateObject so = ar.AsyncState as StateObject;
- Socket clientSocket = so.workSocket;
- int readCount = clientSocket.EndReceive(ar);
- so.UploadedBytesCount += readCount;
- so.sb.Append(Encoding.Unicode.GetString(so.buffer, 0, readCount));
- if (so.UploadedBytesCount < so.bufferSize)
+ try
{
- clientSocket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, new AsyncCallback(AsyncReceiveCallback), so);
- }
- else
- {
- GetReceivingMessages(JsonConvert.DeserializeObject(so.sb.ToString()));
+ StateObject so = ar.AsyncState as StateObject;
+ Socket clientSocket = so.workSocket;
+ int readCount = clientSocket.EndReceive(ar);
+ so.UploadedBytesCount += readCount;
+ so.sb.Append(Encoding.Unicode.GetString(so.buffer, 0, readCount));
+ if (so.UploadedBytesCount < so.bufferSize)
+ {
+ clientSocket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, new AsyncCallback(AsyncReceiveCallback), so);
+ }
+ else
+ {
+ GetReceivingMessages(JsonConvert.DeserializeObject>(so.sb.ToString()));
+ }
}
+ catch { }
}
}
}
diff --git a/DangerousD/GameCore/Network/NetworkTask.cs b/DangerousD/GameCore/Network/NetworkTask.cs
index a1fb999..1dbb508 100644
--- a/DangerousD/GameCore/Network/NetworkTask.cs
+++ b/DangerousD/GameCore/Network/NetworkTask.cs
@@ -13,6 +13,7 @@ namespace DangerousD.GameCore.Network
public NetworkTaskOperationEnum operation { get; set; }
public string name { get; set; }
public int value { get; set; }
+ public bool isParam { get; set; }
public int objId { get; set; }
public Vector2 position { get; set; }
public Vector2 velocity { get; set; }
@@ -102,5 +103,28 @@ namespace DangerousD.GameCore.Network
operation = NetworkTaskOperationEnum.GetClientPlayerId;
objId = PlayerId;
}
+
+ ///
+ /// Универсальный конструктор для нестандартных операций. То, что не нужно(кроме операции) делать null.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public NetworkTask(NetworkTaskOperationEnum operation, string name, int value, bool isParam, int objId, Vector2 position, Vector2 velocity, Type type)
+ {
+ this.operation = operation;
+ this.name = name;
+ this.value = value;
+ this.isParam = isParam;
+ this.objId = objId;
+ this.position = position;
+ this.velocity = velocity;
+ this.type = type;
+ }
}
}
diff --git a/NuGet.config b/NuGet.config
new file mode 100644
index 0000000..90dab50
--- /dev/null
+++ b/NuGet.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file