Merge branch 'DevelopmentX' into exitzone

This commit is contained in:
SergoDobro 2024-08-20 18:00:17 +03:00 committed by GitHub
commit d7e3ff1b06
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
98 changed files with 1610 additions and 539 deletions

View file

@ -18,6 +18,7 @@ namespace MonogameLibrary.UI.Base
public string textureName = ""; public string textureName = "";
public Rectangle rectangle = new Rectangle(0, 0, 10, 10); public Rectangle rectangle = new Rectangle(0, 0, 10, 10);
public Color mainColor = Color.White; public Color mainColor = Color.White;
public bool sus = true;
public DrawableUIElement(UIManager manager, int layerIndex = 0, string textureName = "") public DrawableUIElement(UIManager manager, int layerIndex = 0, string textureName = "")
{ {
@ -29,6 +30,7 @@ namespace MonogameLibrary.UI.Base
{ {
if (textureName == "") if (textureName == "")
{ {
sus = false;
texture = new Texture2D(Manager.GraphicsDevice, 1, 1); texture = new Texture2D(Manager.GraphicsDevice, 1, 1);
texture.SetData<Color>(new Color[] { mainColor }); texture.SetData<Color>(new Color[] { mainColor });
} }

View file

@ -18,7 +18,7 @@ public class Bar : DrawableUIElement
public float percent = 0.5f; public float percent = 0.5f;
private DrawableUIElement barInside; private DrawableUIElement barInside;
public Color inColor; public Color inColor;
public string inTextureName; public string inTextureName = "";
public Bar(UIManager manager, int layerIndex = 0, string textureName = "") : base(manager, layerIndex, textureName) public Bar(UIManager manager, int layerIndex = 0, string textureName = "") : base(manager, layerIndex, textureName)
{ {
@ -30,8 +30,7 @@ public class Bar : DrawableUIElement
{ {
rectangle = new Rectangle(rectangle.X + rectangle.Height / 8, rectangle.Y + rectangle.Height / 8, rectangle = new Rectangle(rectangle.X + rectangle.Height / 8, rectangle.Y + rectangle.Height / 8,
(int)((rectangle.Width - rectangle.Height / 4) * percent), rectangle.Height / 8 * 7), (int)((rectangle.Width - rectangle.Height / 4) * percent), rectangle.Height / 8 * 7),
mainColor = inColor, mainColor = inColor
textureName = inTextureName
}; };
} }

View file

@ -29,6 +29,7 @@ public class ItemDisplayButton : Button
private ContentManager content; private ContentManager content;
public string discriptions1; public string discriptions1;
public Dictionary<string, int> resourcesNeededToCraft1; public Dictionary<string, int> resourcesNeededToCraft1;
public TextAligment TextAligment = TextAligment.Left;
public ItemDisplayButton(UIManager manager) : base(manager) public ItemDisplayButton(UIManager manager) : base(manager)
@ -46,7 +47,7 @@ public class ItemDisplayButton : Button
Label itemName = new Label(Manager) Label itemName = new Label(Manager)
{ {
rectangle = new Rectangle(rectangle.X + rectangle.Height / 3 / 2 + rectangle.Height / 3 * 2, rectangle.Y + rectangle.Height / 3 / 2, rectangle.Width / 3, rectangle.Height / 3 * 2), rectangle = new Rectangle(rectangle.X + rectangle.Height / 3 / 2 + rectangle.Height / 3 * 2, rectangle.Y + rectangle.Height / 3 / 2, rectangle.Width / 3, rectangle.Height / 3 * 2),
fontColor = fontColor1, text = text1, scale = scale1, fontName = fontName1, mainColor = Color.Transparent fontColor = fontColor1, text = text1, scale = scale1, fontName = fontName1, mainColor = Color.Transparent, textAligment = TextAligment
}; };
Label itemCount = new Label(Manager) Label itemCount = new Label(Manager)
{ {
@ -87,6 +88,10 @@ public class ItemDisplayButton : Button
{ {
if (presentState != hoverState) if (presentState != hoverState)
{ {
if (resourcesNeededToCraft1 == null)
{
resourcesNeededToCraft1 = new Dictionary<string, int>();
}
hoverWindow = new HoverWindow(Manager) hoverWindow = new HoverWindow(Manager)
{ {
rectangle = new Rectangle(Mouse.GetState().Position.X, Mouse.GetState().Position.Y, rectangle.Width, rectangle.Height * 10), rectangle = new Rectangle(Mouse.GetState().Position.X, Mouse.GetState().Position.Y, rectangle.Width, rectangle.Height * 10),
@ -97,7 +102,8 @@ public class ItemDisplayButton : Button
fontColor2 = fontColor1, fontColor2 = fontColor1,
fontName2 = fontName1, fontName2 = fontName1,
scale2 = scale1, scale2 = scale1,
itemTextureName1 = itemTextureName itemTextureName1 = itemTextureName,
textureName = "Textures/GUI/Back"
}; };
hoverWindow.Initialize(content); hoverWindow.Initialize(content);
hoverWindow.LoadTexture(content); hoverWindow.LoadTexture(content);

View file

@ -30,6 +30,7 @@ public class ItemDisplayLabel : DrawableUIElement
public Dictionary<string, int> resourcesNeededToCraft1; public Dictionary<string, int> resourcesNeededToCraft1;
public HoverState hoverState = HoverState.None; public HoverState hoverState = HoverState.None;
private ContentManager content; private ContentManager content;
public TextAligment TextAligment = TextAligment.Left;
public ItemDisplayLabel(UIManager manager) : base(manager) public ItemDisplayLabel(UIManager manager) : base(manager)
@ -47,7 +48,7 @@ public class ItemDisplayLabel : DrawableUIElement
Label itemName = new Label(Manager) Label itemName = new Label(Manager)
{ {
rectangle = new Rectangle(rectangle.X + rectangle.Height / 3 / 2 + rectangle.Height / 3 * 2, rectangle.Y + rectangle.Height / 3 / 2, rectangle.Width / 3, rectangle.Height / 3 * 2), rectangle = new Rectangle(rectangle.X + rectangle.Height / 3 / 2 + rectangle.Height / 3 * 2, rectangle.Y + rectangle.Height / 3 / 2, rectangle.Width / 3, rectangle.Height / 3 * 2),
fontColor = fontColor1, text = text1, scale = scale1, fontName = fontName1, mainColor = Color.Transparent fontColor = fontColor1, text = text1, scale = scale1, fontName = fontName1, mainColor = Color.Transparent, textAligment = TextAligment
}; };
Label itemCount = new Label(Manager) Label itemCount = new Label(Manager)
{ {
@ -110,7 +111,8 @@ public class ItemDisplayLabel : DrawableUIElement
fontColor2 = fontColor1, fontColor2 = fontColor1,
fontName2 = fontName1, fontName2 = fontName1,
scale2 = scale1, scale2 = scale1,
itemTextureName1 = itemTextureName itemTextureName1 = itemTextureName,
textureName = "Textures/GUI/Back"
}; };
hoverWindow.Initialize(content); hoverWindow.Initialize(content);
hoverWindow.LoadTexture(content); hoverWindow.LoadTexture(content);

View file

@ -59,6 +59,36 @@
#begin MapData/TileSets/TilesetNature.tsj #begin MapData/TileSets/TilesetNature.tsj
/copy:MapData/TileSets/TilesetNature.tsj /copy:MapData/TileSets/TilesetNature.tsj
#begin sounds/Background menu music.wav
/importer:WavImporter
/processor:SoundEffectProcessor
/processorParam:Quality=Best
/build:sounds/Background menu music.wav
#begin sounds/Background music.wav
/importer:WavImporter
/processor:SoundEffectProcessor
/processorParam:Quality=Best
/build:sounds/Background music.wav
#begin sounds/Button click.wav
/importer:WavImporter
/processor:SoundEffectProcessor
/processorParam:Quality=Best
/build:sounds/Button click.wav
#begin sounds/Craft sound.wav
/importer:WavImporter
/processor:SoundEffectProcessor
/processorParam:Quality=Best
/build:sounds/Craft sound.wav
#begin sounds/gun-gunshot-01.wav
/importer:WavImporter
/processor:SoundEffectProcessor
/processorParam:Quality=Best
/build:sounds/gun-gunshot-01.wav
#begin sounds/Loot.wav #begin sounds/Loot.wav
/importer:WavImporter /importer:WavImporter
/processor:SoundEffectProcessor /processor:SoundEffectProcessor
@ -101,6 +131,18 @@
/processorParam:Quality=Best /processorParam:Quality=Best
/build:sounds/Zombi stoit.wav /build:sounds/Zombi stoit.wav
#begin sounds/zombie sound 2.wav
/importer:WavImporter
/processor:SoundEffectProcessor
/processorParam:Quality=Best
/build:sounds/zombie sound 2.wav
#begin sounds/zombie sound.wav
/importer:WavImporter
/processor:SoundEffectProcessor
/processorParam:Quality=Best
/build:sounds/zombie sound.wav
#begin Textures/Animations/player_down_idle.animation #begin Textures/Animations/player_down_idle.animation
/copy:Textures/Animations/player_down_idle.animation /copy:Textures/Animations/player_down_idle.animation
@ -188,6 +230,33 @@
#begin Textures/Animations/player_right_idle.animation #begin Textures/Animations/player_right_idle.animation
/copy:Textures/Animations/player_right_idle.animation /copy:Textures/Animations/player_right_idle.animation
#begin Textures/Animations/player_run_down.animation
/copy:Textures/Animations/player_run_down.animation
#begin Textures/Animations/player_run_left_down.animation
/copy:Textures/Animations/player_run_left_down.animation
#begin Textures/Animations/player_run_left_up.animation
/copy:Textures/Animations/player_run_left_up.animation
#begin Textures/Animations/player_run_left.animation
/copy:Textures/Animations/player_run_left.animation
#begin Textures/Animations/player_run_right_down.animation
/copy:Textures/Animations/player_run_right_down.animation
#begin Textures/Animations/player_run_right_up.animation
/copy:Textures/Animations/player_run_right_up.animation
#begin Textures/Animations/player_run_right.animation
/copy:Textures/Animations/player_run_right.animation
#begin Textures/Animations/player_run_right.zip
/copy:Textures/Animations/player_run_right.zip
#begin Textures/Animations/player_run_up.animation
/copy:Textures/Animations/player_run_up.animation
#begin Textures/Animations/player_running_top_rotate.animation #begin Textures/Animations/player_running_top_rotate.animation
/copy:Textures/Animations/player_running_top_rotate.animation /copy:Textures/Animations/player_running_top_rotate.animation
@ -332,6 +401,30 @@
/processorParam:TextureFormat=Color /processorParam:TextureFormat=Color
/build:Textures/AnimationTextures/Zombie/zombie_spritesheet_v2.png /build:Textures/AnimationTextures/Zombie/zombie_spritesheet_v2.png
#begin Textures/Effects/explosion.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:Textures/Effects/explosion.png
#begin Textures/GUI/back.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:Textures/GUI/back.png
#begin Textures/GUI/background/base.png #begin Textures/GUI/background/base.png
/importer:TextureImporter /importer:TextureImporter
/processor:TextureProcessor /processor:TextureProcessor
@ -428,6 +521,42 @@
/processorParam:TextureFormat=Color /processorParam:TextureFormat=Color
/build:Textures/GUI/checkboxs_off-on.png /build:Textures/GUI/checkboxs_off-on.png
#begin Textures/GUI/Button.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:Textures/GUI/Button.png
#begin Textures/GUI/Button2.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:Textures/GUI/Button2.png
#begin Textures/GUI/checkboxs_off.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:Textures/GUI/checkboxs_off.png
#begin Textures/GUI/checkboxs_off.png #begin Textures/GUI/checkboxs_off.png
/importer:TextureImporter /importer:TextureImporter
/processor:TextureProcessor /processor:TextureProcessor

View file

@ -0,0 +1 @@
{"id":"explosion_1","textureName":"Textures/Effects/explosion","startSpriteRectangle":{"X":0,"Y":0,"Width":100,"Height":100},"frameSecond":[{"Item1":0,"Item2":1}],"textureFrameInterval":0,"framesCount":33,"isCycle":false,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"player_run_down","textureName":"Textures/AnimationTextures/Character/hr-level1_running","startSpriteRectangle":{"X":0,"Y":528,"Width":88,"Height":132},"frameSecond":[{"Item1":0,"Item2":2}],"textureFrameInterval":0,"framesCount":22,"isCycle":true,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"player_run_left","textureName":"Textures/AnimationTextures/Character/hr-level1_running","startSpriteRectangle":{"X":0,"Y":792,"Width":88,"Height":132},"frameSecond":[{"Item1":0,"Item2":2}],"textureFrameInterval":0,"framesCount":22,"isCycle":true,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"player_run_left_down","textureName":"Textures/AnimationTextures/Character/hr-level1_running","startSpriteRectangle":{"X":0,"Y":660,"Width":88,"Height":132},"frameSecond":[{"Item1":0,"Item2":2}],"textureFrameInterval":0,"framesCount":22,"isCycle":true,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"player_run_left_up","textureName":"Textures/AnimationTextures/Character/hr-level1_running","startSpriteRectangle":{"X":0,"Y":924,"Width":88,"Height":132},"frameSecond":[{"Item1":0,"Item2":2}],"textureFrameInterval":0,"framesCount":22,"isCycle":true,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"player_run_right","textureName":"Textures/AnimationTextures/Character/hr-level1_running","startSpriteRectangle":{"X":0,"Y":264,"Width":88,"Height":132},"frameSecond":[{"Item1":0,"Item2":2}],"textureFrameInterval":0,"framesCount":22,"isCycle":true,"offset":"0, 0"}

Binary file not shown.

View file

@ -0,0 +1 @@
{"id":"player_run_right_down","textureName":"Textures/AnimationTextures/Character/hr-level1_running","startSpriteRectangle":{"X":0,"Y":396,"Width":88,"Height":132},"frameSecond":[{"Item1":0,"Item2":2}],"textureFrameInterval":0,"framesCount":22,"isCycle":true,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"player_run_right_up","textureName":"Textures/AnimationTextures/Character/hr-level1_running","startSpriteRectangle":{"X":0,"Y":132,"Width":88,"Height":132},"frameSecond":[{"Item1":0,"Item2":2}],"textureFrameInterval":0,"framesCount":22,"isCycle":true,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"player_run_up","textureName":"Textures/AnimationTextures/Character/hr-level1_running","startSpriteRectangle":{"X":0,"Y":0,"Width":88,"Height":132},"frameSecond":[{"Item1":0,"Item2":2}],"textureFrameInterval":0,"framesCount":22,"isCycle":true,"offset":"0, 0"}

View file

@ -1 +1 @@
{"id":"zombie_death","textureName":"Textures/AnimationTextures/Zombie/zombie_spritesheet_v1","startSpriteRectangle":{"X":0,"Y":96,"Width":32,"Height":32},"frameSecond":[{"Item1":0,"Item2":5}],"textureFrameInterval":0,"framesCount":9,"isCycle":true,"offset":"0, 0"} {"id":"zombie_death","textureName":"Textures/AnimationTextures/Zombie/zombie_spritesheet_v1","startSpriteRectangle":{"X":0,"Y":96,"Width":32,"Height":32},"frameSecond":[{"Item1":0,"Item2":5}],"textureFrameInterval":0,"framesCount":9,"isCycle":false,"offset":"0, 0"}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 885 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -23,9 +23,11 @@ using System.Web;
using ZoFo.GameCore.GUI; using ZoFo.GameCore.GUI;
using ZoFo.GameCore.GameObjects.Entities.Interactables.Collectables; using ZoFo.GameCore.GameObjects.Entities.Interactables.Collectables;
using ZoFo.GameCore.GameObjects.MapObjects.StopObjects; using ZoFo.GameCore.GameObjects.MapObjects.StopObjects;
using ZoFo.GameCore.GameManagers.NetworkManager.SerializableDTO;
using ZoFo.GameCore.Graphics; using ZoFo.GameCore.Graphics;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Newtonsoft.Json; using Newtonsoft.Json;
using ZoFo.GameCore.GameManagers.CollisionManager;
namespace ZoFo.GameCore namespace ZoFo.GameCore
{ {
public class Client public class Client
@ -40,7 +42,6 @@ namespace ZoFo.GameCore
public Client() public Client()
{ {
networkManager = new ClientNetworkManager(); networkManager = new ClientNetworkManager();
networkManager.GetDataSent += OnDataSend;
// Подписка на действия инпутменеджера. // Подписка на действия инпутменеджера.
// Отправляются данные апдейтса с обновлением инпута // Отправляются данные апдейтса с обновлением инпута
@ -48,8 +49,8 @@ namespace ZoFo.GameCore
{ {
networkManager.AddData(new UpdateInput() networkManager.AddData(new UpdateInput()
{ {
InputMovementDirection = AppManager.Instance.InputManager.InputMovementDirection, InputMovementDirection = AppManager.Instance.InputManager.InputMovementDirection.Serialize(),
InputAttackDirection = AppManager.Instance.InputManager.InputAttackDirection InputAttackDirection = AppManager.Instance.InputManager.InputAttackDirection.Serialize()
}); });
}; };
@ -97,6 +98,21 @@ namespace ZoFo.GameCore
List<GameObject> gameObjects = new List<GameObject>(); List<GameObject> gameObjects = new List<GameObject>();
List<Player> players = new List<Player>(); List<Player> players = new List<Player>();
List<StopObject> stopObjects = new List<StopObject>(); List<StopObject> stopObjects = new List<StopObject>();
List<Particle> particles = new List<Particle>();
float shakeEffect = 0;
public void AddShaking(float power)
{
shakeEffect += power;
}
public void UpdateShaking()
{
shakeEffect *= 0.99f;
(GraphicsComponent.CameraPosition) += new Microsoft.Xna.Framework.Point(
(int)((Random.Shared.NextDouble() - 0.5) * shakeEffect),
(int)((Random.Shared.NextDouble() - 0.5) * shakeEffect)
);
}
/// <summary> /// <summary>
/// Клиент должен обнговлять игру анимаций /// Клиент должен обнговлять игру анимаций
@ -104,11 +120,15 @@ namespace ZoFo.GameCore
/// <param name="gameTime"></param> /// <param name="gameTime"></param>
internal void Update(GameTime gameTime) internal void Update(GameTime gameTime)
{ {
UpdateShaking();
for (int i = 0; i < gameObjects.Count; i++) for (int i = 0; i < gameObjects.Count; i++)
{ {
AppManager.Instance.debugHud.Set("GameTime", gameTime.TotalGameTime.ToString());
gameObjects[i].UpdateAnimations(); gameObjects[i].UpdateAnimations();
} }
for (int i = 0; i < particles.Count; i++)
{
particles[i].UpdateAnimations();
}
networkManager.SendData();//set to ticks networkManager.SendData();//set to ticks
if (myPlayer != null) if (myPlayer != null)
@ -119,6 +139,10 @@ namespace ZoFo.GameCore
) ) ) )
.ToPoint(); .ToPoint();
} }
public void SendData()
{
networkManager.SendData();
}
internal void Draw(SpriteBatch spriteBatch) internal void Draw(SpriteBatch spriteBatch)
{ {
for (int i = 0; i < mapObjects.Count; i++) for (int i = 0; i < mapObjects.Count; i++)
@ -133,15 +157,28 @@ namespace ZoFo.GameCore
{ {
gameObjects[i].Draw(spriteBatch); gameObjects[i].Draw(spriteBatch);
} }
for (int i = 0; i < particles.Count; i++)
{
particles[i].Draw(spriteBatch);
} }
}
internal void UpdatesList(List<UpdateData> updates)
{
foreach (var item in updates)
{
GotData(item);
}
}
internal void GotData(UpdateData update) internal void GotData(UpdateData update)
{ {
if (update is UpdateTileCreated) if (update is UpdateTileCreated)
{ {
mapObjects.Add( mapObjects.Add(
new MapObject( new MapObject(
(update as UpdateTileCreated).Position, (update as UpdateTileCreated).Position.GetVector2(),
(update as UpdateTileCreated).Size.GetPoint().ToVector2(), (update as UpdateTileCreated).Size.GetPoint().ToVector2(),
(update as UpdateTileCreated).sourceRectangle.GetRectangle(), (update as UpdateTileCreated).sourceRectangle.GetRectangle(),
(update as UpdateTileCreated).tileSetName (update as UpdateTileCreated).tileSetName
@ -151,7 +188,7 @@ namespace ZoFo.GameCore
{ {
stopObjects.Add( stopObjects.Add(
new StopObject( new StopObject(
(update as UpdateStopObjectCreated).Position, (update as UpdateStopObjectCreated).Position.GetVector2(),
(update as UpdateStopObjectCreated).Size.GetPoint().ToVector2(), (update as UpdateStopObjectCreated).Size.GetPoint().ToVector2(),
(update as UpdateStopObjectCreated).sourceRectangle.GetRectangle(), (update as UpdateStopObjectCreated).sourceRectangle.GetRectangle(),
(update as UpdateStopObjectCreated).tileSetName, (update as UpdateStopObjectCreated).tileSetName,
@ -160,36 +197,39 @@ namespace ZoFo.GameCore
} }
else if (update is UpdateGameObjectCreated) else if (update is UpdateGameObjectCreated)
{ {
GameObject created_gameObject; //TODO
Entity created_gameObject;
if ((update as UpdateGameObjectCreated).GameObjectType == "Player") if ((update as UpdateGameObjectCreated).GameObjectType == "Player")
{ {
created_gameObject = new Player((update as UpdateGameObjectCreated).position); created_gameObject = new Player((update as UpdateGameObjectCreated).position.GetVector2());
players.Add(created_gameObject as Player); players.Add(created_gameObject as Player);
myPlayer = players[0]; myPlayer = players[0];
gameObjects.Add(created_gameObject); gameObjects.Add(created_gameObject);
(created_gameObject as Entity).SetIdByClient((update as UpdateGameObjectCreated).IdEntity);
} }
else if ((update as UpdateGameObjectCreated).GameObjectType == "Ammo")
gameObjects.Add(new Ammo((update as UpdateGameObjectCreated).position));
else if ((update as UpdateGameObjectCreated).GameObjectType == "BottleOfWater")
gameObjects.Add(new BottleOfWater((update as UpdateGameObjectCreated).position));
else else
{ {
Type t = Type.GetType("ZoFo.GameCore.GameObjects." + (update as UpdateGameObjectCreated).GameObjectType); Type t = Type.GetType("ZoFo.GameCore.GameObjects." + (update as UpdateGameObjectCreated).GameObjectType);
GameObject gameObject = Activator.CreateInstance(t, (update as UpdateGameObjectCreated).position) as GameObject; GameObject gameObject = Activator.CreateInstance(t, (update as UpdateGameObjectCreated).position.GetVector2()) as GameObject;
if (gameObject is Entity) if (gameObject is Entity)
(gameObject as Entity).SetIdByClient((update as UpdateGameObjectCreated).IdEntity); (gameObject as Entity).SetIdByClient((update as UpdateGameObjectCreated).IdEntity);
gameObjects.Add(gameObject); gameObjects.Add(gameObject);
} }
(gameObjects.Last() as Entity).SetIdByClient((update as UpdateGameObjectCreated).IdEntity);
}
else if (update is UpdateGameObjectWithoutIdCreated)
{
Type t = Type.GetType("ZoFo.GameCore.GameObjects." + (update as UpdateGameObjectWithoutIdCreated).GameObjectClassName);
GameObject gameObject = Activator.CreateInstance(t, (update as UpdateGameObjectWithoutIdCreated).position.GetVector2()) as GameObject;
if (gameObject is Particle)
particles.Add(gameObject as Particle);
} }
else if (update is UpdatePosition) else if (update is UpdatePosition)
{ {
var ent = FindEntityById(update.IdEntity); var ent = FindEntityById(update.IdEntity);
if (ent != null) if (ent != null)
ent.position = (update as UpdatePosition).NewPosition; ent.position = (update as UpdatePosition).NewPosition.GetVector2();
} }
else if (update is UpdateAnimation) else if (update is UpdateAnimation)
{ {
@ -210,6 +250,60 @@ namespace ZoFo.GameCore
{ {
GameEnd(); GameEnd();
} }
else if (update is UpdatePlayerParametrs)
{
UpdatePlayerHealth(update as UpdatePlayerParametrs);
}
else if (update is UpdateLoot)
{
if ((update as UpdateLoot).quantity == 0)
{
return;
}
var ent = FindEntityById(update.IdEntity);
if (ent != null)
(ent as Player).lootData.AddLoot_Client((update as UpdateLoot).lootName, (update as UpdateLoot).quantity);
}
}
public void UpdatePlayerHealth(UpdatePlayerParametrs update)
{
//check on player hp lowered
if (myPlayer != null)
{
float hpMyPlayerHp = myPlayer.health;
var entity = FindEntityById(update.IdEntity);
if (entity != null)
{
(entity as Player).health = (update as UpdatePlayerParametrs).health;
(entity as Player).rad = (update as UpdatePlayerParametrs).radiatoin;
}
if (entity.Equals(myPlayer))
{
if (hpMyPlayerHp > myPlayer.health)
{
AppManager.Instance.client.AddShaking((hpMyPlayerHp - myPlayer.health));
}
}
return;
}
var ent = FindEntityById(update.IdEntity);
if (ent != null)
{
(ent as Player).health = (update as UpdatePlayerParametrs).health;
(ent as Player).rad = (update as UpdatePlayerParametrs).radiatoin;
}
} }
public void GameEnd() public void GameEnd()
@ -231,7 +325,20 @@ namespace ZoFo.GameCore
} }
return null; return null;
} }
public void DeleteObject(Entity entity)
public void DeleteObject(GameObject gameObject)
{
if (gameObject is Entity)
{
DeleteEntity(gameObject as Entity);
}
else if (gameObject is Particle)
{
if (particles.Contains(gameObject))
particles.Remove(gameObject as Particle);
}
}
public void DeleteEntity(Entity entity)
{ {
if (gameObjects.Contains(entity)) if (gameObjects.Contains(entity))

View file

@ -38,7 +38,7 @@ public abstract class AbstractGUI
public virtual void LoadContent() public virtual void LoadContent()
{ {
Manager.LoadContent(AppManager.Instance.Content, "Font"); Manager.LoadContent(AppManager.Instance.Content, "Fonts/Font");
mouse = AppManager.Instance.Content.Load<Texture2D>("Textures/GUI/mouse"); mouse = AppManager.Instance.Content.Load<Texture2D>("Textures/GUI/mouse");
} }

View file

@ -54,14 +54,16 @@ public class BaseGUI : AbstractGUI
rectangle = new Rectangle(width / 2 - (height / 16 + (int)(width / 2.5)) / 2, rectangle = new Rectangle(width / 2 - (height / 16 + (int)(width / 2.5)) / 2,
height / 2 - (int)(height / 1.5) / 2, height / 2 - (int)(height / 1.5) / 2,
height / 40 + width / 5, (int)(height / 1.5)), height / 40 + width / 5, (int)(height / 1.5)),
mainColor = Color.LightGray mainColor = Color.LightGray,
textureName = "Textures/GUI/Back"
}; };
Elements.Add(baseItemBack); Elements.Add(baseItemBack);
DrawableUIElement baseCraftBack = new DrawableUIElement(Manager) DrawableUIElement baseCraftBack = new DrawableUIElement(Manager)
{ {
rectangle = new Rectangle(width / 2 + height / 160, height / 2 - (int)(height / 1.5) / 2, rectangle = new Rectangle(width / 2 + height / 160, height / 2 - (int)(height / 1.5) / 2,
height / 40 + width / 5, (int)(height / 1.5)), height / 40 + width / 5, (int)(height / 1.5)),
mainColor = Color.LightGray mainColor = Color.LightGray,
textureName = "Textures/GUI/Back"
}; };
Elements.Add(baseCraftBack); Elements.Add(baseCraftBack);
@ -85,7 +87,8 @@ public class BaseGUI : AbstractGUI
mainColor = Color.Gray, mainColor = Color.Gray,
fontName1 = "Fonts\\Font4", fontName1 = "Fonts\\Font4",
discriptions1 = itemInfo.description, discriptions1 = itemInfo.description,
resourcesNeededToCraft1 = itemInfo.resourcesNeededToCraft resourcesNeededToCraft1 = itemInfo.resourcesNeededToCraft,
textureName = "Textures/GUI/Button"
}; };
Elements.Add(temp); Elements.Add(temp);
temp.Initialize(); temp.Initialize();
@ -134,7 +137,8 @@ public class BaseGUI : AbstractGUI
mainColor = Color.Gray, mainColor = Color.Gray,
fontName1 = "Fonts\\Font4", fontName1 = "Fonts\\Font4",
discriptions1 = itemInfo.description, discriptions1 = itemInfo.description,
resourcesNeededToCraft1 = itemInfo.resourcesNeededToCraft resourcesNeededToCraft1 = itemInfo.resourcesNeededToCraft,
textureName = "Textures/GUI/Button"
}; };
Elements.Add(temp); Elements.Add(temp);
temp.Initialize(); temp.Initialize();
@ -142,6 +146,7 @@ public class BaseGUI : AbstractGUI
ItemDisplayButtonsList.Add(temp); ItemDisplayButtonsList.Add(temp);
temp.LeftButtonPressed += () => temp.LeftButtonPressed += () =>
{ {
AppManager.Instance.SoundManager.StartAmbientSound("Craft sound");
AppManager.Instance.playerData.CraftItem(item.Key); AppManager.Instance.playerData.CraftItem(item.Key);
AppManager.Instance.SetGUI(new BaseGUI()); AppManager.Instance.SetGUI(new BaseGUI());
}; };
@ -160,10 +165,12 @@ public class BaseGUI : AbstractGUI
{ {
fontName = "Fonts\\Font3", scale = 0.4f, text = "<-", fontColor = Color.Black, fontName = "Fonts\\Font3", scale = 0.4f, text = "<-", fontColor = Color.Black,
mainColor = Color.Transparent, rectangle = new Rectangle(width / 30, height / 30, width / 40, width / 40), mainColor = Color.Transparent, rectangle = new Rectangle(width / 30, height / 30, width / 40, width / 40),
textureName = "Textures\\GUI\\checkboxs_off" textureName = "Textures/GUI/Button2"
}; };
Elements.Add(bTExit); Elements.Add(bTExit);
bTExit.LeftButtonPressed += () => { AppManager.Instance.SetGUI(new MainMenuGUI()); }; bTExit.LeftButtonPressed += () => { AppManager.Instance.SetGUI(new MainMenuGUI());
AppManager.Instance.SoundManager.StartAmbientSound("Button click");
};
} }
public override void Update(GameTime gameTime) public override void Update(GameTime gameTime)

View file

@ -36,7 +36,8 @@ public class ExitGameGUI : AbstractGUI
scale = 0.3f, scale = 0.3f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts/Font" fontName = "Fonts/Font",
textureName = "Textures/GUI/Button"
}; };
endButton.LeftButtonPressed += () => endButton.LeftButtonPressed += () =>
{ {

View file

@ -38,7 +38,8 @@ public class FinishingGUI : AbstractGUI
rectangle = new Rectangle(width / 2 - height / 80 - width / 5 / 2, rectangle = new Rectangle(width / 2 - height / 80 - width / 5 / 2,
height / 2 - (int)(height / 1.5) / 2, height / 2 - (int)(height / 1.5) / 2,
height / 40 + width / 5, (int)(height / 1.5)), height / 40 + width / 5, (int)(height / 1.5)),
mainColor = Color.LightGray mainColor = Color.LightGray,
textureName = "Textures/GUI/Back"
}; };
Elements.Add(inventoryBack); Elements.Add(inventoryBack);
@ -50,7 +51,8 @@ public class FinishingGUI : AbstractGUI
scale = 0.2f, scale = 0.2f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts\\Font" fontName = "Fonts\\Font",
textureName = "Textures/GUI/Button"
}; };
ExitButton.LeftButtonPressed += () => { AppManager.Instance.SetGUI(new MainMenuGUI()); }; ExitButton.LeftButtonPressed += () => { AppManager.Instance.SetGUI(new MainMenuGUI()); };
Elements.Add(ExitButton); Elements.Add(ExitButton);

View file

@ -36,7 +36,8 @@ public class GameEndedGUI : AbstractGUI
scale = 0.3f, scale = 0.3f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts/Font" fontName = "Fonts/Font",
textureName = "Textures/GUI/Button"
}; };
endButton.LeftButtonPressed += () => endButton.LeftButtonPressed += () =>
{ {

View file

@ -17,25 +17,37 @@ public class HUD : AbstractGUI
{ {
private Bar hpBar; private Bar hpBar;
private Bar radBar; private Bar radBar;
private AbstractGUI overlayGUI; public AbstractGUI overlayGUI;
protected override void CreateUI() protected override void CreateUI()
{ {
int width = AppManager.Instance.CurentScreenResolution.X; int width = AppManager.Instance.CurentScreenResolution.X;
int height = AppManager.Instance.CurentScreenResolution.Y; int height = AppManager.Instance.CurentScreenResolution.Y;
Button pauseButton = new Button(Manager) Button pauseButton = new Button(Manager)
{ fontName = "Fonts\\Font3", scale = 0.4f, text = "| |", fontColor = Color.Black, mainColor = Color.Transparent, rectangle = new Rectangle(width - width / 30 - width / 40, height / 30, width / 40, width / 40), textureName = "Textures\\GUI\\checkboxs_off"}; {
fontName = "Fonts\\Font3", scale = 0.4f, text = "| |", fontColor = Color.Black,
mainColor = Color.Transparent, rectangle = new Rectangle(width - width / 30 - width / 40, height / 30, width / 40, width / 40),
textureName = "Textures/GUI/Button2"
};
Elements.Add(pauseButton); Elements.Add(pauseButton);
pauseButton.LoadTexture(AppManager.Instance.Content);
pauseButton.LeftButtonPressed += () => pauseButton.LeftButtonPressed += () =>
{ {
AppManager.Instance.SetGUI(new FinishingGUI()); AppManager.Instance.SoundManager.StartAmbientSound("Button click");
//overlayGUI = new PauseGUI(); AppManager.Instance.SetGUI(new PauseGUI());
//overlayGUI.Initialize(); //AppManager.Instance.SetGUI(new FinishingGUI());
//overlayGUI.LoadContent(); overlayGUI = new PauseGUI();
overlayGUI.Initialize();
overlayGUI.LoadContent();
}; };
Button invButton = new Button(Manager) Button invButton = new Button(Manager)
{ fontName = "Fonts\\Font3", scale = 0.4f, text = "inv", fontColor = Color.Black, mainColor = Color.Transparent, rectangle = new Rectangle(width - width / 30 - width / 40, height / 15 + width / 40, width / 40, width / 40), textureName = "Textures\\GUI\\checkboxs_off"}; {
fontName = "Fonts\\Font3", scale = 0.4f, text = "inv", fontColor = Color.Black,
mainColor = Color.Transparent, rectangle = new Rectangle(width - width / 30 - width / 40, height / 15 + width / 40, width / 40, width / 40),
textureName = "Textures/GUI/Button2"
};
Elements.Add(invButton); Elements.Add(invButton);
invButton.LoadTexture(AppManager.Instance.Content);
invButton.LeftButtonPressed += () => invButton.LeftButtonPressed += () =>
{ {
overlayGUI = new InventoryGUI(); overlayGUI = new InventoryGUI();
@ -63,12 +75,18 @@ public class HUD : AbstractGUI
radBar.LoadTexture(AppManager.Instance.Content); radBar.LoadTexture(AppManager.Instance.Content);
} }
public override void Update(GameTime gameTime) public override void Update(GameTime gameTime)
{ {
overlayGUI?.Update(gameTime); overlayGUI?.Update(gameTime);
//hpBar.Update(gameTime, AppManager.Instance.client.myPlayer.health / 100f); //hpBar.Update(gameTime, AppManager.Instance.client.myPlayer.health / 100f);
//radBar.Update(gameTime, AppManager.Instance.client.myPlayer.rad / 100f); //radBar.Update(gameTime, AppManager.Instance.client.myPlayer.rad / 100f);
radBar.Update(gameTime, gameTime.TotalGameTime.Seconds / 100f); if (AppManager.Instance.client.myPlayer != null)
{
radBar.Update(gameTime, AppManager.Instance.client.myPlayer.rad / AppManager.Instance.client.myPlayer.MaxRad);
hpBar.Update(gameTime, AppManager.Instance.client.myPlayer.health / AppManager.Instance.client.myPlayer.MaxHealth);
}
base.Update(gameTime); base.Update(gameTime);
} }

View file

@ -31,7 +31,8 @@ public class InventoryGUI : AbstractGUI
rectangle = new Rectangle(width / 2 - height / 80 - width / 5 / 2, rectangle = new Rectangle(width / 2 - height / 80 - width / 5 / 2,
height / 2 - (int)(height / 1.5) / 2 - height / 10, height / 2 - (int)(height / 1.5) / 2 - height / 10,
height / 40 + width / 5, (int)(height / 1.5)), height / 40 + width / 5, (int)(height / 1.5)),
mainColor = Color.LightGray mainColor = Color.LightGray,
textureName = "Textures/GUI/Back"
}; };
Elements.Add(inventoryBack); Elements.Add(inventoryBack);
@ -43,7 +44,8 @@ public class InventoryGUI : AbstractGUI
scale = 0.2f, scale = 0.2f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts\\Font" fontName = "Fonts\\Font",
textureName = "Textures/GUI/Button"
}; };
continueButton.LeftButtonPressed += () => { AppManager.Instance.SetGUI(new HUD()); }; continueButton.LeftButtonPressed += () => { AppManager.Instance.SetGUI(new HUD()); };
Elements.Add(continueButton); Elements.Add(continueButton);
@ -62,14 +64,15 @@ public class InventoryGUI : AbstractGUI
(height / 20 + height / 80) * (buttonIndex) - height / 10, (height / 20 + height / 80) * (buttonIndex) - height / 10,
(int)(width / 5), (int)(height / 20)), (int)(width / 5), (int)(height / 20)),
text1 = item.Key, text1 = item.Key,
scale1 = 0.4f, scale1 = 0.3f,
count = item.Value, count = item.Value,
itemTextureName = itemInfo.textureName, itemTextureName = itemInfo.textureName,
fontColor1 = Color.White, fontColor1 = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName1 = "Fonts\\Font4", fontName1 = "Fonts\\Font4",
discriptions1 = itemInfo.description, discriptions1 = itemInfo.description,
resourcesNeededToCraft1 = itemInfo.resourcesNeededToCraft resourcesNeededToCraft1 = itemInfo.resourcesNeededToCraft,
textureName = "Texturs/GUI/Button"
}; };
Elements.Add(temp); Elements.Add(temp);
temp.Initialize(); temp.Initialize();

View file

@ -36,11 +36,12 @@ public class MainMenuGUI : AbstractGUI
scale = 0.2f, scale = 0.2f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts/Font" fontName = "Fonts/Font",
textureName = "Textures/GUI/Button"
}; };
playButton.LeftButtonPressed += () => playButton.LeftButtonPressed += () =>
{ {
AppManager.Instance.SoundManager.StartAmbientSound("Loot"); AppManager.Instance.SoundManager.StartAmbientSound("Button click");
AppManager.Instance.SetGUI(new SelectModeMenu()); AppManager.Instance.SetGUI(new SelectModeMenu());
}; };
Elements.Add(playButton); Elements.Add(playButton);
@ -51,10 +52,12 @@ public class MainMenuGUI : AbstractGUI
scale = 0.2f, scale = 0.2f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts\\Font" fontName = "Fonts\\Font",
textureName = "Textures/GUI/Button"
}; };
baseButton.LeftButtonPressed += () => baseButton.LeftButtonPressed += () =>
{ {
AppManager.Instance.SoundManager.StartAmbientSound("Button click");
AppManager.Instance.SetGUI(new BaseGUI()); AppManager.Instance.SetGUI(new BaseGUI());
}; };
Elements.Add(baseButton); Elements.Add(baseButton);
@ -65,11 +68,12 @@ public class MainMenuGUI : AbstractGUI
scale = 0.2f, scale = 0.2f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts/Font" fontName = "Fonts/Font",
textureName = "Textures/GUI/Button"
}; };
optionButton.LeftButtonPressed += () => optionButton.LeftButtonPressed += () =>
{ {
AppManager.Instance.SoundManager.StartAmbientSound("Loot"); AppManager.Instance.SoundManager.StartAmbientSound("Button click");
AppManager.Instance.SetGUI(new OptionsGUI()); AppManager.Instance.SetGUI(new OptionsGUI());
}; };
Elements.Add(optionButton); Elements.Add(optionButton);
@ -80,7 +84,8 @@ public class MainMenuGUI : AbstractGUI
scale = 0.2f, scale = 0.2f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts/Font" fontName = "Fonts/Font",
textureName = "Textures/GUI/Button"
}; };
exitButton.LeftButtonPressed += () => exitButton.LeftButtonPressed += () =>
{ {

View file

@ -43,6 +43,7 @@ public class OptionsGUI : AbstractGUI
label_OverallVolume_Percent.text = Math.Round(slider_OverallVolume.GetSliderValue * 100) + "%"; label_OverallVolume_Percent.text = Math.Round(slider_OverallVolume.GetSliderValue * 100) + "%";
slider_OverallVolume.SliderChanged += (newVal) => slider_OverallVolume.SliderChanged += (newVal) =>
{ {
label_OverallVolume_Percent.text = Math.Round(slider_OverallVolume.GetSliderValue * 100) + "%"; label_OverallVolume_Percent.text = Math.Round(slider_OverallVolume.GetSliderValue * 100) + "%";
AppManager.Instance.SettingsManager.SetMainVolume(newVal); AppManager.Instance.SettingsManager.SetMainVolume(newVal);
}; };
@ -64,6 +65,7 @@ public class OptionsGUI : AbstractGUI
label_MusicVolume_Percent.text = Math.Round(slider_MusicVolume.GetSliderValue * 100) + "%"; label_MusicVolume_Percent.text = Math.Round(slider_MusicVolume.GetSliderValue * 100) + "%";
slider_MusicVolume.SliderChanged += (newVal) => slider_MusicVolume.SliderChanged += (newVal) =>
{ {
label_MusicVolume_Percent.text = Math.Round(slider_MusicVolume.GetSliderValue * 100) + "%"; label_MusicVolume_Percent.text = Math.Round(slider_MusicVolume.GetSliderValue * 100) + "%";
AppManager.Instance.SettingsManager.SetMusicVolume(newVal); AppManager.Instance.SettingsManager.SetMusicVolume(newVal);
}; };
@ -85,6 +87,7 @@ public class OptionsGUI : AbstractGUI
label_EffectsVolume_Percent.text = Math.Round(slider_EffectsVolume.GetSliderValue * 100) + "%"; label_EffectsVolume_Percent.text = Math.Round(slider_EffectsVolume.GetSliderValue * 100) + "%";
slider_EffectsVolume.SliderChanged += (newVal) => slider_EffectsVolume.SliderChanged += (newVal) =>
{ {
label_EffectsVolume_Percent.text = Math.Round(slider_EffectsVolume.GetSliderValue * 100) + "%"; label_EffectsVolume_Percent.text = Math.Round(slider_EffectsVolume.GetSliderValue * 100) + "%";
AppManager.Instance.SettingsManager.SetSoundEffectsVolume(newVal); AppManager.Instance.SettingsManager.SetSoundEffectsVolume(newVal);
}; };
@ -109,6 +112,7 @@ public class OptionsGUI : AbstractGUI
button_FullScreen.SetIsChecked(AppManager.Instance.SettingsManager.IsFullScreen); button_FullScreen.SetIsChecked(AppManager.Instance.SettingsManager.IsFullScreen);
button_FullScreen.Checked += (newCheckState) => button_FullScreen.Checked += (newCheckState) =>
{ {
AppManager.Instance.SoundManager.StartAmbientSound("Button click");
AppManager.Instance.SettingsManager.SetIsFullScreen(newCheckState); AppManager.Instance.SettingsManager.SetIsFullScreen(newCheckState);
}; };
Elements.Add(button_FullScreen); Elements.Add(button_FullScreen);
@ -116,10 +120,15 @@ public class OptionsGUI : AbstractGUI
//-------------------------------------- //--------------------------------------
Button bTExit = new Button(Manager) Button bTExit = new Button(Manager)
{ fontName = "Fonts/Font3", scale = 0.4f, text = "<-", fontColor = Color.Black, mainColor = Color.Transparent, rectangle = new Rectangle(width / 30, height / 30, width / 40, width / 40), textureName = "Textures/GUI/checkboxs_off"}; {
fontName = "Fonts/Font3", scale = 0.4f, text = "<-", fontColor = Color.Black, mainColor = Color.Transparent,
rectangle = new Rectangle(width / 30, height / 30, width / 40, width / 40),
textureName = "Textures/GUI/Button2"
};
Elements.Add(bTExit); Elements.Add(bTExit);
bTExit.LeftButtonPressed += () => bTExit.LeftButtonPressed += () =>
{ {
AppManager.Instance.SoundManager.StartAmbientSound("Button click");
AppManager.Instance.SetGUI(new MainMenuGUI()); AppManager.Instance.SetGUI(new MainMenuGUI());
}; };

View file

@ -27,10 +27,12 @@ public class PauseGUI : AbstractGUI
scale = 0.2f, scale = 0.2f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts\\Font" fontName = "Fonts\\Font",
textureName = "Textures/GUI/Button"
}; };
continueButton.LeftButtonPressed += () => continueButton.LeftButtonPressed += () =>
{ {
AppManager.Instance.SoundManager.StartAmbientSound("Button click");
AppManager.Instance.SetGUI(new HUD()); AppManager.Instance.SetGUI(new HUD());
}; };
Elements.Add(continueButton); Elements.Add(continueButton);
@ -41,10 +43,14 @@ public class PauseGUI : AbstractGUI
scale = 0.2f, scale = 0.2f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts\\Font" fontName = "Fonts\\Font",
textureName = "Textures/GUI/Button"
}; };
exitButton.LeftButtonPressed += () => exitButton.LeftButtonPressed += () =>
{ {
AppManager.Instance.SoundManager.StopAllSounds();
AppManager.Instance.SoundManager.StartAmbientSound("Button click");
AppManager.Instance.SoundManager.StartAmbientSound("Background menu music");
AppManager.Instance.SetGUI(new MainMenuGUI()); AppManager.Instance.SetGUI(new MainMenuGUI());
}; };
Elements.Add(exitButton); Elements.Add(exitButton);

View file

@ -34,18 +34,22 @@ public class SelectModeMenu : AbstractGUI
scale = 0.3f, scale = 0.3f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts/Font" fontName = "Fonts/Font",
textureName = "Textures/GUI/Button"
}; };
singleButton.LeftButtonPressed += () => singleButton.LeftButtonPressed += () =>
{ {
AppManager.Instance.SoundManager.StopAllSounds();
AppManager.Instance.SoundManager.StartAmbientSound("Background music");
AppManager.Instance.SoundManager.StartAmbientSound("Button click");
// single // single
Server server = new Server(); Server server = new Server();
Client client = new Client(); Client client = new Client();
server.CreateRoom(1);
client.JoinYourself(server.MyIp.Port);
AppManager.Instance.SetServer(server); AppManager.Instance.SetServer(server);
AppManager.Instance.SetClient(client); AppManager.Instance.SetClient(client);
AppManager.Instance.ChangeState(GameState.HostPlaying); server.CreateRoom(false);
client.JoinYourself(server.MyIp.Port);
//AppManager.Instance.ChangeState(GameState.HostPlaying);
AppManager.Instance.SetGUI(new HUD()); AppManager.Instance.SetGUI(new HUD());
//server.CreateRoom(1); //server.CreateRoom(1);
@ -64,10 +68,12 @@ public class SelectModeMenu : AbstractGUI
scale = 0.3f, scale = 0.3f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts/Font" fontName = "Fonts/Font",
textureName = "Textures/GUI/Button"
}; };
optionButton.LeftButtonPressed += () => optionButton.LeftButtonPressed += () =>
{ {
AppManager.Instance.SoundManager.StartAmbientSound("Button click");
AppManager.Instance.SetGUI(new SelectingServerGUI()); AppManager.Instance.SetGUI(new SelectingServerGUI());
// multi // multi
@ -76,10 +82,17 @@ public class SelectModeMenu : AbstractGUI
Elements.Add(optionButton); Elements.Add(optionButton);
Button bTExit = new Button(Manager) Button bTExit = new Button(Manager)
{ fontName = "Fonts/Font3", scale = 0.4f, text = "<-", fontColor = Color.Black, mainColor = Color.Transparent, rectangle = new Rectangle(width / 30, height / 30, width / 40, width / 40), textureName = "Textures/GUI/checkboxs_off"}; {
fontName = "Fonts/Font3", scale = 0.4f, text = "<-", fontColor = Color.Black, mainColor = Color.Transparent,
rectangle = new Rectangle(width / 30, height / 30, width / 40, width / 40),
textureName = "Textures/GUI/Button2"
};
Elements.Add(bTExit); Elements.Add(bTExit);
bTExit.LeftButtonPressed += () => bTExit.LeftButtonPressed += () =>
{ {
AppManager.Instance.SoundManager.StartAmbientSound("Button click");
AppManager.Instance.SetGUI(new MainMenuGUI()); AppManager.Instance.SetGUI(new MainMenuGUI());
}; };
} }

View file

@ -36,7 +36,8 @@ public class SelectingServerGUI : AbstractGUI
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
textAligment = MonogameLibrary.UI.Enums.TextAligment.Left, textAligment = MonogameLibrary.UI.Enums.TextAligment.Left,
fontName = "Fonts/Font3" fontName = "Fonts/Font3",
textureName = "Textures/GUI/Button"
}; };
ipBox.TextChanged += input => ipBox.TextChanged += input =>
{ {
@ -61,7 +62,8 @@ public class SelectingServerGUI : AbstractGUI
scale = 0.3f, scale = 0.3f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts/Font" fontName = "Fonts/Font",
textureName = "Textures/GUI/Button"
}; };
joinButton.LeftButtonPressed += () => joinButton.LeftButtonPressed += () =>
{ {
@ -74,6 +76,7 @@ public class SelectingServerGUI : AbstractGUI
{ {
if (int.TryParse(endpoint[1], out port)) if (int.TryParse(endpoint[1], out port))
{ {
client.JoinRoom(endpoint[0], port); client.JoinRoom(endpoint[0], port);
AppManager.Instance.SetClient(client); AppManager.Instance.SetClient(client);
AppManager.Instance.SetGUI(new WaitingForPlayersGUI(false)); AppManager.Instance.SetGUI(new WaitingForPlayersGUI(false));
@ -95,7 +98,8 @@ public class SelectingServerGUI : AbstractGUI
scale = 0.3f, scale = 0.3f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts/Font" fontName = "Fonts/Font",
textureName = "Textures/GUI/Button"
}; };
hostButton.LeftButtonPressed += () => hostButton.LeftButtonPressed += () =>
{ {
@ -103,10 +107,10 @@ public class SelectingServerGUI : AbstractGUI
// host // host
Server server = new Server(); //Server Logic MultiPlayer Server server = new Server(); //Server Logic MultiPlayer
Client client = new Client(); Client client = new Client();
server.CreateRoom(2);
client.JoinYourself(server.MyIp.Port);
AppManager.Instance.SetServer(server); AppManager.Instance.SetServer(server);
AppManager.Instance.SetClient(client); AppManager.Instance.SetClient(client);
server.CreateRoom(true);
client.JoinYourself(server.MyIp.Port);
string key = server.MyIp.ToString(); string key = server.MyIp.ToString();
AppManager.Instance.debugHud.Set(key, "MultiPlayer"); AppManager.Instance.debugHud.Set(key, "MultiPlayer");
// ваш код здесь // ваш код здесь
@ -115,7 +119,11 @@ public class SelectingServerGUI : AbstractGUI
Elements.Add(hostButton); Elements.Add(hostButton);
Button bTExit = new Button(Manager) Button bTExit = new Button(Manager)
{ fontName = "Fonts/Font3", scale = 0.4f, text = "<-", fontColor = Color.Black, mainColor = Color.Transparent, rectangle = new Rectangle(width / 30, height / 30, width / 40, width / 40), textureName = "Textures/GUI/checkboxs_off" }; {
fontName = "Fonts/Font3", scale = 0.4f, text = "<-", fontColor = Color.Black, mainColor = Color.Transparent,
rectangle = new Rectangle(width / 30, height / 30, width / 40, width / 40),
textureName = "Textures/GUI/Button2"
};
Elements.Add(bTExit); Elements.Add(bTExit);
bTExit.LeftButtonPressed += () => bTExit.LeftButtonPressed += () =>
{ {

View file

@ -34,8 +34,8 @@ public class WaitingForPlayersGUI : AbstractGUI
// string pcIp = // string pcIp =
// string pcIp = // string pcIp =
ip = new Label(Manager) { rectangle = new Rectangle(width / 2 - (int)(width / 8), height / 7, (int)(width / 4), (int)(height / 20)), text = AppManager.Instance.server.MyIp.ToString(), fontColor = Color.White, mainColor = Color.Transparent, scale = 0.9f, fontName = "Fonts/Font3" }; // ip = new Label(Manager) { rectangle = new Rectangle(width / 2 - (int)(width / 8), height / 7, (int)(width / 4), (int)(height / 20)), text = AppManager.Instance.server.MyIp.ToString(), fontColor = Color.White, mainColor = Color.Transparent, scale = 0.9f, fontName = "Fonts/Font3" };
Elements.Add(ip); // Elements.Add(ip);
if (isHost) if (isHost)
{ {
ip = new Label(Manager) { rectangle = new Rectangle(width / 2 - (int)(width / 8), height / 7, (int)(width / 4), (int)(height / 20)), text = AppManager.Instance.server.MyIp.ToString(), fontColor = Color.White, mainColor = Color.Transparent, scale = 0.9f, fontName = "Fonts\\Font3" }; ip = new Label(Manager) { rectangle = new Rectangle(width / 2 - (int)(width / 8), height / 7, (int)(width / 4), (int)(height / 20)), text = AppManager.Instance.server.MyIp.ToString(), fontColor = Color.White, mainColor = Color.Transparent, scale = 0.9f, fontName = "Fonts\\Font3" };
@ -47,12 +47,13 @@ public class WaitingForPlayersGUI : AbstractGUI
scale = 0.3f, scale = 0.3f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts/Font" fontName = "Fonts/Font",
textureName = "Textures/GUI/Button"
}; };
startButton.LeftButtonPressed += () => startButton.LeftButtonPressed += () =>
{ {
// start // start
AppManager.Instance.ChangeState(GameState.HostPlaying); AppManager.Instance.server.StartGame();
// ваш код здесь // ваш код здесь
}; };
Elements.Add(startButton); Elements.Add(startButton);
@ -67,19 +68,24 @@ public class WaitingForPlayersGUI : AbstractGUI
scale = 0.3f, scale = 0.3f,
fontColor = Color.White, fontColor = Color.White,
mainColor = Color.Gray, mainColor = Color.Gray,
fontName = "Fonts/Font" fontName = "Fonts/Font",
textureName = "Textures/GUI/Button"
}; };
waitButton.LeftButtonPressed += () => waitButton.LeftButtonPressed += () =>
{ {
// start // start
AppManager.Instance.ChangeState(GameState.ClientPlaying); AppManager.Instance.SetGUI(new HUD());
// ваш код здесь // ваш код здесь
}; };
Elements.Add(waitButton); Elements.Add(waitButton);
} }
Button bTExit = new Button(Manager) Button bTExit = new Button(Manager)
{ fontName = "Fonts/Font3", scale = 0.4f, text = "<-", fontColor = Color.Black, mainColor = Color.Transparent, rectangle = new Rectangle(width / 30, height / 30, width / 40, width / 40), textureName = "Textures/GUI/checkboxs_off"}; {
fontName = "Fonts/Font3", scale = 0.4f, text = "<-", fontColor = Color.Black, mainColor = Color.Transparent,
rectangle = new Rectangle(width / 30, height / 30, width / 40, width / 40),
textureName = "Textures/GUI/Button2"
};
Elements.Add(bTExit); Elements.Add(bTExit);
bTExit.LeftButtonPressed += () => bTExit.LeftButtonPressed += () =>
{ {

View file

@ -62,12 +62,14 @@ namespace ZoFo.GameCore.GameManagers
ItemManager = new ItemManager.ItemManager(); ItemManager = new ItemManager.ItemManager();
Instance = this; Instance = this;
InputManager = new InputManager(); InputManager = new InputManager();
SoundManager = new SoundManager();
SoundManager.LoadSounds();
SettingsManager = new SettingsManager(); SettingsManager = new SettingsManager();
SettingsManager.LoadSettings(); SettingsManager.LoadSettings();
SoundManager = new SoundManager();
AssetManager = new AssetManager();
SoundManager.LoadSounds();
AssetManager = new AssetManager();
SoundManager.StartAmbientSound("Background menu music");
currentGUI = new MainMenuGUI(); currentGUI = new MainMenuGUI();
debugHud = new DebugHUD(); debugHud = new DebugHUD();
@ -104,7 +106,7 @@ namespace ZoFo.GameCore.GameManagers
protected override void Update(GameTime gameTime) protected override void Update(GameTime gameTime)
{ {
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed ||
Keyboard.GetState().IsKeyDown(Keys.Escape)) { server?.CloseConnection(); Exit(); } Keyboard.GetState().IsKeyDown(Keys.Escape)) { Exit(); }
// debugHud.Set("key", "value"); // debugHud.Set("key", "value");
@ -139,6 +141,8 @@ namespace ZoFo.GameCore.GameManagers
switch (gamestate) switch (gamestate)
{ {
case GameState.ClientPlaying: case GameState.ClientPlaying:
client.Draw(_spriteBatch);
break;
case GameState.HostPlaying: case GameState.HostPlaying:
client.Draw(_spriteBatch); client.Draw(_spriteBatch);
break; break;

View file

@ -12,7 +12,9 @@ public class AssetManager
public AssetContainer Player = new() public AssetContainer Player = new()
{ {
Animations = [ "player_look_down" ], Animations = [ "player_look_down", "player_run_up", "player_run_down", "player_run_right",
"player_run_left", "player_run_right_up", "player_run_left_up", "player_run_right_down",
"player_run_left_down" ],
IdleAnimation = "player_look_down" IdleAnimation = "player_look_down"
}; };
} }

View file

@ -10,8 +10,10 @@ using Microsoft.Xna.Framework;
using ZoFo.GameCore.GameManagers.MapManager.MapElements; using ZoFo.GameCore.GameManagers.MapManager.MapElements;
using ZoFo.GameCore.GameObjects.Entities; using ZoFo.GameCore.GameObjects.Entities;
using ZoFo.GameCore.GameObjects.Entities.LivingEntities; using ZoFo.GameCore.GameObjects.Entities.LivingEntities;
using ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient; using ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient;
using ZoFo.GameCore.Graphics; using ZoFo.GameCore.Graphics;
using ZoFo.GameCore.GameManagers.NetworkManager.SerializableDTO;
using ZoFo.GameCore.GameObjects.Entities.LivingEntities.Player; using ZoFo.GameCore.GameObjects.Entities.LivingEntities.Player;
namespace ZoFo.GameCore.GameManagers.CollisionManager namespace ZoFo.GameCore.GameManagers.CollisionManager
@ -24,6 +26,25 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager
public List<CollisionComponent> EntitiesWithMovements; public List<CollisionComponent> EntitiesWithMovements;
public List<CollisionComponent> ObjectsWithTriggers; public List<CollisionComponent> ObjectsWithTriggers;
public List<CollisionComponent> GetEntitiesToUpdate(Player player)
{
float ViewDistance = 500;
List<CollisionComponent> EntitiesInPlayerArea = new List<CollisionComponent>();
Rectangle ViewArea = new Rectangle((int)(player.position.X), (int)(player.position.Y),
(int)(ViewDistance), (int)(ViewDistance));
for (int i = 0; i < ObjectsWithCollisions.Count; i++)
{
if (ViewArea.Contains((float)ObjectsWithCollisions[i].gameObject.position.X, (float)ObjectsWithCollisions[i].gameObject.position.Y));
{
EntitiesInPlayerArea.Add(ObjectsWithCollisions[i]);
}
}
return EntitiesInPlayerArea;
}
//чекаем коллизии в листе //чекаем коллизии в листе
@ -124,7 +145,7 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager
entity.graphicsComponent.ObjectDrawRectangle.X = (int)entity.position.X; entity.graphicsComponent.ObjectDrawRectangle.X = (int)entity.position.X;
entity.graphicsComponent.ObjectDrawRectangle.Y = (int)entity.position.Y; entity.graphicsComponent.ObjectDrawRectangle.Y = (int)entity.position.Y;
AppManager.Instance.server.AddData(new UpdatePosition() { NewPosition = entity.position, IdEntity = entity.Id }); AppManager.Instance.server.AddData(new UpdatePosition() { NewPosition = new SerializableVector2(entity.position), IdEntity = entity.Id });
AppManager.Instance.debugHud.Set("testPos", entity.position.ToString()); //TODO remove AppManager.Instance.debugHud.Set("testPos", entity.position.ToString()); //TODO remove
} }
@ -233,6 +254,12 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager
rectangle.Y += (int)origin.Y; rectangle.Y += (int)origin.Y;
return rectangle; return rectangle;
} }
public static SerializableVector2 Serialize(this Vector2 vector) => new SerializableVector2(vector);
public static Vector2 RandomVector()
{
return new Vector2((float)Random.Shared.NextDouble() - 0.5f, (float)Random.Shared.NextDouble() - 0.5f);
}
} }
} }

View file

@ -5,18 +5,11 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Formats.Tar;
using System.Linq;
using System.Reflection.Metadata.Ecma335;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using ZoFo.GameCore.GUI; using ZoFo.GameCore.GUI;
namespace ZoFo.GameCore.GameManagers namespace ZoFo.GameCore.GameManagers
{ {
public enum ScopeState { Idle, Left, Right, Top, Down, TopLeft, TopRight, DownLeft, DownRight } public enum ScopeState { Idle, Left, Right, Top, Down, TopLeft, TopRight, DownLeft, DownRight }
public class InputManager public class InputManager
{ {
public event Action ShootEvent; // событие удара(когда нажат X, событие срабатывает) public event Action ShootEvent; // событие удара(когда нажат X, событие срабатывает)
@ -40,6 +33,7 @@ namespace ZoFo.GameCore.GameManagers
private bool isInteract; private bool isInteract;
private KeyboardState lastKeyboardState; private KeyboardState lastKeyboardState;
private KeyboardState keyBoardState;
private GamePadState lastGamePadState; private GamePadState lastGamePadState;
public ScopeState ScopeState { get => currentScopeState; } public ScopeState ScopeState { get => currentScopeState; }
public string currentControlsState; public string currentControlsState;
@ -161,13 +155,13 @@ namespace ZoFo.GameCore.GameManagers
#endregion #endregion
#region Обработка нажатия выстрела. Вызывает событие ShootEvent #region Обработка нажатия выстрела. Вызывает событие ShootEvent
if (keyBoardState.IsKeyDown(Keys.P) && !isShoot) if ((keyBoardState.IsKeyDown(Keys.P) || keyBoardState.IsKeyDown(Keys.F)) && !isShoot)
{ {
isShoot = true; isShoot = true;
ShootEvent?.Invoke(); ShootEvent?.Invoke();
Debug.WriteLine("Выстрел"); Debug.WriteLine("Выстрел");
} }
else if (keyBoardState.IsKeyUp(Keys.P)) else if (keyBoardState.IsKeyUp(Keys.F))
{ {
isShoot = false; isShoot = false;
} }
@ -176,7 +170,6 @@ namespace ZoFo.GameCore.GameManagers
#region Обработка взаимодействия с collectable(например лутом). Вызывает событие OnInteract #region Обработка взаимодействия с collectable(например лутом). Вызывает событие OnInteract
if (keyBoardState.IsKeyDown(Keys.E) && !isInteract) if (keyBoardState.IsKeyDown(Keys.E) && !isInteract)
{ {
OnInteract?.Invoke(); OnInteract?.Invoke();
Debug.WriteLine("взаимодействие с Collectable"); Debug.WriteLine("взаимодействие с Collectable");
} }
@ -203,18 +196,33 @@ namespace ZoFo.GameCore.GameManagers
DebugHUD.Instance.Set("controls", currentScopeState.ToString()); DebugHUD.Instance.Set("controls", currentScopeState.ToString());
} }
#region работа с ScopeState и Vector2 #region работа с ScopeState и Vector2
/// <summary>
/// возвращает число от -14 до 16, начиная с
/// </summary>
/// <param name="vector"></param>
/// <returns></returns>
public int ConvertAttackVector2ToState(Vector2 vector){
int currentSection = (int)Math.Ceiling(Math.Atan2(vector.Y,
vector.X) * (180 / Math.PI) / 360 * 32);
return currentSection;
}
public ScopeState ConvertVector2ToState(Vector2 vector) public ScopeState ConvertVector2ToState(Vector2 vector)
{ {
//if() int currentSection = 0;
int currentSection = (int)Math.Ceiling(Math.Atan2(vector.Y, if(vector.X == 0f && vector.Y == 0f){
currentScopeState = ScopeState.Idle;
}
else
{
currentSection = (int)Math.Ceiling(Math.Atan2(vector.Y,
vector.X) * (180 / Math.PI) / 360 * 16); vector.X) * (180 / Math.PI) / 360 * 16);
DebugHUD.DebugSet("current section", currentSection.ToString());
//DebugHUD.DebugSet("y", InputMovementDirection.Y.ToString());
//DebugHUD.DebugSet("x", InputMovementDirection.X.ToString());
switch(currentSection) switch(currentSection)
{ {
case -1:
currentScopeState = ScopeState.Idle;
break;
case 0 or 1: case 0 or 1:
currentScopeState = ScopeState.Right; currentScopeState = ScopeState.Right;
break; break;
@ -242,8 +250,43 @@ namespace ZoFo.GameCore.GameManagers
default: default:
break; break;
} }
DebugHUD.DebugSet("current section", currentSection.ToString());
DebugHUD.DebugSet("y", vector.Y.ToString());
DebugHUD.DebugSet("x", vector.X.ToString());
}
return currentScopeState; return currentScopeState;
}
public static Vector2 ConvertStateToVector2(ScopeState scopeState)
{
switch (scopeState)
{
case ScopeState.Idle:
return new Vector2(0, 0);
case ScopeState.Left:
return new Vector2(-1, 0);
case ScopeState.Right:
return new Vector2(1, 0);
case ScopeState.Top:
return new Vector2(0, -1);
case ScopeState.Down:
return new Vector2(0, 1);
case ScopeState.TopLeft:
return new Vector2(-1, -1);
case ScopeState.TopRight:
return new Vector2(-1, 1);
case ScopeState.DownLeft:
return new Vector2(1, -1);
case ScopeState.DownRight:
return new Vector2(1, 1);
default:
return new Vector2(0, 0);
}
} }
#endregion #endregion
public bool ButtonClicked(Keys key) => keyBoardState.IsKeyUp(key) && keyBoardState.IsKeyDown(key);
} }
} }

View file

@ -25,11 +25,15 @@ namespace ZoFo.GameCore.GameManagers.ItemManager
public void Initialize() public void Initialize()
{ {
tagItemPairs = new Dictionary<string, ItemInfo>(); tagItemPairs = new Dictionary<string, ItemInfo>();
tagItemPairs.Add("Ammo", new ItemInfo("Ammo", "деньги в метро", "Textures\\icons\\Collectables\\Ammo",false,null)); tagItemPairs.Add("rottenflesh", new ItemInfo("rottenflesh", "БУХАТЬ", "Textures/icons/Collectables/RottenFlesh",false,null));
tagItemPairs.Add("wood", new ItemInfo("wood", "бревна кусок", "Textures\\Test\\wood",false,null)); tagItemPairs.Add("purebottleofwater", new ItemInfo("purebottleofwater", "БУХАТЬ 2", "Textures/icons/Collectables/PureBottleOfWater",false,null));
tagItemPairs.Add("rock", new ItemInfo("rock", "пять галек", "Textures\\Test\\rock", false, null)); tagItemPairs.Add("bottleofwater", new ItemInfo("bottleofwater", "БУХАТЬ", "Textures/icons/Collectables/BottleOfWater",false,null));
tagItemPairs.Add("steel", new ItemInfo("steel", "метал, метал, \nжелезо, метал", "Textures\\Test\\steel", false, null)); //tagItemPairs.Add("antiradin", new ItemInfo("antiradin", "радиацию опускает", "Textures/icons/Collectables/Ammo",false,null));
tagItemPairs.Add("pickaxe", new ItemInfo("steel", "прямой путь к \nстановлению каменьщиком", "Textures\\Test\\pickaxe", true, new Dictionary<string, int>() tagItemPairs.Add("ammo", new ItemInfo("ammo", "деньги в метро", "Textures/icons/Collectables/Ammo",false,null));
tagItemPairs.Add("wood", new ItemInfo("wood", "бревна кусок", "Textures/icons/Collectables/Wood",false,null));
tagItemPairs.Add("peeble", new ItemInfo("peeble", "пять галек", "Textures/icons/Collectables/Peeble", false, null));
tagItemPairs.Add("steel", new ItemInfo("steel", "метал, метал, \nжелезо, метал", "Textures/icons/Collectables/Steel", false, null));
tagItemPairs.Add("pickaxe", new ItemInfo("pickaxe", "прямой путь к \nстановлению каменьщиком", "Textures/Test/pickaxe", true, new Dictionary<string, int>()
{ {
{"wood", 2}, {"wood", 2},
{"steel", 3} {"steel", 3}

View file

@ -1,7 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.Json;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace ZoFo.GameCore.GameManagers.ItemManager namespace ZoFo.GameCore.GameManagers.ItemManager
@ -15,7 +17,7 @@ namespace ZoFo.GameCore.GameManagers.ItemManager
{ {
LoadPlayerData(); LoadPlayerData();
} }
public Dictionary<string, int> items; public Dictionary<string, int> items = new Dictionary<string, int>();
/// <summary> /// <summary>
/// Принимает тэг и крафтит этот объект /// Принимает тэг и крафтит этот объект
/// </summary> /// </summary>
@ -50,11 +52,44 @@ namespace ZoFo.GameCore.GameManagers.ItemManager
public void LoadPlayerData() public void LoadPlayerData()
{ {
//TODO if (File.Exists("Items.txt"))
items = new Dictionary<string, int>(); {
items.Add("wood", 5); string data;
items.Add("steel", 110); using (StreamReader reader = new StreamReader("Items.txt"))
items.Add("rock", 6); {
data = reader.ReadToEnd();
}
List<PlayerItemsData> itemsDatas = JsonSerializer.Deserialize<List<PlayerItemsData>>(data);
foreach (var item in itemsDatas)
{
items.Add(item.Name, item.Count);
} }
} }
} }
public void SavePlayerData()
{
var options = new JsonSerializerOptions { WriteIndented = true };
List<PlayerItemsData> playerItemsDatas = new List<PlayerItemsData>();
foreach (var item in items)
{
playerItemsDatas.Add(new PlayerItemsData { Name = item.Key, Count = item.Value });
}
string data = JsonSerializer.Serialize<List<PlayerItemsData>>(playerItemsDatas);
using (StreamWriter outputFile = new StreamWriter("Items.txt", new FileStreamOptions() { Mode = FileMode.Create, Access = FileAccess.Write } ))
{
outputFile.WriteLine(data);
}
}
}
class PlayerItemsData
{
public string Name { get; set; }
public int Count { get; set; }
}
}

View file

@ -94,11 +94,12 @@ namespace ZoFo.GameCore.GameManagers.MapManager
switch (tile.Type) switch (tile.Type)
{ {
case "Tile": case "Tile":
AppManager.Instance.server.RegisterGameObject(new MapObject(position, AppManager.Instance.server.RegisterGameObject(new MapObject(position,
new Vector2(tileSet.TileWidth, tileSet.TileHeight), new Vector2(tileSet.TileWidth, tileSet.TileHeight),
sourceRectangle, sourceRectangle,
"Textures/TileSetImages/" + Path.GetFileName(tileSet.Image).Replace(".png", ""))); "Content/Textures/TileSetImages/" + Path.GetFileName(tileSet.Image).Replace(".png", "")));
break; break;
case "StopObject": case "StopObject":
@ -107,7 +108,7 @@ namespace ZoFo.GameCore.GameManagers.MapManager
AppManager.Instance.server.RegisterGameObject(new StopObject(position, AppManager.Instance.server.RegisterGameObject(new StopObject(position,
new Vector2(tileSet.TileWidth, tileSet.TileHeight), new Vector2(tileSet.TileWidth, tileSet.TileHeight),
sourceRectangle, sourceRectangle,
"Textures/TileSetImages/" + Path.GetFileName(tileSet.Image).Replace(".png", ""), "Content/Textures/TileSetImages/" + Path.GetFileName(tileSet.Image).Replace(".png", ""),
collisionRectangles.ToArray())); collisionRectangles.ToArray()));
break; break;

View file

@ -1,3 +1,5 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.SqlTypes; using System.Data.SqlTypes;
@ -10,47 +12,52 @@ using System.Text.Json;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using ZoFo.GameCore.GameManagers.NetworkManager.Updates; using ZoFo.GameCore.GameManagers.NetworkManager.Updates;
using ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient;
using ZoFo.GameCore.GUI;
namespace ZoFo.GameCore.GameManagers.NetworkManager namespace ZoFo.GameCore.GameManagers.NetworkManager
{ {
public class ClientNetworkManager public class ClientNetworkManager
{ {
private int port = 0; private int PlayerId;
private IPEndPoint endPoint; private IPEndPoint endPoint;
private IPEndPoint sendingEP;
private Socket socket; private Socket socket;
List<UpdateData> updates = new List<UpdateData>(); List<UpdateData> updates = new List<UpdateData>();
private List<Datagramm> waitingDatagramm = new List<Datagramm>();
private int currentServerDatagrammId = 0;
public delegate void OnDataSent(string Data); public delegate void OnDataSent(string Data);
public event OnDataSent GetDataSent; // event public event OnDataSent GetDataSent; // event
public bool IsConnected { get { return socket.Connected; } } public bool IsConnected { get { return socket.Connected; } }
public IPEndPoint InfoConnect => (IPEndPoint)socket.LocalEndPoint ?? endPoint; public IPEndPoint InfoConnect => (IPEndPoint)socket.LocalEndPoint ?? endPoint;
public ClientNetworkManager() public ClientNetworkManager()
{ {
Init(); Init();
} }
public bool SocketConnected()
{
return socket.Connected;
}
public void Init() //create endPoint, socket public void Init() //create endPoint, socket
{ {
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); GetDataSent += AnalyzeData;
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
endPoint = new IPEndPoint(GetIp(), 8081);
socket.Bind(endPoint);
Thread thread = new Thread(StartListening);
thread.IsBackground = true;
thread.Start();
} }
public void SendData() public void SendData()
{ {
for (int i = 0; i < updates.Count; i++) if (updates != null)
{ {
Datagramm Datagramm = new Datagramm();
AppManager.Instance.server.ProcessIUpdateData(updates[i]); Datagramm.updateDatas = updates;
} byte[] bytes = Encoding.UTF8.GetBytes(System.Text.Json.JsonSerializer.Serialize(Datagramm)); //нужно сериализовать
socket.SendTo(bytes, sendingEP);
updates.Clear(); updates.Clear();
return;// TODO remove }
byte[] bytes = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(updates)); //нужно сериализовать
socket.Send(bytes);
} }
public void AddData(UpdateData UpdateData) public void AddData(UpdateData UpdateData)
@ -58,12 +65,151 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
updates.Add(UpdateData); updates.Add(UpdateData);
} }
public void StopConnection() #region Working With Data RDP
public void AnalyzeData(string data)
{ {
socket.Shutdown(SocketShutdown.Both); JObject jObj = JsonConvert.DeserializeObject(data) as JObject;
socket.Close(); JToken token = JToken.FromObject(jObj);
JToken updateDatas = token["updateDatas"];
if (updateDatas.HasValues)
{
Datagramm Dgramm = new Datagramm();
Dgramm.isImportant = token["isImportant"].ToObject<bool>();
Dgramm.DatagrammId = token["DatagrammId"].ToObject<int>();
if (PlayerId == 0)
{
PlayerId = token["PlayerId"].ToObject<int>();
if (AppManager.Instance.gamestate != GameState.HostPlaying)
{
AppManager.Instance.ChangeState(GameState.ClientPlaying);
}
SendAcknowledgement(Dgramm.DatagrammId);
}
if (Dgramm.isImportant)
{
if (Dgramm.DatagrammId == currentServerDatagrammId + 1)
{
currentServerDatagrammId++;
Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]);
ExecuteDatagramm(Dgramm);
CheckDatagramm();
}
else if (Dgramm.DatagrammId > currentServerDatagrammId + 1 &&
waitingDatagramm.Find(x => x.DatagrammId == Dgramm.DatagrammId) == null)
{
Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]);
waitingDatagramm.Add(Dgramm);
}
SendAcknowledgement(Dgramm.DatagrammId);
}
else
{
Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]);
ExecuteDatagramm(Dgramm);
}
} }
}
public List<UpdateData> GetSentUpdates(JToken updatesToken)
{
List<UpdateData> data = new List<UpdateData>();
JArray updateDatas = updatesToken as JArray;
UpdateData update = new UpdateData();
foreach (JObject token in updateDatas.Children())
{
switch (token["UpdateType"].ToObject<string>())
{
case "UpdateAnimation":
update = token.ToObject<UpdateAnimation>();
data.Add(update);
break;
case "UpdateEntityHealth":
update = token.ToObject<UpdateEntityHealth>();
data.Add(update);
break;
case "UpdateGameEnded":
update = token.ToObject<UpdateGameEnded>();
data.Add(update);
break;
case "UpdateGameObjectCreated":
update = token.ToObject<UpdateGameObjectCreated>();
data.Add(update);
break;
case "UpdateGameObjectWithoutIdCreated":
update = token.ToObject<UpdateGameObjectWithoutIdCreated>();
data.Add(update);
break;
case "UpdateGameObjectDeleted":
update = token.ToObject<UpdateGameObjectDeleted>();
data.Add(update);
break;
case "UpdateInteraction":
update = token.ToObject<UpdateInteraction>();
data.Add(update);
break;
case "UpdateStopObjectCreated":
update = token.ToObject<UpdateStopObjectCreated>();
data.Add(update);
break;
case "UpdateInteractionReady":
update = token.ToObject<UpdateInteractionReady>();
data.Add(update);
break;
case "UpdateLoot":
update = token.ToObject<UpdateLoot>();
data.Add(update);
break;
case "UpdatePlayerParametrs":
update = token.ToObject<UpdatePlayerParametrs>();
data.Add(update);
break;
case "UpdatePosition":
update = token.ToObject<UpdatePosition>();
data.Add(update);
break;
case "UpdateTileCreated":
update = token.ToObject<UpdateTileCreated>();
data.Add(update);
break;
}
}
return data;
}
public void SendAcknowledgement(int DatagrammId)
{
Datagramm Dgramm = new Datagramm() { DatagrammId = DatagrammId, PlayerId = PlayerId };
string data = System.Text.Json.JsonSerializer.Serialize(Dgramm);
byte[] buffer = Encoding.UTF8.GetBytes(data);
socket.SendTo(buffer, sendingEP);
}
void CheckDatagramm()
{
Datagramm orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1);
while (orderedDgramm != null)
{
currentServerDatagrammId++;
ExecuteDatagramm(orderedDgramm);
waitingDatagramm.Remove(orderedDgramm);
orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1);
}
}
void ExecuteDatagramm(Datagramm Dgramm)
{
AppManager.Instance.client.UpdatesList(Dgramm.updateDatas);
//Достаёт Update и передает в ивент
}
#endregion
#region Join
/// <summary> /// <summary>
/// приложение пытается подключиться к комнате /// приложение пытается подключиться к комнате
/// </summary> /// </summary>
@ -71,19 +217,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
/// <param name="port"></param> /// <param name="port"></param>
public void JoinRoom(string ip, int port) // multyplayer public void JoinRoom(string ip, int port) // multyplayer
{ {
sendingEP = new IPEndPoint(IPAddress.Parse(ip), port);
endPoint = new IPEndPoint(IPAddress.Parse(ip), port);
socket.Connect(endPoint);
SendData();
Thread listen = new Thread(StartListening);
listen.IsBackground = true;
listen.Start();
}
public void JoinRoom(IPEndPoint endPoint) // multyplayer
{
this.endPoint = endPoint;
socket.Connect(endPoint);
SendData(); SendData();
Thread listen = new Thread(StartListening); Thread listen = new Thread(StartListening);
listen.IsBackground = true; listen.IsBackground = true;
@ -95,38 +229,45 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
/// </summary> /// </summary>
public void JoinYourself(int port) // single player public void JoinYourself(int port) // single player
{ {
endPoint = new IPEndPoint(GetIp(), port); sendingEP = AppManager.Instance.server.MyIp;
socket.Connect(endPoint);
SendData(); SendData();
Thread listen = new Thread(StartListening); Thread listen = new Thread(StartListening);
listen.IsBackground = true; listen.IsBackground = true;
listen.Start(); listen.Start();
} }
#endregion
public static IPAddress GetIp() public static IPAddress GetIp()
{ {
/*string hostName = Dns.GetHostName(); // Retrive the Name of HOST string hostName = Dns.GetHostName(); // Retrive the Name of HOST
var ipList = Dns.GetHostByName(hostName).AddressList; var ipList = Dns.GetHostEntry(hostName).AddressList;
var ipV4List = new List<IPAddress>();
foreach (var ip in ipList) foreach (var ip in ipList)
{ {
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{ {
return ip; ipV4List.Add(ip);
} }
}*/ }
return IPAddress.Parse("127.0.0.1"); if (ipV4List.Count>0)
{
return ipV4List[ipV4List.Count - 1];
}
return IPAddress.Loopback;
} }
//поток 2 //поток 2
public void StartListening() public void StartListening()
{ {
while(socket.Connected) byte[] buffer = new byte[65535];
string data;
while (socket != null)
{ {
byte[] bytes = new byte[65535]; EndPoint senderRemote = new IPEndPoint(IPAddress.Any, 0);
var countAnsw = socket.Receive(bytes); //Вылетает если кто то закрыл int size = socket.ReceiveFrom(buffer, buffer.Length, SocketFlags.None, ref senderRemote);
string update = Encoding.UTF8.GetString(bytes, 0, countAnsw); // обновление отосланные сервером byte[] correctedBuffer = new byte[size];
GetDataSent(update); Array.Copy(buffer, correctedBuffer, size);
data = Encoding.UTF8.GetString(correctedBuffer);
GetDataSent(data);
} }
} }
} }

View file

@ -9,10 +9,11 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.SerializableDTO
{ {
public class SerializablePoint public class SerializablePoint
{ {
public int X; public int X { get; set; }
public int Y; public int Y { get; set; }
public SerializablePoint(Point point) { X = point.X; Y = point.Y;} public SerializablePoint(Point point) { X = point.X; Y = point.Y;}
public SerializablePoint() { }
public Point GetPoint() { return new Point(X, Y);} public Point GetPoint() { return new Point(X, Y);}
} }
} }

View file

@ -10,24 +10,20 @@ using ZoFo.GameCore.GameManagers.NetworkManager.SerializableDTO;
namespace ZoFo.GameCore.GameManagers.NetworkManager.SerializableDTO namespace ZoFo.GameCore.GameManagers.NetworkManager.SerializableDTO
{ {
[Serializable] [Serializable]
[JsonSerializable(typeof(SerializableRectangle))]
public class SerializableRectangle public class SerializableRectangle
{ {
public SerializablePoint Size { get; set; } public SerializablePoint Size { get; set; }
public SerializablePoint Location { get; set; } public SerializablePoint Location { get; set; }
public int X { get; set; }
public int Y { get; set; }
public SerializableRectangle() public SerializableRectangle()
{ {
} }
public SerializableRectangle(Rectangle rectangle) { X = rectangle.X; Y = rectangle.Y; public SerializableRectangle(Rectangle rectangle) { Size = new SerializablePoint(rectangle.Size); Location = new SerializablePoint(rectangle.Location); }
Size = new SerializablePoint(rectangle.Size); Location = new SerializablePoint(rectangle.Location); }
public Rectangle GetRectangle() public Rectangle GetRectangle()
{ {
return new Rectangle() { X = X, Y = Y, Size = Size.GetPoint(), Location = Location.GetPoint() }; return new Rectangle(Location.GetPoint(), Size.GetPoint());
} }
} }
} }

View file

@ -0,0 +1,28 @@
using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices.JavaScript;
using System.Text;
using System.Threading.Tasks;
namespace ZoFo.GameCore.GameManagers.NetworkManager.SerializableDTO
{
[Serializable]
public class SerializableVector2
{
public float X { get; set; }
public float Y { get; set; }
public SerializableVector2(Vector2 vector)
{
X = vector.X;
Y = vector.Y;
}
public Vector2 GetVector2()
{
return new Vector2(X, Y);
}
}
}

View file

@ -13,23 +13,32 @@ using System.Text.Json.Serialization;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using ZoFo.GameCore.GameManagers.NetworkManager.Updates; using ZoFo.GameCore.GameManagers.NetworkManager.Updates;
using ZoFo.GameCore.GameManagers.NetworkManager.SerializableDTO;
using ZoFo.GameCore.GUI;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient;
using ZoFo.GameCore.GameManagers.NetworkManager.Updates.ClientToServer;
namespace ZoFo.GameCore.GameManagers.NetworkManager namespace ZoFo.GameCore.GameManagers.NetworkManager
{ {
public class ServerNetworkManager public class ServerNetworkManager
{ {
private IPAddress ip = IPAddress.Parse("127.0.0.1");
private const int port = 0;
private IPEndPoint endPoint;
private Socket socket; private Socket socket;
private List<Socket> clients; private IPAddress ip;
public List<UpdateData> updates; private bool isMultiplayer;
//Player Id to Player endPoint
private List<IPEndPoint> clientsEP;
public IPEndPoint endPoint;
private List<UpdateData> commonUpdates;
private List<UpdateData> importantUpdates;
private List<Datagramm> sendedData;
private List<Datagramm> arrivingDataId;
private int currentDatagrammId = 0;
public delegate void OnDataSend(string data); public delegate void OnDataSend(string data);
public event OnDataSend GetDataSend; // event public event OnDataSend GetDataSend; // event
Dictionary<Socket, Thread> managerThread; Thread serverThread;
Thread serverTheread; int datapackSize = 150;
public IPEndPoint InfoConnect => (IPEndPoint)socket.LocalEndPoint ?? endPoint;
public ServerNetworkManager() { Init(); } public ServerNetworkManager() { Init(); }
/// <summary> /// <summary>
@ -37,13 +46,18 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
/// </summary> /// </summary>
private void Init() private void Init()
{ {
endPoint = new IPEndPoint(GetIp(), port); endPoint = new IPEndPoint(GetIp(), 8080);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
managerThread = new Dictionary<Socket, Thread>(); clientsEP = new List<IPEndPoint>();
clients = new List<Socket>(); commonUpdates = new List<UpdateData>();
updates = new List<UpdateData>(); importantUpdates = new List<UpdateData>();
managerThread = new Dictionary<Socket, Thread>(); sendedData = new List<Datagramm>();
arrivingDataId = new List<Datagramm>();
GetDataSend += AnalyzeData;
socket.Bind(endPoint); socket.Bind(endPoint);
} }
/// <summary> /// <summary>
@ -52,16 +66,26 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
/// <returns></returns> /// <returns></returns>
public static IPAddress GetIp() public static IPAddress GetIp()
{ {
/*string hostName = Dns.GetHostName(); // Retrive the Name of HOST string hostName = Dns.GetHostName(); // Retrive the Name of HOST
var ipList = Dns.GetHostByName(hostName).AddressList; var ipList = Dns.GetHostEntry(hostName).AddressList;
var ipV4List = new List<IPAddress>();
foreach (var ip in ipList) foreach (var ip in ipList)
{ {
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{ {
return ip; ipV4List.Add(ip);
} }
}*/ }
return IPAddress.Parse("127.0.0.1"); if (ipV4List.Count > 0)
{
return ipV4List[ipV4List.Count - 1];
}
return IPAddress.Loopback;
}
public void SetIsMultiplayer(bool isMultiplayer)
{
this.isMultiplayer = isMultiplayer;
} }
/// <summary> /// <summary>
@ -69,26 +93,76 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
/// </summary> /// </summary>
public void SendData() public void SendData()
{ {
for (int i = 0; i < updates.Count; i++) #region Network Sending SinglePlayerFix
{ //for (int i = 0; i < updates.Count; i++)
//{
AppManager.Instance.client.GotData(updates[i]); // AppManager.Instance.client.GotData(updates[i]);
} //}
updates.Clear(); //updates.Clear();
return; //TODO TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK //return; //TODO TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK
//Что это? //Что это?
//по 10 паков за раз TODO FIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXIT //по 10 паков за раз TODO FIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXIT
List<UpdateData> datasToSend = new List<UpdateData>(); #endregion
for (int i = 0; i < 200 && i<updates.Count; i++) if (arrivingDataId.Count != 0)
datasToSend.Add(updates[i]);
string data = JsonSerializer.Serialize(datasToSend);
var databytes = Encoding.UTF8.GetBytes(data);
foreach (Socket socket in clients)
{ {
clients[0].SendAsync(databytes); List<Datagramm> actualArrivingId = arrivingDataId;
for (int i = 0; i < actualArrivingId.Count; i++)
{
sendedData.Remove(sendedData.Find(x => x.DatagrammId == actualArrivingId[i].DatagrammId
&& x.PlayerId == actualArrivingId[i].PlayerId));
} }
for (int i = 0; i < 200 && i< datasToSend.Count; i++) arrivingDataId.Clear();
updates.RemoveAt(0); }
List<UpdateData> dataToSend;
if (importantUpdates.Count > 0)
{
dataToSend = new List<UpdateData>();
for (int j = 0; j < datapackSize && j < importantUpdates.Count; j++)
dataToSend.Add(importantUpdates[j]);
for (int i = 0; i < clientsEP.Count; i++)
{
Datagramm impDgramm = new Datagramm();
impDgramm.DatagrammId = currentDatagrammId;
impDgramm.updateDatas = dataToSend;
impDgramm.isImportant = true;
impDgramm.PlayerId = i + 1;
sendedData.Add(impDgramm);
}
for (int j = 0; j < datapackSize && j < dataToSend.Count; j++)
importantUpdates.RemoveAt(0);
currentDatagrammId++;
}
if (sendedData.Count != 0)
{
for (int i = 0; i < clientsEP.Count; i++)
{
foreach (Datagramm Dgramm in sendedData.Where(x => x.PlayerId == i+1))
{
string impData = System.Text.Json.JsonSerializer.Serialize(Dgramm);
byte[] impBuffer = Encoding.UTF8.GetBytes(impData);
socket.SendTo(impBuffer, clientsEP[i]);
}
}
}
Datagramm unImpDgramm = new Datagramm();
dataToSend = new List<UpdateData>();
for (int i = 0; i < 200 && i < commonUpdates.Count; i++)
dataToSend.Add(commonUpdates[i]);
unImpDgramm.updateDatas = dataToSend;
string data = System.Text.Json.JsonSerializer.Serialize(unImpDgramm);
byte[] buffer = Encoding.UTF8.GetBytes(data);
foreach (EndPoint sendingEP in clientsEP)
{
socket.SendTo(buffer, sendingEP);
}
for (int i = 0; i < 200 && i < dataToSend.Count; i++)
commonUpdates.RemoveAt(0);
} }
/// <summary> /// <summary>
@ -97,42 +171,41 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
/// <param name="data"></param> /// <param name="data"></param>
public void AddData(UpdateData data) public void AddData(UpdateData data)
{ {
updates.Add(data); if (data.isImportant)
}
/// <summary>
/// По сути конец игры и отключение игроков
/// </summary>
public void CloseConnection()
{ {
foreach (var item in clients) importantUpdates.Add(data);
{
//Закрывает сокеты клиентов
item.Shutdown(SocketShutdown.Both);
item.Close();
} }
foreach (var item in managerThread) else {
{ commonUpdates.Add(data);
foreach (var socket in clients)
{
//Закрывает потоки клиентов
managerThread[socket].Interrupt();
} }
} }
//очищает листы
managerThread.Clear();
clients.Clear();
}
/// <summary> /// <summary>
/// Начинает работу сервера (Ожидает подключений) /// Начинает работу сервера (Ожидает подключений)
/// </summary> /// </summary>
/// <param name="players"></param> /// <param name="players"></param>
public void Start(object players) public void Start()
{ {
serverTheread = new Thread(StartWaitingForPlayers); serverThread = new Thread(StartWaitingForPlayers);
serverTheread.IsBackground = true; serverThread.IsBackground = true;
serverTheread.Start(players); serverThread.Start();
}
public void StartGame()
{
for (int i = 0; i < clientsEP.Count; i++)
{
Datagramm initDgramm = new Datagramm();
initDgramm.isImportant = true;
initDgramm.DatagrammId = currentDatagrammId;
initDgramm.PlayerId = i + 1;
sendedData.Add(initDgramm);
string data = System.Text.Json.JsonSerializer.Serialize(initDgramm);
byte[] buffer = Encoding.UTF8.GetBytes(data);
socket.SendTo(buffer, clientsEP[i]);
}
currentDatagrammId++;
AppManager.Instance.ChangeState(GameState.HostPlaying);
AppManager.Instance.SetGUI(new HUD());////
} }
//Потоки Клиентов //Потоки Клиентов
@ -140,43 +213,74 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
/// Слушает игроков, которые хотят подключиться /// Слушает игроков, которые хотят подключиться
/// </summary> /// </summary>
/// <param name="players"></param> /// <param name="players"></param>
public void StartWaitingForPlayers(object players) public void StartWaitingForPlayers()
{ {
int playNumber = (int)players; byte[] buffer = new byte[65535];
string data;
socket.Listen(playNumber); while (socket != null)
for (int i = 0; i < playNumber; i++)
{ {
Socket client = socket.Accept(); EndPoint senderRemote = (EndPoint)new IPEndPoint(IPAddress.Any, 0);
AppManager.Instance.debugHud.Log($"Connect {client.LocalEndPoint.ToString()}"); int size = socket.ReceiveFrom(buffer, buffer.Length, SocketFlags.None, ref senderRemote);
Thread thread = new Thread(StartListening); if (AppManager.Instance.gamestate != GameState.HostPlaying && !clientsEP.Contains(senderRemote) &&
thread.IsBackground = true; senderRemote != new IPEndPoint(IPAddress.Any, 0))
thread.Start(client); {
managerThread.Add(client, thread); clientsEP.Add((IPEndPoint)senderRemote);
clients.Add(client); AppManager.Instance.debugHud.Log($"Connect {senderRemote.ToString()}");
//AppManager.Instance.ChangeState(GameState.HostPlaying); if (!isMultiplayer) AppManager.Instance.ChangeState(GameState.HostPlaying);
//добавляем клиентов в лист // Отправлять Init апдейт с информацией об ID игрока и ID датаграмма на сервере
//Можно добавить bool isInit для Датаграммов
} }
AppManager.Instance.ChangeState(GameState.HostPlaying); byte[] correctedBuffer = new byte[size];
} Array.Copy(buffer, correctedBuffer, size);
data = Encoding.UTF8.GetString(correctedBuffer);
/// <summary> GetDataSend(data);
/// начать слушать клиентов в самой игре активируют Ивент
/// </summary>
/// <param name="socket"></param>
private void StartListening(object socket)
{
// obj to Socket
Socket client = (Socket)socket;
while (client.Connected)
{
var buff = new byte[65535];
var answ = client.Receive(buff);
string response = Encoding.UTF8.GetString(buff, 0, answ);
GetDataSend(response);
}
Task.Delay(-1);
} }
} }
public void AnalyzeData(string data)
{
JObject jObj = JsonConvert.DeserializeObject(data) as JObject;
JToken token = JToken.FromObject(jObj);
JToken updateDatas = token["updateDatas"];
Datagramm Dgramm = new Datagramm();
Dgramm.PlayerId = token["PlayerId"].ToObject<int>();
if (!updateDatas.HasValues)
{
//Обработка acknowledgement
Dgramm.DatagrammId = token["DatagrammId"].ToObject<int>();
arrivingDataId.Add(Dgramm);
}
else
{
List<UpdateData> updates = GetSentUpdates(updateDatas);
AppManager.Instance.server.UpdatesList(updates);
}
}
public List<UpdateData> GetSentUpdates(JToken updatesToken)
{
List<UpdateData> data = new List<UpdateData>();
JArray updateDatas = updatesToken as JArray;
UpdateData update = new UpdateData();
foreach (JObject token in updateDatas.Children())
{
switch (token["UpdateType"].ToObject<string>())
{
case "UpdateInput":
update = token.ToObject<UpdateInput>();
data.Add(update);
break;
case "UpdateInputInteraction":
update = token.ToObject<UpdateInputInteraction>();
data.Add(update);
break;
case "UpdateInputShoot":
update = token.ToObject<UpdateInputShoot>();
data.Add(update);
break;
}
}
return data;
}
}
} }

View file

@ -5,14 +5,15 @@ using Microsoft.Xna.Framework;
using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.X509Certificates;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using ZoFo.GameCore.GameManagers.NetworkManager.SerializableDTO;
namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ClientToServer namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ClientToServer
{ {
public class UpdateInput :UpdateData public class UpdateInput :UpdateData
{ {
// public int IdEntity { get; set; } // public int IdEntity { get; set; }
public Vector2 InputMovementDirection{get;set;} public SerializableVector2 InputMovementDirection{get;set;}
public Vector2 InputAttackDirection {get;set;} public SerializableVector2 InputAttackDirection {get;set;}
public UpdateInput() public UpdateInput()
{ {
UpdateType = "UpdateInput"; UpdateType = "UpdateInput";

View file

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates
{
public class Datagramm
{
public int DatagrammId { get; set; }
public bool isImportant { get; set; }
public List<UpdateData> updateDatas { get; set; }
public int PlayerId { get; set; }
}
}

View file

@ -0,0 +1,16 @@

using Microsoft.Xna.Framework;
using ZoFo.GameCore.GameManagers.NetworkManager.SerializableDTO;
namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient
{
/// <summary>
/// Хранит новое сосотяние анимации
/// </summary>
public class UpdateGameObjectWithoutIdCreated : UpdateData
{
public UpdateGameObjectWithoutIdCreated() { UpdateType = "UpdateGameObjectWithoutIdCreated"; isImportant = true; }
public string GameObjectClassName { get; set; }
public SerializableVector2 position { get; set; }
}
}

View file

@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using ZoFo.GameCore.GameManagers.NetworkManager.SerializableDTO;
namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient
{ {
@ -12,9 +13,12 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient
/// </summary> /// </summary>
public class UpdateGameObjectCreated : UpdateData public class UpdateGameObjectCreated : UpdateData
{ {
public UpdateGameObjectCreated() { UpdateType = "UpdateGameObjectCreated"; } public UpdateGameObjectCreated() { UpdateType = "UpdateGameObjectCreated"; isImportant = true; }
public string GameObjectType;
public string GameObjectId; public string GameObjectType { get; set; }
public Vector2 position;
public string GameObjectId { get; set; }
public SerializableVector2 position { get; set; }
} }
} }

View file

@ -11,7 +11,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient
/// </summary> /// </summary>
public class UpdateGameObjectDeleted : UpdateData public class UpdateGameObjectDeleted : UpdateData
{ {
public UpdateGameObjectDeleted() { UpdateType = "UpdateGameObjectDeleted"; } public UpdateGameObjectDeleted() { UpdateType = "UpdateGameObjectDeleted"; isImportant = false; }
public string GameObjectType; public string GameObjectType { get; set; }
} }
} }

View file

@ -11,12 +11,16 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient
/// </summary> /// </summary>
public class UpdateLoot : UpdateData public class UpdateLoot : UpdateData
{ {
public string lootName; public string lootName { get; set; }
public UpdateLoot() { UpdateType = "UpdateLoot"; } public int quantity { get; set; }
public UpdateLoot(string lootName) public UpdateLoot() { UpdateType = "UpdateLoot"; isImportant = true; }
public UpdateLoot(string lootName, int quantity, int id)
{ {
UpdateType = "UpdateLoot"; UpdateType = "UpdateLoot";
this.lootName = lootName; this.lootName = lootName;
this.quantity = quantity;
IdEntity = id;
isImportant = true;
} }
} }
} }

View file

@ -11,6 +11,8 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient
/// </summary> /// </summary>
public class UpdatePlayerParametrs : UpdateData public class UpdatePlayerParametrs : UpdateData
{ {
public UpdatePlayerParametrs() { UpdateType = "UpdatePlayerParametrs"; } public UpdatePlayerParametrs() { UpdateType = "UpdatePlayerParametrs"; isImportant = true; }
public float radiatoin { get; set; }
public float health { get; set; }
} }
} }

View file

@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using ZoFo.GameCore.GameManagers.NetworkManager.SerializableDTO;
using ZoFo.GameCore.GameObjects.Entities.LivingEntities; using ZoFo.GameCore.GameObjects.Entities.LivingEntities;
namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient
@ -15,6 +16,6 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient
{ {
public UpdatePosition() { UpdateType = "UpdatePosition"; } public UpdatePosition() { UpdateType = "UpdatePosition"; }
public Vector2 NewPosition { get; set; } public SerializableVector2 NewPosition { get; set; }
} }
} }

View file

@ -11,9 +11,9 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient
{ {
internal class UpdateStopObjectCreated : UpdateData internal class UpdateStopObjectCreated : UpdateData
{ {
public UpdateStopObjectCreated() { UpdateType = "UpdateStopObjectCreated"; } public UpdateStopObjectCreated() { UpdateType = "UpdateStopObjectCreated"; isImportant = true; }
public Texture2D TextureTile { get; set; } public Texture2D TextureTile { get; set; }
public Vector2 Position { get; set; } public SerializableVector2 Position { get; set; }
public SerializablePoint Size { get; set; } public SerializablePoint Size { get; set; }
public SerializableRectangle sourceRectangle { get; set; } public SerializableRectangle sourceRectangle { get; set; }
public string tileSetName { get; set; } public string tileSetName { get; set; }

View file

@ -17,9 +17,9 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient
/// </summary> /// </summary>
public class UpdateTileCreated : UpdateData public class UpdateTileCreated : UpdateData
{ {
public UpdateTileCreated() { UpdateType = "UpdateTileCreated"; } public UpdateTileCreated() { UpdateType = "UpdateTileCreated"; isImportant = true; }
public Texture2D TextureTile { get; set; } [JsonInclude]
public Vector2 Position { get; set; } public SerializableVector2 Position { get; set; }
public SerializablePoint Size { get; set; } public SerializablePoint Size { get; set; }
public SerializableRectangle sourceRectangle { get; set; } public SerializableRectangle sourceRectangle { get; set; }
public string tileSetName { get; set; } public string tileSetName { get; set; }

View file

@ -15,19 +15,24 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates
[JsonDerivedType(typeof(UpdateGameEnded))] [JsonDerivedType(typeof(UpdateGameEnded))]
[JsonDerivedType(typeof(UpdateGameObjectCreated))] [JsonDerivedType(typeof(UpdateGameObjectCreated))]
[JsonDerivedType(typeof(UpdateGameObjectDeleted))] [JsonDerivedType(typeof(UpdateGameObjectDeleted))]
[JsonDerivedType(typeof(UpdateInteraction))]
[JsonDerivedType(typeof(UpdateInteractionReady))]
[JsonDerivedType(typeof(UpdateLoot))] [JsonDerivedType(typeof(UpdateLoot))]
[JsonDerivedType(typeof(UpdateGameObjectWithoutIdCreated))]
[JsonDerivedType(typeof(UpdatePlayerParametrs))] [JsonDerivedType(typeof(UpdatePlayerParametrs))]
[JsonDerivedType(typeof(UpdatePosition))] [JsonDerivedType(typeof(UpdatePosition))]
[JsonDerivedType(typeof(UpdateStopObjectCreated))]
[JsonDerivedType(typeof(UpdateTileCreated))] [JsonDerivedType(typeof(UpdateTileCreated))]
[JsonDerivedType(typeof(UpdateInput))] [JsonDerivedType(typeof(UpdateInput))]
[JsonDerivedType(typeof(UpdatePlayerExit))] [JsonDerivedType(typeof(UpdatePlayerExit))]
[JsonDerivedType(typeof(UpdateInteractionReady))] [JsonDerivedType(typeof(UpdateInputInteraction))]
[JsonDerivedType(typeof(UpdateInteraction))] [JsonDerivedType(typeof(UpdateInputShoot))]
public class UpdateData public class UpdateData
{ {
public int IdEntity { get; set; } //Id объекта public int IdEntity { get; set; } //Id объекта
public string UpdateType { get; protected set; } //тип обновления public string UpdateType { get; set; } //тип обновления
public bool isImportant { get; set; }
public UpdateData() public UpdateData()
{ {

View file

@ -34,12 +34,15 @@ namespace ZoFo.GameCore.GameManagers
public void SetMusicVolume(float volume) public void SetMusicVolume(float volume)
{ {
settingsContainer.MusicVolume = volume; settingsContainer.MusicVolume = volume;
//AppManager.Instance.SoundManager.Update();
SaveSettings(); SaveSettings();
} }
public void SetSoundEffectsVolume(float volume) public void SetSoundEffectsVolume(float volume)
{ {
settingsContainer.SoundEffectsVolume = volume; settingsContainer.SoundEffectsVolume = volume;
// AppManager.Instance.SoundManager.Update();
SaveSettings(); SaveSettings();
} }
@ -68,6 +71,7 @@ namespace ZoFo.GameCore.GameManagers
} }
public void SaveSettings() public void SaveSettings()
{ {
AppManager.Instance.SoundManager.Update();
using (StreamWriter streamWriter = new StreamWriter("GameSettings.txt")) using (StreamWriter streamWriter = new StreamWriter("GameSettings.txt"))
{ {
string _str = JsonConvert.SerializeObject(settingsContainer); string _str = JsonConvert.SerializeObject(settingsContainer);

View file

@ -14,11 +14,13 @@ namespace ZoFo.GameCore.GameObjects
//public override GraphicsComponent graphicsComponent { get; } = new GraphicsComponent(new List<string> { "тут пишите название анимации" }, "сдублируйте " + //public override GraphicsComponent graphicsComponent { get; } = new GraphicsComponent(new List<string> { "тут пишите название анимации" }, "сдублируйте " +
public override GraphicsComponent graphicsComponent { get; } = new AnimatedGraphicsComponent(new List<string> { "zombie_idle" }, "zombie_idle"); public override GraphicsComponent graphicsComponent { get; } = new AnimatedGraphicsComponent(new List<string> { "zombie_idle" }, "zombie_idle");
public EntittyForAnimationTests(Vector2 position) : base(position) public EntittyForAnimationTests(Vector2 position) : base(position)
{ {
graphicsComponent.ObjectDrawRectangle = new Rectangle(0,0,16*20, 16 * 20); graphicsComponent.ObjectDrawRectangle = new Rectangle(0,0,16*20, 16 * 20);
position = new Vector2(10, 10); position = new Vector2(10, 10);
} }

View file

@ -39,6 +39,8 @@ namespace ZoFo.GameCore.GameObjects
} }
public void StartAnimation(string animationId) public void StartAnimation(string animationId)
{
if (AppManager.Instance.gamestate == GameState.HostPlaying)
{ {
(graphicsComponent as Graphics.AnimatedGraphicsComponent).StartAnimation(animationId); (graphicsComponent as Graphics.AnimatedGraphicsComponent).StartAnimation(animationId);
AppManager.Instance.server.AddData(new GameManagers.NetworkManager.Updates.ServerToClient.UpdateAnimation() AppManager.Instance.server.AddData(new GameManagers.NetworkManager.Updates.ServerToClient.UpdateAnimation()
@ -47,12 +49,21 @@ namespace ZoFo.GameCore.GameObjects
IdEntity = Id IdEntity = Id
}); });
} }
}
public override void Draw(SpriteBatch spriteBatch) public override void Draw(SpriteBatch spriteBatch)
{ {
DrawDebugRectangle(spriteBatch, collisionComponent.stopRectangle.SetOrigin(position), Color.Orange); DrawDebugRectangle(spriteBatch, collisionComponent.stopRectangle.SetOrigin(position), Color.Orange);
base.Draw(spriteBatch); base.Draw(spriteBatch);
} }
public virtual void Delete()
{
if (AppManager.Instance.gamestate == GameState.HostPlaying)
{
AppManager.Instance.server.DeleteObject(this);
}
}
} }
} }

View file

@ -16,31 +16,7 @@ namespace ZoFo.GameCore.GameObjects
class Ammo : Collectable class Ammo : Collectable
{ {
public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "Ammo"); public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "Ammo");
public Ammo(Vector2 position) : base(position) public Ammo(Vector2 position) : base(position) { }
{
graphicsComponent.ObjectDrawRectangle.Width = 20;
graphicsComponent.ObjectDrawRectangle.Height = 20;
collisionComponent.triggerRectangle = new Rectangle(0, 0, 20, 20);
}
public override void OnInteraction(GameObject sender)
{
DebugHUD.DebugLog("collected");
if (AppManager.Instance.client.myPlayer.lootData.loots.Keys.Contains("Ammo"))
{
AppManager.Instance.client.myPlayer.lootData.loots["Ammo"] += 1;
}
else
{
AppManager.Instance.client.myPlayer.lootData.loots.Add("Ammo", 1);
}
AppManager.Instance.server.AddData(new UpdateLoot("Ammo"));
AppManager.Instance.server.DeleteObject(this);
}
public override void Draw(SpriteBatch spriteBatch)
{
DrawDebugRectangle(spriteBatch, collisionComponent.triggerRectangle.SetOrigin(position), Color.Blue);
base.Draw(spriteBatch);
}
} }
} }

View file

@ -14,14 +14,6 @@ namespace ZoFo.GameCore.GameObjects.Entities.Interactables.Collectables
class Antiradine : Collectable class Antiradine : Collectable
{ {
public override StaticGraphicsComponent graphicsComponent { get; } = new("Antiradine"); public override StaticGraphicsComponent graphicsComponent { get; } = new("Antiradine");
public Antiradine(Vector2 position) : base(position) public Antiradine(Vector2 position) : base(position) { }
{
}
public override void OnInteraction(GameObject sender)
{
AppManager.Instance.server.AddData(new UpdateLoot("Antiradine"));
AppManager.Instance.server.DeleteObject(this);
}
} }
} }

View file

@ -15,15 +15,7 @@ namespace ZoFo.GameCore.GameObjects
public class BottleOfWater : Collectable public class BottleOfWater : Collectable
{ {
public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "BottleOfWater"); public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "BottleOfWater");
public BottleOfWater(Vector2 position) : base(position) public BottleOfWater(Vector2 position) : base(position) { }
{
graphicsComponent.ObjectDrawRectangle.Width = 20;
graphicsComponent.ObjectDrawRectangle.Height = 20;
}
public override void OnInteraction(GameObject sender)
{
AppManager.Instance.server.AddData(new UpdateLoot("BottleOfWater"));
AppManager.Instance.server.DeleteObject(this);
}
} }
} }

View file

@ -1,21 +1,44 @@
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System; using System;
using System.Linq;
using ZoFo.GameCore.GameManagers; using ZoFo.GameCore.GameManagers;
using ZoFo.GameCore.GameManagers.CollisionManager; using ZoFo.GameCore.GameManagers.CollisionManager;
using ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient; using ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient;
using ZoFo.GameCore.GUI;
namespace ZoFo.GameCore.GameObjects; namespace ZoFo.GameCore.GameObjects;
public class Collectable : Interactable public class Collectable : Interactable
{ {
protected static readonly string _path = "Textures/icons/Collectables/"; protected static readonly string _path = "Content/Textures/icons/Collectables/";
public Collectable(Vector2 position) : base(position) public Collectable(Vector2 position) : base(position) {
{
graphicsComponent.ObjectDrawRectangle.Width = 20;
graphicsComponent.ObjectDrawRectangle.Height = 20;
collisionComponent.triggerRectangle.Width = 20;
collisionComponent.triggerRectangle.Height = 20;
int size = 10;
collisionComponent.triggerRectangle.X -= size;
collisionComponent.triggerRectangle.Y -= size;
collisionComponent.triggerRectangle.Width += 2*size;
collisionComponent.triggerRectangle.Height += 2*size;
} }
public override void OnInteraction(GameObject sender) public override void OnInteraction(GameObject sender)
{ {
// DebugHUD.DebugLog("collected");
AppManager.Instance.server.AddData(new UpdateLoot()); string lootname = this.GetType().ToString().ToLower().Split('.').Last();
(sender as Player).lootData.AddLoot(lootname, 1, (sender as Player).Id);
AppManager.Instance.server.DeleteObject(this); AppManager.Instance.server.DeleteObject(this);
base.OnInteraction(sender);
} }
public override void Draw(SpriteBatch spriteBatch)
{
DrawDebugRectangle(spriteBatch, collisionComponent.triggerRectangle.SetOrigin(position), Color.Blue);
base.Draw(spriteBatch);
}
} }

View file

@ -16,15 +16,6 @@ namespace ZoFo.GameCore.GameObjects
{ {
public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "Peeble"); public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "Peeble");
public Peeble(Vector2 position) : base(position) public Peeble(Vector2 position) : base(position) { }
{
graphicsComponent.ObjectDrawRectangle.Width = 20;
graphicsComponent.ObjectDrawRectangle.Height = 20;
}
public override void OnInteraction(GameObject sender)
{
AppManager.Instance.server.AddData(new UpdateLoot("Peeble"));
AppManager.Instance.server.DeleteObject(this);
}
} }
} }

View file

@ -15,15 +15,6 @@ namespace ZoFo.GameCore.GameObjects
{ {
public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "PureBottleOfWater"); public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "PureBottleOfWater");
public PureBottleOfWater(Vector2 position) : base(position) public PureBottleOfWater(Vector2 position) : base(position) { }
{
graphicsComponent.ObjectDrawRectangle.Width = 20;
graphicsComponent.ObjectDrawRectangle.Height = 20;
}
public override void OnInteraction(GameObject sender)
{
AppManager.Instance.server.AddData(new UpdateLoot("PureBottleOfWater"));
AppManager.Instance.server.DeleteObject(this);
}
} }
} }

View file

@ -14,15 +14,6 @@ namespace ZoFo.GameCore.GameObjects
class RottenFlesh:Collectable class RottenFlesh:Collectable
{ {
public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "RottenFlesh"); public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "RottenFlesh");
public RottenFlesh(Vector2 position) : base(position) public RottenFlesh(Vector2 position) : base(position) { }
{
graphicsComponent.ObjectDrawRectangle.Width = 20;
graphicsComponent.ObjectDrawRectangle.Height = 20;
}
public override void OnInteraction(GameObject sender)
{
AppManager.Instance.server.AddData(new UpdateLoot("RottenFlesh"));
AppManager.Instance.server.DeleteObject(this);
}
} }
} }

View file

@ -15,15 +15,7 @@ namespace ZoFo.GameCore.GameObjects
{ {
public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "Steel"); public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "Steel");
public Steel(Vector2 position) : base(position) public Steel(Vector2 position) : base(position) { }
{
graphicsComponent.ObjectDrawRectangle.Width = 20;
graphicsComponent.ObjectDrawRectangle.Height = 20;
}
public override void OnInteraction(GameObject sender)
{
AppManager.Instance.server.AddData(new UpdateLoot("Steel"));
AppManager.Instance.server.DeleteObject(this);
}
} }
} }

View file

@ -11,14 +11,5 @@ public class Wood : Collectable
{ {
public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "Wood"); public override StaticGraphicsComponent graphicsComponent { get; } = new(_path + "Wood");
public Wood(Vector2 position) : base(position) public Wood(Vector2 position) : base(position) { }
{
graphicsComponent.ObjectDrawRectangle.Width = 20;
graphicsComponent.ObjectDrawRectangle.Height = 20;
}
public override void OnInteraction(GameObject sender)
{
AppManager.Instance.server.AddData(new UpdateLoot("Wood"));
AppManager.Instance.server.DeleteObject(this);
}
} }

View file

@ -4,6 +4,7 @@ using ZoFo.GameCore.GameManagers.CollisionManager;
using ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient; using ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient;
using ZoFo.GameCore.GameObjects.Entities.LivingEntities.Player; using ZoFo.GameCore.GameObjects.Entities.LivingEntities.Player;
using ZoFo.GameCore.Graphics; using ZoFo.GameCore.Graphics;
using ZoFo.GameCore.GUI;
namespace ZoFo.GameCore.GameObjects; namespace ZoFo.GameCore.GameObjects;

View file

@ -4,18 +4,38 @@ using System.Net.Mime;
using System.Reflection; using System.Reflection;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Content;
using ZoFo.GameCore.GameManagers;
using ZoFo.GameCore.Graphics;
namespace ZoFo.GameCore.GameObjects; namespace ZoFo.GameCore.GameObjects;
public class Enemy : LivingEntity public class Enemy : LivingEntity
{ {
protected float speed; protected float speed;
protected int health; protected float health = 5;
public bool isAttacking;
public bool isDying;
public Enemy(Vector2 position) : base(position) public Enemy(Vector2 position) : base(position)
{ {
} }
public override void Update() public override void Update()
{ {
}
public virtual void TakeDamage(float damage)
{
if (isDying) return;
health -= damage;
if (health < 0)
Die();
}
public override void Die()
{
isDying = true;
base.Die();
}
public override void DeathEnd()
{
Delete();
} }
} }

View file

@ -18,7 +18,7 @@ namespace ZoFo.GameCore.GameObjects
class Zombie : Enemy class Zombie : Enemy
{ {
public override GraphicsComponent graphicsComponent { get; } = new AnimatedGraphicsComponent(new List<string> { "zombie_damaged", "zombie_walk", "zombie_idle", "zombie_attack", "zombie_death" }, "zombie_walk"); public override GraphicsComponent graphicsComponent { get; } = new AnimatedGraphicsComponent(new List<string> { "zombie_damaged", "zombie_walk", "zombie_idle", "zombie_attack", "zombie_death" }, "zombie_walk");
public bool isAttacking;
public Zombie(Vector2 position) : base(position) public Zombie(Vector2 position) : base(position)
{ {
health = 5; health = 5;
@ -29,22 +29,52 @@ namespace ZoFo.GameCore.GameObjects
StartAnimation("zombie_walk"); StartAnimation("zombie_walk");
collisionComponent.isTrigger = true; collisionComponent.isTrigger = true;
collisionComponent.hasCollision = true; collisionComponent.hasCollision = true;
(graphicsComponent as AnimatedGraphicsComponent).actionOfAnimationEnd += EndAttack; (graphicsComponent as AnimatedGraphicsComponent).actionOfAnimationEnd += (animationIdEnded)=>{
if (animationIdEnded == "zombie_attack")
EndAttack(animationIdEnded);
};
collisionComponent.OnTriggerZone += OnPlayerClose; collisionComponent.OnTriggerZone += OnPlayerClose;
collisionComponent.triggerRectangle = new Rectangle(-5, -5, 40, 40); collisionComponent.triggerRectangle = new Rectangle(-5, -5, 40, 40);
(graphicsComponent as AnimatedGraphicsComponent).actionOfAnimationEnd += (str) =>
{
if (str == "zombie_death")
DeathEnd();
};
} }
public override void Update() public override void Update()
{ {
Vector2 duration = Vector2.Normalize( if (isDying) return;
AppManager.Instance.server.players[0].position - position float m = 10000000;
int j = -1;
for (int i = 0; i < AppManager.Instance.server.players.Count; i++)
{
var player = AppManager.Instance.server.players[i];
if (m > (player.position.X - position.X) * (player.position.X - position.X) + (player.position.Y - position.Y) * (player.position.Y - position.Y))
{
m = (player.position.X - position.X) * (player.position.X - position.X) + (player.position.Y - position.Y) * (player.position.Y - position.Y);
j = i;
}
}
Vector2 duration = Vector2.Zero;
if (m<= 130000)
{
duration = Vector2.Normalize(
AppManager.Instance.server.players[j].position - position
); );
if (Random.Shared.NextDouble() > 0.999)
{
AppManager.Instance.SoundManager.StartSound("zombie sound", position, AppManager.Instance.server.players[0].position, pitch: new Random().Next(-1, 2) * (float)new Random().NextDouble());
}
}
if (!isAttacking) { velocity += new Vector2(duration.X * speed, duration.Y * speed); } if (!isAttacking) { velocity += new Vector2(duration.X * speed, duration.Y * speed); }
} }
public void OnPlayerClose(GameObject sender) public void OnPlayerClose(GameObject sender)
{ {
@ -52,6 +82,8 @@ namespace ZoFo.GameCore.GameObjects
if(!isAttacking) if(!isAttacking)
{ {
AppManager.Instance.SoundManager.StartSound("Zombi napal", position, AppManager.Instance.server.players[0].position,pitch:new Random().Next(-1,2)*(float)new Random().NextDouble());
StartAnimation("zombie_attack"); StartAnimation("zombie_attack");
isAttacking = true; isAttacking = true;
} }
@ -61,17 +93,38 @@ namespace ZoFo.GameCore.GameObjects
} }
public void EndAttack(string a) public void EndAttack(string a)
{ {
if (AppManager.Instance.server is null) return;
var damagedPlayers=AppManager.Instance.server.collisionManager.GetPlayersInZone(collisionComponent.triggerRectangle.SetOrigin(position)); var damagedPlayers=AppManager.Instance.server.collisionManager.GetPlayersInZone(collisionComponent.triggerRectangle.SetOrigin(position));
//TODO ДАМАЖИТЬ ИГРОКОВ В ЗОНЕ //TODO ДАМАЖИТЬ ИГРОКОВ В ЗОНЕ
if (damagedPlayers.Length>0) { DebugHUD.DebugLog("End of" + a); if (damagedPlayers.Length>0) { DebugHUD.DebugLog("End of" + a);
AppManager.Instance.server.DeleteObject(this); foreach (var item in damagedPlayers)
item.TakeDamage(1);
} }
isAttacking = false;
}
public override void Die()
{
StartAnimation("zombie_death");
base.Die();
}
public override void DeathEnd()
{
Instantiate(new Particle(collisionComponent.stopRectangle.Location.ToVector2() + position + ExtentionClass.RandomVector() * 20));
Instantiate(new Particle(collisionComponent.stopRectangle.Location.ToVector2() + position + ExtentionClass.RandomVector() * 20));
Instantiate(new Particle(collisionComponent.stopRectangle.Location.ToVector2() + position + ExtentionClass.RandomVector() * 20));
base.DeathEnd();
} }
public override void Draw(SpriteBatch spriteBatch) public override void Draw(SpriteBatch spriteBatch)
{ {
DrawDebugRectangle(spriteBatch, collisionComponent.triggerRectangle.SetOrigin(position), Color.Blue); DrawDebugRectangle(spriteBatch, collisionComponent.triggerRectangle.SetOrigin(position), Color.Blue);
base.Draw(spriteBatch); base.Draw(spriteBatch);
} }
public override void TakeDamage(float damage)
{
base.TakeDamage(damage);
}
} }
} }

View file

@ -14,11 +14,9 @@ public class LivingEntity : Entity
/// </summary> /// </summary>
public Vector2 velocity; public Vector2 velocity;
private InputManager inputManager;
public LivingEntity(Vector2 position) : base(position) public LivingEntity(Vector2 position) : base(position)
{ {
inputManager = new InputManager();
collisionComponent.hasCollision = true; collisionComponent.hasCollision = true;
} }
@ -40,17 +38,28 @@ public class LivingEntity : Entity
{ {
base.UpdateAnimations(); base.UpdateAnimations();
} }
Vector2 prevPosition_forClient; protected Vector2 prevPosition_forClient;
public override void Draw(SpriteBatch spriteBatch) public override void Draw(SpriteBatch spriteBatch)
{ {
if ((position - prevPosition_forClient).X < 0) if ((positionDraw - prevPosition_forClient).X < 0)
graphicsComponent.Flip = SpriteEffects.FlipHorizontally; graphicsComponent.Flip = SpriteEffects.FlipHorizontally;
else if ((position - prevPosition_forClient).X > 0) else if ((positionDraw - prevPosition_forClient).X > 0)
graphicsComponent.Flip = SpriteEffects.None; graphicsComponent.Flip = SpriteEffects.None;
base.Draw(spriteBatch); base.Draw(spriteBatch);
prevPosition_forClient = position; prevPosition_forClient = positionDraw;
} }
public virtual void Die()
{
//deathSound + animationStart
}
public virtual void DeathEnd()
{
//deathSound + animationStart
Delete();
}
} }

View file

@ -3,6 +3,9 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using ZoFo.GameCore.GameManagers;
using ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient;
using ZoFo.GameCore.GUI;
namespace ZoFo.GameCore.GameObjects namespace ZoFo.GameCore.GameObjects
{ {
@ -10,8 +13,27 @@ namespace ZoFo.GameCore.GameObjects
{ {
public Dictionary<string, int> loots; public Dictionary<string, int> loots;
public void AddLoot(string lootName, int quantity) public void AddLoot(string lootName, int quantity, int id)
{ {
if (lootName == null)
{
DebugHUD.DebugLog("PROBLEM, loot is null");
DebugHUD.DebugLog("PROBLEM, loot is null");
DebugHUD.DebugLog("PROBLEM, loot is null");
return;
}
AppManager.Instance.server.AddData(new UpdateLoot(lootName, quantity, id));
if (loots.ContainsKey(lootName))
loots[lootName] +=quantity;
else
loots.Add(lootName, quantity);
}
public void AddLoot_Client(string lootName, int quantity)
{
if (loots.ContainsKey(lootName))
loots[lootName] +=quantity;
else
loots.Add(lootName, quantity); loots.Add(lootName, quantity);
} }
} }

View file

@ -11,6 +11,7 @@ using ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient;
using ZoFo.GameCore.Graphics; using ZoFo.GameCore.Graphics;
using System.Diagnostics; using System.Diagnostics;
using ZoFo.GameCore.GUI; using ZoFo.GameCore.GUI;
using System.Runtime.InteropServices;
namespace ZoFo.GameCore.GameObjects; namespace ZoFo.GameCore.GameObjects;
@ -20,25 +21,34 @@ public class Player : LivingEntity
public Vector2 InputPlayerRotation { get; set; } public Vector2 InputPlayerRotation { get; set; }
private float speed; private float speed;
public int health = 100; public int reloading;
public int rad = 0; public float health = 100;
public float MaxHealth = 100;
public override GraphicsComponent graphicsComponent { get; } = new AnimatedGraphicsComponent(AppManager.Instance.AssetManager.Player.Animations, AppManager.Instance.AssetManager.Player.IdleAnimation);
public AnimatedGraphicsComponent animatedGraphicsComponent => graphicsComponent as AnimatedGraphicsComponent;
public float rad = 0;
public float MaxRad = 100;
public LootData lootData; public LootData lootData;
Vector2 prevPosition;
public override GraphicsComponent graphicsComponent { get; } = new AnimatedGraphicsComponent(AppManager.Instance.AssetManager.Player);
public bool IsTryingToInteract { get; set; } public bool IsTryingToInteract { get; set; }
/// <summary> /// <summary>
/// Факт того, что плеер в этом апдейте пытается стрелять /// Факт того, что плеер в этом апдейте пытается стрелять
/// </summary> /// </summary>
public bool IsTryingToShoot { get; set; } public bool IsTryingToShoot { get; set; }
ScopeState prevScopeState;
public Player(Vector2 position) : base(position) public Player(Vector2 position) : base(position)
{ {
lootData = new LootData(); lootData = new LootData();
lootData.loots = new Dictionary<string, int>(); lootData.loots = new Dictionary<string, int>();
graphicsComponent.ObjectDrawRectangle = new Rectangle(0, 0, 30, 30); graphicsComponent.ObjectDrawRectangle = new Rectangle(0, 0, 30, 30);
collisionComponent.stopRectangle = new Rectangle(0, 20, 30, 10); collisionComponent.stopRectangle = new Rectangle(10, 15, 10, 15);
speed = 5; speed = 5;
StartAnimation("player_look_down"); StartAnimation("player_look_down");
@ -47,69 +57,239 @@ public class Player : LivingEntity
public override void Update() public override void Update()
{ {
#region анимация управления, стрельбы #region название current текстуры
var idName = animatedGraphicsComponent.CurrentAnimation.Id;
#endregion
#region анимация управления подбора лута
DebugHUD.DebugSet("texture name", idName);
if (reloading > 0)
{
reloading--;
}
switch (AppManager.Instance.InputManager.ConvertVector2ToState(InputPlayerRotation)) switch (AppManager.Instance.InputManager.ConvertVector2ToState(InputPlayerRotation))
{ {
case ScopeState.Top: case ScopeState.Top:
if (idName != "player_run_up")
StartAnimation("player_run_up");
break; break;
case ScopeState.Down: case ScopeState.Down:
if (idName != "player_run_down")
StartAnimation("player_run_down");
break; break;
case ScopeState.Right: case ScopeState.Right:
//StartAnimation("player_running_top_rotate");
break;
case ScopeState.Left: case ScopeState.Left:
if (idName != "player_run_right")
StartAnimation("player_run_right");
break; break;
case ScopeState.TopRight: case ScopeState.TopRight:
break;
case ScopeState.TopLeft: case ScopeState.TopLeft:
if (idName != "player_run_right_up")
StartAnimation("player_run_right_up");
break; break;
case ScopeState.DownRight: case ScopeState.DownRight:
break;
case ScopeState.DownLeft: case ScopeState.DownLeft:
if (idName != "player_run_right_down")
StartAnimation("player_run_right_down");
break;
case ScopeState.Idle:
if (idName != "player_look_down")
StartAnimation("player_look_down");
break;
}
if (AppManager.Instance.InputManager.ConvertVector2ToState(InputPlayerRotation) != ScopeState.Idle)
{
prevScopeState = AppManager.Instance.InputManager.ConvertVector2ToState(InputPlayerRotation);
}
else if (AppManager.Instance.InputManager.ConvertVector2ToState(InputPlayerRotation) == ScopeState.Idle && false)
{
switch (prevScopeState)
{
case ScopeState.Top:
if (idName != "player_look_up_weapon")
StartAnimation("player_look_up_weapon");
break;
case ScopeState.Down:
if (idName != "player_look_down_weapon")
StartAnimation("player_look_down_weapon");
break;
case ScopeState.Right:
case ScopeState.Left:
if (idName != "player_look_right_down_weapon")
StartAnimation("player_look_right_down_weapon");
break;
case ScopeState.TopRight:
case ScopeState.TopLeft:
if (idName != "player_look_right_up_weapon")
StartAnimation("player_look_right_up_weapon");
break;
case ScopeState.DownRight:
case ScopeState.DownLeft:
if (idName != "player_look_right_down_weapon")
StartAnimation("player_look_right_down_weapon");
break;
case ScopeState.Idle:
if (idName != "player_look_down")
StartAnimation("player_look_down");
break;
}
}
#endregion
#region анимация поворота оружия
int currentAttackSection = AppManager.Instance.InputManager.ConvertAttackVector2ToState(InputWeaponRotation);
switch (currentAttackSection)
{
case 0 or 1:
//right
break;
case 2 or 3:
//down_right_right
break;
case 4 or 5:
//down_right
break;
case 6 or 7:
//down_right_left
break;
case 8 or 9:
//down
break;
case 10 or 11:
//down_left_right
break;
case 12 or 13:
//down_left
break;
case 14 or 15:
//down_left_left
break;
case 16 or -14:
//left
break;
case -13 or -12:
//top_left_left
break;
case -11 or -10:
//top_left
break;
case -9 or -8:
//top_left_right
break;
case -7 or -6:
//top
break;
case -5 or -4:
//top_right_left
break;
case -3 or -2:
//top_right
break;
case -1 or 0:
//top_right_right
break; break;
} }
#endregion #endregion
MovementLogic(); MovementLogic();
}
public void WeaponAttack()
{
} }
public void MovementLogic() public void MovementLogic()
{ {
velocity += InputPlayerRotation * speed; velocity += InputPlayerRotation * speed;
DebugHUD.DebugSet("player pos server", position.ToString());
} }
public void HandleNewInput(UpdateInput updateInput) public void HandleNewInput(UpdateInput updateInput)
{ {
InputPlayerRotation = updateInput.InputMovementDirection; InputPlayerRotation = updateInput.InputMovementDirection.GetVector2();
InputWeaponRotation = updateInput.InputAttackDirection; InputWeaponRotation = updateInput.InputAttackDirection.GetVector2();
DebugHUD.DebugSet("dir", InputWeaponRotation.ToString());
} }
public void HandleInteract(UpdateInputInteraction updateInputInteraction) public void HandleInteract(UpdateInputInteraction updateInputInteraction)
{ {
IsTryingToInteract = true; IsTryingToInteract = true;
} }
#region MyRegion
public bool isDying;
public virtual void TakeDamage(float damage)
{
if (isDying) return;
health -= damage;
AppManager.Instance.server.AddData(new UpdatePlayerParametrs() { health = health, radiatoin = rad, IdEntity = Id });
if (health < 0)
Die();
}
public override void Die()
{
base.Die();
}
#endregion
public void HandleShoot(UpdateInputShoot updateInputShoot) public void HandleShoot(UpdateInputShoot updateInputShoot)
{ {
if (reloading > 0)
return;
reloading = 5;
IsTryingToShoot = true; IsTryingToShoot = true;
var rect = collisionComponent.stopRectangle.SetOrigin(position); Entity[] entities = AppManager.Instance.server.collisionManager.GetEntities(GetDamageArea(InputWeaponRotation), this);
rect.Width += 100;
rect.Height += 100;
Entity[] entities = AppManager.Instance.server.collisionManager.GetEntities(rect, this);
if (entities.Length>0)
{
DebugHUD.DebugSet("ent[0]", entities[0].ToString());
if (entities != null) if (entities != null)
{ {
foreach (Entity entity in entities) foreach (Entity entity in entities)
{ {
AppManager.Instance.server.DeleteObject(entity); if (entity is Enemy)
{
for (int i = 0; i < 3; i++)
{
Instantiate(new Particle(
((position - graphicsComponent.ObjectDrawRectangle.Location.ToVector2()) * i / 3f) +
((entity.position) * (3 - i) / 3f)
));
}
(entity as Enemy).TakeDamage(1);
} }
} }
} }
} }
public override void Draw(SpriteBatch spriteBatch)
{
DrawDebugRectangle(spriteBatch, GetDamageArea(AppManager.Instance.InputManager.InputAttackDirection), Color.Green);
DrawDebugRectangle(spriteBatch, GetDamageArea(AppManager.Instance.InputManager.InputAttackDirection, 2), Color.Green);
DrawDebugRectangle(spriteBatch, GetDamageArea(AppManager.Instance.InputManager.InputAttackDirection, 3), Color.Green);
base.Draw(spriteBatch);
}
public Rectangle GetDamageArea(Vector2 direction, float mult = 1)
{
direction.Normalize();
var rect = collisionComponent.stopRectangle.SetOrigin(position);
int size = 10;
rect.X -= size;
rect.Y -= size;
rect.Width += 2 * size;
rect.Height += 2 * size;
rect = rect.SetOrigin(direction * 40 * mult);
return rect;
}
} }

View file

@ -1,13 +1,25 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.Linq; using System.Linq;
using System.Numerics;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using ZoFo.GameCore.GameManagers;
using ZoFo.GameCore.GameManagers.CollisionManager;
using ZoFo.GameCore.GameObjects.MapObjects.StopObjects;
namespace ZoFo.GameCore.GameObjects.Entities.LivingEntities.Player.PlayerAttacks namespace ZoFo.GameCore.GameObjects.Entities.LivingEntities.Player.PlayerAttacks
{ {
internal class SwordAttack : IPlayerWeaponAttack internal class SwordAttack : IPlayerWeaponAttack
{ {
Rectangle rectangle;
public SwordAttack(){
}
public Rectangle Attack(Vector2 position){
rectangle = new Rectangle((int)position.X, (int)position.Y, 30, 10);
return rectangle;
}
} }
} }

View file

@ -0,0 +1,32 @@
using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZoFo.GameCore.GameManagers;
using ZoFo.GameCore.GameManagers.CollisionManager;
using ZoFo.GameCore.Graphics;
namespace ZoFo.GameCore.GameObjects
{
internal class Particle : GameObject
{
public override GraphicsComponent graphicsComponent { get; } = new AnimatedGraphicsComponent(new List<string> { "explosion_1" }, "explosion_1");
public Particle(Vector2 position) : base(position)
{
graphicsComponent.ObjectDrawRectangle = new Rectangle(0, 0,60,60).SetOrigin(position);
AppManager.Instance.SoundManager.StartSound("gun-gunshot-01", Vector2.Zero, Vector2.Zero, 0.5f, (float)(Random.Shared.NextDouble()*2-1));
(graphicsComponent as AnimatedGraphicsComponent).actionOfAnimationEnd += _ => {
if (AppManager.Instance.client!=null)
{
AppManager.Instance.client.DeleteObject(this);
}
};
}
}
}

View file

@ -24,6 +24,7 @@ public abstract class GameObject
graphicsComponent.ObjectDrawRectangle.X = (int)position.X; graphicsComponent.ObjectDrawRectangle.X = (int)position.X;
graphicsComponent.ObjectDrawRectangle.Y = (int)position.Y; graphicsComponent.ObjectDrawRectangle.Y = (int)position.Y;
positionDraw = position;
} }
public virtual void UpdateLogic() public virtual void UpdateLogic()
{ {
@ -41,6 +42,13 @@ public abstract class GameObject
graphicsComponent.Update(); graphicsComponent.Update();
} }
public void Instantiate(GameObject gameObject)
{
if (AppManager.Instance.gamestate == GameState.HostPlaying)
{
AppManager.Instance.server.RegisterGameObject(gameObject);
}
}
#endregion #endregion
@ -54,6 +62,7 @@ public abstract class GameObject
public void PlayAnimation_OnClient() public void PlayAnimation_OnClient()
{ {
graphicsComponent.Update(); graphicsComponent.Update();
} }
/// <summary> /// <summary>
@ -65,14 +74,19 @@ public abstract class GameObject
graphicsComponent.LoadContent(); graphicsComponent.LoadContent();
} }
/// <summary>
/// for smooth client draw
/// </summary>
public Vector2 positionDraw;
/// <summary> /// <summary>
/// Для клиента /// Для клиента
/// Обновление, которое вызывается у клиента, для просмотра анимаций /// Обновление, которое вызывается у клиента, для просмотра анимаций
/// </summary> /// </summary>
public virtual void UpdateAnimations() public virtual void UpdateAnimations()
{ {
graphicsComponent.ObjectDrawRectangle.X = (int)position.X; //Move To place where Updates Sets your position positionDraw = (position * 0.15f + positionDraw*0.85f);
graphicsComponent.ObjectDrawRectangle.Y = (int)position.Y; graphicsComponent.ObjectDrawRectangle.X = (int)positionDraw.X; //Move To place where Updates Sets your position
graphicsComponent.ObjectDrawRectangle.Y = (int)positionDraw.Y;
PlayAnimation_OnClient(); PlayAnimation_OnClient();
} }

View file

@ -136,7 +136,16 @@ namespace ZoFo.GameCore.Graphics
buildSourceRectangle(); buildSourceRectangle();
SetInterval(); SetInterval();
}
public void StartCyclingAnimation(string startedanimationId)
{
currentFrame = 0;
currentAnimation = animations.Find(x => x.Id == startedanimationId);
currentAnimation.IsCycle = true;
buildSourceRectangle();
SetInterval();
} }
public void StopAnimation() public void StopAnimation()

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Graphics;
@ -37,7 +38,7 @@ namespace ZoFo.GameCore.Graphics
return; return;
} }
texture = AppManager.Instance.Content.Load<Texture2D>(_textureName); texture = AppManager.Instance.Content.Load<Texture2D>(Path.Combine(AppContext.BaseDirectory, _textureName));
} }
public override void Update() public override void Update()

View file

@ -30,13 +30,12 @@ namespace ZoFo.GameCore
{ {
private ServerNetworkManager networkManager; private ServerNetworkManager networkManager;
private int ticks = 0; private int ticks = 0;
public IPEndPoint MyIp { get { return networkManager.InfoConnect; } } public IPEndPoint MyIp { get { return networkManager.endPoint; } }
public Server() public Server()
{ {
networkManager = new ServerNetworkManager(); networkManager = new ServerNetworkManager();
networkManager.GetDataSend += OnDataSend;
collisionManager = new CollisionManager(); collisionManager = new CollisionManager();
players = new List<Player>();
} }
#region server logic as App #region server logic as App
@ -51,6 +50,13 @@ namespace ZoFo.GameCore
ProcessIUpdateData(updateDatas[i]); ProcessIUpdateData(updateDatas[i]);
} }
} }
internal void UpdatesList(List<UpdateData> updates)
{
foreach (var item in updates)
{
ProcessIUpdateData(item);
}
}
/// <summary> /// <summary>
/// Обработка апдейтсов, которые нам прислал клиент /// Обработка апдейтсов, которые нам прислал клиент
/// </summary> /// </summary>
@ -61,24 +67,6 @@ namespace ZoFo.GameCore
//ТУТ Switch case будет честное слово //ТУТ Switch case будет честное слово
switch (updateData.UpdateType) switch (updateData.UpdateType)
{ {
case "UpdateAnimation":
break;
case "UpdateEntityHealth":
break;
case "UpdateGameEnded":
break;
case "UpdateGameObjectCreated":
break;
case "UpdateGameObjectDeleted":
break;
case "UpdateInteraction":
break;
case "UpdateInteractionReady":
break;
case "UpdateLoot":
break;
case "UpdatePlayerParametrs":
break;
case "UpdateInput": case "UpdateInput":
if (players.Count > 0) if (players.Count > 0)
players[0].HandleNewInput(updateData as UpdateInput);//TODO id instead of 0 players[0].HandleNewInput(updateData as UpdateInput);//TODO id instead of 0
@ -96,10 +84,6 @@ namespace ZoFo.GameCore
} }
} }
public void CloseConnection()
{
networkManager.CloseConnection();
}
/// <summary> /// <summary>
/// Для красоты) Отдел Серверов /// Для красоты) Отдел Серверов
@ -115,9 +99,10 @@ namespace ZoFo.GameCore
/// Создает комнату и запускает ожидание подключений /// Создает комнату и запускает ожидание подключений
/// </summary> /// </summary>
/// <param name="players"></param> /// <param name="players"></param>
public void CreateRoom(int players) public void CreateRoom(bool isMultiplayer)
{ {
networkManager.Start(players); networkManager.SetIsMultiplayer(isMultiplayer);
networkManager.Start();
} }
#endregion #endregion
@ -135,18 +120,14 @@ namespace ZoFo.GameCore
collisionManager = new CollisionManager(); collisionManager = new CollisionManager();
gameObjects = new List<GameObject>(); gameObjects = new List<GameObject>();
entities = new List<Entity>(); entities = new List<Entity>();
players = new List<Player>(); networkManager.StartGame();
new MapManager().LoadMap(); new MapManager().LoadMap();
//AppManager.Instance.server.RegisterGameObject(new EntittyForAnimationTests(new Vector2(0, 0))); AppManager.Instance.server.RegisterGameObject(new Player(new Vector2(760, 140)));
AppManager.Instance.server.RegisterGameObject(new Player(new Vector2(740, 140))); //for (int i = 0; i < 20; i++)
for (int i = 0; i < 20; i++) // for (int j = 0; j < 20; j++)
for (int j = 0; j < 20; j++) // AppManager.Instance.server.RegisterGameObject(new Zombie(new Vector2(1300 + i*70, 1000+j*70)));
AppManager.Instance.server.RegisterGameObject(new Zombie(new Vector2(1300 + i*70, 1000+j*70)));
AppManager.Instance.server.RegisterGameObject(new Ammo(new Vector2(140, 440)));
AppManager.Instance.server.RegisterGameObject(new Ammo(new Vector2(240, 440)));
AppManager.Instance.server.RegisterGameObject(new ExitZone(new Vector2(240, 440)));
} }
/// <summary> /// <summary>
@ -159,7 +140,7 @@ namespace ZoFo.GameCore
// networkManager.CloseConnection(); // networkManager.CloseConnection();
} }
public List<GameObject> gameObjects; public List<GameObject> gameObjects = new List<GameObject>();
public List<Entity> entities; //entity public List<Entity> entities; //entity
public List<Player> players; public List<Player> players;
public void Update(GameTime gameTime) public void Update(GameTime gameTime)
@ -187,11 +168,12 @@ namespace ZoFo.GameCore
{ {
gameObjects.Add(gameObject); gameObjects.Add(gameObject);
if (gameObject is StopObject) if (gameObject is StopObject)
{ {
AddData(new UpdateStopObjectCreated() AddData(new UpdateStopObjectCreated()
{ {
Position = (gameObject as StopObject).position, Position = (gameObject as StopObject).position.Serialize(),
sourceRectangle = new SerializableRectangle((gameObject as StopObject).sourceRectangle), sourceRectangle = new SerializableRectangle((gameObject as StopObject).sourceRectangle),
Size = new SerializablePoint((gameObject as StopObject).graphicsComponent.ObjectDrawRectangle.Size), Size = new SerializablePoint((gameObject as StopObject).graphicsComponent.ObjectDrawRectangle.Size),
tileSetName = ((gameObject as StopObject).graphicsComponent as StaticGraphicsComponent)._textureName, tileSetName = ((gameObject as StopObject).graphicsComponent as StaticGraphicsComponent)._textureName,
@ -203,24 +185,36 @@ namespace ZoFo.GameCore
} }
return; return;
} }
if (gameObject is MapObject) if (gameObject is MapObject)
{ {
AddData(new UpdateTileCreated() AddData(new UpdateTileCreated()
{ {
Position = (gameObject as MapObject).position, Position = new SerializableVector2((gameObject as MapObject).position),
sourceRectangle = new SerializableRectangle((gameObject as MapObject).sourceRectangle), sourceRectangle = new SerializableRectangle((gameObject as MapObject).sourceRectangle),
Size = new SerializablePoint((gameObject as MapObject).graphicsComponent.ObjectDrawRectangle.Size), Size = new SerializablePoint((gameObject as MapObject).graphicsComponent.ObjectDrawRectangle.Size),
tileSetName = ((gameObject as MapObject).graphicsComponent as StaticGraphicsComponent)._textureName tileSetName = ((gameObject as MapObject).graphicsComponent as StaticGraphicsComponent)._textureName
}); });
return; return;
} }
if (gameObject is Particle)
{
AddData(new UpdateGameObjectWithoutIdCreated()
{
GameObjectClassName = gameObject.GetType().Name,
position = gameObject.position.Serialize()
});
return;
}
if (gameObject is Entity entity) if (gameObject is Entity entity)
{ {
AddData(new UpdateGameObjectCreated() AddData(new UpdateGameObjectCreated()
{ {
GameObjectType = gameObject.GetType().Name, GameObjectType = gameObject.GetType().Name,
IdEntity = entity.Id, IdEntity = entity.Id,
position = gameObject.position position = gameObject.position.Serialize()
}); });
collisionManager.Register(entity.collisionComponent); collisionManager.Register(entity.collisionComponent);
entities.Add(entity); entities.Add(entity);
@ -229,7 +223,7 @@ namespace ZoFo.GameCore
AddData(new UpdateGameObjectCreated() AddData(new UpdateGameObjectCreated()
{ {
GameObjectType = gameObject.GetType().Name, GameObjectType = gameObject.GetType().Name,
position = gameObject.position position = gameObject.position.Serialize()
}); });

View file

@ -1 +1 @@
{"IsFullScreen":false,"MainVolume":1.0,"MusicVolume":1.0,"SoundEffectsVolume":1.0,"Resolution":{"X":1440,"Y":900}} {"IsFullScreen":false,"MainVolume":1.0,"MusicVolume":0.0,"SoundEffectsVolume":1.0,"Resolution":{"X":1440,"Y":900}}