This commit is contained in:
gravity 2023-08-17 23:58:37 +03:00
commit e67d56d6bf
25 changed files with 460 additions and 96 deletions

View file

@ -14,14 +14,7 @@
#---------------------------------- Content ---------------------------------#
#begin ButtonFont.spritefont
/importer:FontDescriptionImporter
/processor:FontDescriptionProcessor
/processorParam:PremultiplyAlpha=True
/processorParam:TextureFormat=Compressed
/build:ButtonFont.spritefont
#begin checkboxs_off-on.png
#begin MonstersAnimations.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
@ -87,6 +80,13 @@
/processorParam:Quality=Best
/build:DoomTestSong.mp3
#begin Font_12.spritefont
/importer:FontDescriptionImporter
/processor:FontDescriptionProcessor
/processorParam:PremultiplyAlpha=True
/processorParam:TextureFormat=Compressed
/build:Font_12.spritefont
#begin Font_25.spritefont
/importer:FontDescriptionImporter
/processor:FontDescriptionProcessor
@ -252,7 +252,19 @@
/processorParam:TextureFormat=Color
/build:textboxbackground6-1.png
#begin tiles.png
#begin MonstersAnimations.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
/processorParam:ColorKeyEnabled=True
/processorParam:GenerateMipmaps=False
/processorParam:PremultiplyAlpha=True
/processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False
/processorParam:TextureFormat=Color
/build:MonstersAnimations.png
#begin PC_Computer_Dangerous_Dave_In_The_Haunted_Mansion_Death_Sequences.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
@ -264,6 +276,18 @@
/processorParam:TextureFormat=Color
/build:tiles.png
#begin playerAnimation.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
/processorParam:ColorKeyEnabled=True
/processorParam:GenerateMipmaps=False
/processorParam:PremultiplyAlpha=True
/processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False
/processorParam:TextureFormat=Color
/build:playerAnimation.png
#begin wall.jpg
/importer:TextureImporter
/processor:TextureProcessor

View file

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file contains an xml description of a font, and will be read by the XNA
Framework Content Pipeline. Follow the comments to customize the appearance
of the font in your game, and to change the characters which are available to draw
with.
-->
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
<Asset Type="Graphics:FontDescription">
<!--
Modify this string to change the font that will be imported.
-->
<FontName>Arial</FontName>
<!--
Size is a float value, measured in points. Modify this value to change
the size of the font.
-->
<Size>12</Size>
<!--
Spacing is a float value, measured in pixels. Modify this value to change
the amount of spacing in between characters.
-->
<Spacing>0</Spacing>
<!--
UseKerning controls the layout of the font. If this value is true, kerning information
will be used when placing characters.
-->
<UseKerning>true</UseKerning>
<!--
Style controls the style of the font. Valid entries are "Regular", "Bold", "Italic",
and "Bold, Italic", and are case sensitive.
-->
<Style>Regular</Style>
<!--
If you uncomment this line, the default character will be substituted if you draw
or measure text that contains characters which were not included in the font.
-->
<!-- <DefaultCharacter>*</DefaultCharacter> -->
<!--
CharacterRegions control what letters are available in the font. Every
character from Start to End will be built and made available for drawing. The
default range is from 32, (ASCII space), to 126, ('~'), covering the basic Latin
character set. The characters are ordered according to the Unicode standard.
See the documentation for more information.
-->
<CharacterRegions>
<CharacterRegion>
<Start>&#32;</Start>
<End>&#126;</End>
</CharacterRegion>
<CharacterRegion>
<Start>&#1072;</Start>
<End>&#1103;</End>
</CharacterRegion>
</CharacterRegions>
</Asset>
</XnaContent>

View file

@ -0,0 +1 @@
{"id":"HunchmanAttackLeft","textureName":"MonstersAnimations","startSpriteRectangle":{"X":101,"Y":124,"Width":40,"Height":24},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":3,"isCycle":true,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"HunchmanAttackRight","textureName":"MonstersAnimations","startSpriteRectangle":{"X":101,"Y":99,"Width":40,"Height":24},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":3,"isCycle":true,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"HunchmanMoveLeft","textureName":"MonstersAnimations","startSpriteRectangle":{"X":1,"Y":124,"Width":24,"Height":24},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":4,"isCycle":true,"offset":"0, 0"}

View file

@ -0,0 +1,3 @@
{"id":"HunchmanMoveRight","textureName":"MonstersAnimations","startSpriteRectangle":{"X":1,"Y":99,"Width":24,"Height":24},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":4,"isCycle":true,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"playerJumpLeft","textureName":"playerAnimation","startSpriteRectangle":{"X":101,"Y":34,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":3,"isCycle":false,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"playerJumpRight","textureName":"playerAnimation","startSpriteRectangle":{"X":126,"Y":1,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":3,"isCycle":false,"offset":"0, 0"}

View file

@ -0,0 +1,20 @@
{
"id": "playerMoveLeft",
"textureName": "playerAnimation",
"startSpriteRectangle": {
"X": 26,
"Y": 34,
"Width": 24,
"Height": 32
},
"frameSecond": [
{
"Item1": 0,
"Item2": 8
}
],
"textureFrameInterval": 1,
"framesCount": 4,
"isCycle": true,
"offset": "0, 0"
}

View file

@ -0,0 +1,20 @@
{
"id": "playerMoveRight",
"textureName": "playerAnimation",
"startSpriteRectangle": {
"X": 26,
"Y": 1,
"Width": 24,
"Height": 32
},
"frameSecond": [
{
"Item1": 0,
"Item2": 8
}
],
"textureFrameInterval": 1,
"framesCount": 4,
"isCycle": true,
"offset": "0, 0"
}

View file

@ -0,0 +1 @@
{"id":"playerRightStay","textureName":"playerAnimation","startSpriteRectangle":{"X":1,"Y":1,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":1,"isCycle":true,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"playerStayLeft","textureName":"playerAnimation","startSpriteRectangle":{"X":1,"Y":34,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":1,"isCycle":true,"offset":"0, 0"}

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -0,0 +1,50 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using MonogameLibrary.UI.Elements;
using static System.String;
namespace DangerousD.GameCore.GUI
{
public class DebugHUD : IDrawableObject
{
private SpriteFont _spriteFont;
private Dictionary<string, string> _text = new();
public void Initialize()
{
}
public void LoadContent()
{
_spriteFont = AppManager.Instance.Content.Load<SpriteFont>("Font_12");
}
public void Update(GameTime gameTime)
{
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Begin();
spriteBatch.DrawString(
_spriteFont,
Join("\n", _text.Select(el => el.Key + ": " + el.Value).ToList()),
new Vector2(10, 10),
Color.Cyan,
0,
Vector2.Zero,
1,
SpriteEffects.None,
0
);
spriteBatch.End();
}
public void Set(string key, string value)
{
_text[key] = value;
}
}
}

View file

@ -17,8 +17,6 @@ namespace DangerousD.GameCore
public int Width { get; set; }
public int Height { get; set; }
public Rectangle Rectangle => new Rectangle((int)Pos.X, (int)Pos.Y, Width, Height);
public Vector2 velocity;
public Vector2 acceleration;
protected abstract GraphicsComponent GraphicsComponent { get; }
public GameObject(Vector2 pos)
{

View file

@ -4,7 +4,7 @@ using Microsoft.Xna.Framework.Graphics;
namespace DangerousD.GameCore.GUI
{
interface IDrawableObject
public interface IDrawableObject
{
void Initialize();
void LoadContent();

View file

@ -4,7 +4,9 @@ using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Security.Authentication.ExtendedProtection;
using System.Text;
using System.Threading.Tasks;
@ -12,15 +14,71 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
{
public class Hunchman : CoreEnemy
{
GameManager gameManager;
bool isAttacking;
public Hunchman(Vector2 position) : base(position)
{
Width = 48;
Height = 48;
monster_speed = -2;
monster_health = 1;
name = "HunchMan";
velocity = new Vector2(monster_speed, 0);
gameManager = AppManager.Instance.GameManager;
isAttacking = false;
isAlive = true;
}
protected override GraphicsComponent GraphicsComponent { get; } = new(new List<string> { "HunchmanMoveLeft", "HunchmanMoveRight", "HunchmanAttackLeft", "HunchmanAttackRight" }, "HunchmanMoveRight");
protected override GraphicsComponent GraphicsComponent { get; } = new(new List<string>
{ "HunchmanMoveLeft", "HunchmanMoveRight", "HunchmanAttackLeft", "HunchmanAttackRight" }, "HunchmanMoveLeft");
public override void Update(GameTime gameTime)
{
// P.S. Всё в классе можешь смело удалять и переписывать с нуля.
gameManager = AppManager.Instance.GameManager;
if (!isAttacking)
{
Attack();
Move(gameTime);
}
else
{
velocity.X = 0;
}
Death();
}
public override void Attack()
{
GameObject gameObject;
foreach (var player in gameManager.players)
{
if (player.Pos.Y + player.Height >= Pos.Y && player.Pos.Y <= Pos.Y + Height)
{
gameObject = gameManager.physicsManager.RayCast(this, player);
if (gameObject is null)
{
isAttacking = true;
GraphicsComponent.StopAnimation();
if (velocity.X > 0)
{
if (GraphicsComponent.GetCurrentAnimation != "HunchmanAttackRight")
{
GraphicsComponent.StartAnimation("HunchmanAttackRight");
}
}
else if (velocity.X < 0)
{
if (GraphicsComponent.GetCurrentAnimation != "HunchmanAttackLeft")
{
GraphicsComponent.StartAnimation("HunchmanAttackLeft");
}
}
}
}
}
}
public override void Attack(GameTime gameTime)
@ -29,13 +87,46 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
}
public override void Death()
{
if (monster_health <= 0)
{
}
}
public override void Move(GameTime gameTime)
{
if (gameManager.physicsManager.RayCast(this, new Vector2(Pos.X + Width + 10, Pos.Y + Height)) is not null)
{
monster_speed *= -1;
}
velocity.X = monster_speed;
if (velocity.X > 0)
{
if (GraphicsComponent.GetCurrentAnimation != "HunchmanMoveRight")
{
GraphicsComponent.StartAnimation("HunchmanMoveRight");
}
}
else if (velocity.X < 0)
{
if (GraphicsComponent.GetCurrentAnimation != "HunchmanMoveLeft")
{
GraphicsComponent.StartAnimation("HunchmanMoveLeft");
}
}
}
public override void OnCollision(GameObject gameObject)
{
monster_speed *= -1;
_pos.X += 5 * monster_speed;
Debug.WriteLine("Collision");
}
public override void Target()

View file

@ -13,7 +13,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
{
public class Zombie : CoreEnemy
{
private bool isGoRight = true;
float leftBorder;
float rightBorder;
bool isAttaking = false;
@ -25,9 +24,18 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
Height = 40;
monster_speed = 3;
name = "Zombie";
leftBorder = (int)position.X - 100;
rightBorder = (int)position.X + 100;
leftBorder = (int)position.X - 50;
rightBorder = (int)position.X + 50;
physicsManager = new PhysicsManager();
Random random = new Random();
if(random.Next(0, 2) == 0)
{
isGoRight = true;
}
else
{
isGoRight = false;
}
}
protected override GraphicsComponent GraphicsComponent { get; } = new(new List<string> { "ZombieMoveRight", "ZombieMoveLeft", "ZombieRightAttack", "ZombieLeftAttack" }, "ZombieMoveLeft");
@ -38,7 +46,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
Target();
Move(gameTime);
}
fixBorder();
base.Update(gameTime);
}
@ -50,7 +58,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
{
if (GraphicsComponent.GetCurrentAnimation != "ZombieRightAttack")
{
GraphicsComponent.StartAnimation("ZombieAttackRight");
GraphicsComponent.StartAnimation("ZombieRightAttack");
}
AppManager.Instance.GameManager.players[0].Death(name);
}
@ -71,7 +79,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
public override void Move(GameTime gameTime)
{
float delta = (float)gameTime.ElapsedGameTime.TotalSeconds;
if (isGoRight)
{
if (GraphicsComponent.GetCurrentAnimation != "ZombieMoveRight")
@ -113,7 +120,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
}
public override void Target()
{
if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 50, (int)Pos.Y, Width + 100, Height), typeof(Player)) != null)
if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 50, (int)Pos.Y, Width + 100, Height), typeof(Player)).Count > 0)
{
if (isGoRight && this._pos.X <= AppManager.Instance.GameManager.players[0].Pos.X)
{
@ -130,10 +137,19 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
}
}
}
public override void Attack(GameTime gameTime)
public void fixBorder()
{
throw new NotImplementedException();
if(leftBorder <= 0)
{
leftBorder = 0;
}
if(rightBorder >= 800)
{
rightBorder = 760;
}
}
public override void Attack(GameTime gameTime)
{}
}
}

View file

@ -13,8 +13,8 @@ namespace DangerousD.GameCore.GameObjects.PlayerDeath
{
public DeathRectangle(Vector2 pos, string DeathType) : base(pos)
{
Height = 128;
Width = 128;
Height = 48;
Width = 48;
PlayDeath(DeathType);
}

View file

@ -14,6 +14,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
public class Player : LivingEntity
{
bool isAlive = true;
bool isRight;
string stayAnimation;
bool isJump = false;
public int health;
public bool isGoRight = false;
@ -21,6 +23,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
public int rightBorder;
public int leftBorder;
public bool isVisible = true;
private bool isAttacked = false;
public GameObject objectAttack;
public Player(Vector2 position) : base(position)
@ -30,7 +33,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
AppManager.Instance.InputManager.ShootEvent += Shoot;
AppManager.Instance.InputManager.MovEventJump += AnimationJump;
AppManager.Instance.InputManager.MovEventJump += Jump;
AppManager.Instance.InputManager.MovEventDown += MoveDown;
velocity = new Vector2(0, 0);
@ -38,9 +41,11 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
leftBorder = (int)position.X - 100;
}
public bool IsAlive { get { return isAlive; } }
protected override GraphicsComponent GraphicsComponent { get; } = new(new List<string> { "ZombieMoveRight", "ZombieMoveLeft", "ZombieRightAttack", "ZombieLeftAttack", "DeathFromZombie" }, "ZombieMoveLeft");//TODO: Change to player
protected override GraphicsComponent GraphicsComponent { get; } = new(new List<string> { "playerMoveLeft", "playerMoveRight", "DeathFromZombie", "playerRightStay", "playerStayLeft",
"playerJumpRight" , "playerJumpLeft"}, "playerStayLeft");
public void Attack()
{
@ -66,23 +71,26 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
}
public void Death(string monsterName)
{
/*if(monsterName == "Zombie")
isAttacked = true;
if(monsterName == "Zombie")
{
DeathRectangle deathRectangle = new DeathRectangle(Pos, "DeathFrom" + monsterName);
deathRectangle.Gr.actionOfAnimationEnd += (a) =>
{
if (a == "DeathFrom" + monsterName)
{
AppManager.Instance.ChangeGameState(GameState.GameOver);
AppManager.Instance.ChangeGameState(GameState.Death);
}
};
}
isAlive = false;*/
isAlive = false;
}
public void AnimationJump()
public void Jump()
{
if (isOnGround)
{
velocity.Y = -11;
isJump = true;
}
// здесь будет анимация
}
public void Shoot()
@ -93,33 +101,34 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
public override void Update(GameTime gameTime)
{
GraphicsComponent.CameraPosition = (_pos-new Vector2(200, 350)).ToPoint();
velocity.X = 0.5f;
if (velocity.Y == 0)
if (!isAttacked)
{
isJump = false;
Move(gameTime);
}
else
{
velocity.X = 0;
}
base.Update(gameTime);
Move(gameTime);
}
public void Move(GameTime gameTime)
{
float delta = (float)gameTime.ElapsedGameTime.TotalSeconds;
if (AppManager.Instance.InputManager.VectorMovementDirection.X==1)
velocity.X = 5 * AppManager.Instance.InputManager.VectorMovementDirection.X;
if (AppManager.Instance.InputManager.VectorMovementDirection.X > 0)
{
if (GraphicsComponent.GetCurrentAnimation != "ZombieMoveRight")//идёт направо
if (GraphicsComponent.GetCurrentAnimation != "playerMoveRight")//идёт направо
{
GraphicsComponent.StartAnimation("ZombieMoveRight");
GraphicsComponent.StartAnimation("playerMoveRight");
}
velocity.X = 5;
}
else if (AppManager.Instance.InputManager.VectorMovementDirection.X == -1)//идёт налево
else if (AppManager.Instance.InputManager.VectorMovementDirection.X < 0)//идёт налево
{
if (GraphicsComponent.GetCurrentAnimation != "ZombieMoveLeft")
if (GraphicsComponent.GetCurrentAnimation != "playerMoveLeft")
{
GraphicsComponent.StartAnimation("ZombieMoveLeft");
GraphicsComponent.StartAnimation("playerMoveLeft");
}
velocity.X = -5;
}
else if(AppManager.Instance.InputManager.VectorMovementDirection.X == 0)//стоит
{
@ -127,13 +136,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
{
GraphicsComponent.StartAnimation("ZombieMoveLeft");
}
velocity.X = 0;
}
}
public void MoveDown()
{
// ПОЧЕМУ
velocity.Y = -11;
isJump = true;
}
}

View file

@ -4,7 +4,7 @@ namespace DangerousD.GameCore.GameObjects;
public abstract class LivingEntity : Entity
{
private Vector2 targetPosition;
public bool isOnGround = true;
public Vector2 velocity;
public Vector2 acceleration;
public LivingEntity(Vector2 position) : base(position)
@ -13,7 +13,7 @@ public abstract class LivingEntity : Entity
}
public override void SetPosition(Vector2 position)
{
targetPosition = position; _pos = position;
_pos = position;
} //TODO befrend targetpos and physics engine

View file

@ -14,7 +14,13 @@ using DangerousD.GameCore.Managers;
namespace DangerousD.GameCore
{
public enum MultiPlayerStatus { SinglePlayer, Host, Client }
<<<<<<< HEAD
public enum GameState { Menu, Options, Lobby, Game, Login, Death, HUD }
=======
public enum GameState { Menu, Options, Lobby, Game, Login, Death,
GameOver
}
>>>>>>> e6d0f2b8a092647a5c02741fd70194bfb376b202
public class AppManager : Game
{
public static AppManager Instance { get; private set; }
@ -24,13 +30,14 @@ namespace DangerousD.GameCore
public GameState gameState { get; private set; }
public MultiPlayerStatus multiPlayerStatus { get; private set; } = MultiPlayerStatus.SinglePlayer;
public Point resolution = new Point(1920, 1080);
public Point inGameResolution = new Point(1920, 1080);
public Point inGameResolution = new Point(1366, 768);
IDrawableObject MenuGUI;
IDrawableObject OptionsGUI;
IDrawableObject LoginGUI;
IDrawableObject LobbyGUI;
IDrawableObject DeathGUI;
IDrawableObject HUD;
public DebugHUD DebugHUD;
public GameManager GameManager { get; private set; } = new();
public AnimationBuilder AnimationBuilder { get; private set; } = new AnimationBuilder();
@ -64,6 +71,7 @@ namespace DangerousD.GameCore
LobbyGUI = new LobbyGUI();
DeathGUI = new DeathGUI();
HUD = new HUD();
DebugHUD = new DebugHUD();
UIManager.resolution = resolution;
UIManager.resolutionInGame = inGameResolution;
}
@ -74,6 +82,7 @@ namespace DangerousD.GameCore
MenuGUI.Initialize();
LoginGUI.Initialize();
DebugHUD.Initialize();
OptionsGUI.Initialize();
HUD.Initialize();
LobbyGUI.Initialize();
@ -84,6 +93,7 @@ namespace DangerousD.GameCore
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
DebugHUD.LoadContent();
MenuGUI.LoadContent();
LoginGUI.LoadContent();
OptionsGUI.LoadContent();
@ -131,6 +141,7 @@ namespace DangerousD.GameCore
default:
break;
}
DebugHUD.Update(gameTime);
base.Update(gameTime);
}
@ -174,6 +185,7 @@ namespace DangerousD.GameCore
_spriteBatch.End();
DebugHUD.Draw(_spriteBatch);
base.Draw(gameTime);
}

View file

@ -25,7 +25,7 @@ namespace DangerousD.GameCore
public List<Player> players;
public List<GameObject> otherObjects = new();
public Player GetPlayer1 { get; private set; }
public Player GetPlayer1;
public GameManager()
{
others = new List<GameObject>();
@ -72,6 +72,35 @@ namespace DangerousD.GameCore
}
}
public void Remove(GameObject gameObject)
{
GetAllGameObjects.Remove(gameObject);
if (gameObject is Player objPl)
{
livingEntities.Remove(gameObject as LivingEntity);
players.Remove(objPl);
}
else if (gameObject is LivingEntity objLE)
{
livingEntities.Remove(objLE);
}
else if (gameObject is Entity objE)
{
entities.Remove(objE);
}
else if (gameObject is MapObject obj)
{
if (obj.IsColliderOn)
mapObjects.Remove(obj);
else
BackgroundObjects.Remove(obj);
}
else
{
otherObjects.Remove(gameObject);
}
}
public void Draw(SpriteBatch _spriteBatch)
{
foreach (var item in BackgroundObjects)

View file

@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DangerousD.GameCore.GameObjects.LivingEntities;
using Microsoft.Xna.Framework;
namespace DangerousD.GameCore.Managers
@ -20,9 +21,9 @@ namespace DangerousD.GameCore.Managers
item.velocity = item.velocity + item.acceleration * delta;
}
CheckCollisions(livingEntities, mapObjects);
OnCollision(entities, livingEntities);
OnCollision(livingEntities);
CheckCollisionsLE_MO(livingEntities, mapObjects);
CheckCollisionsE_LE(entities, livingEntities);
CheckCollisionsLE_LE(livingEntities);
//entities dont move
//Living entities dont move
@ -33,68 +34,88 @@ namespace DangerousD.GameCore.Managers
//OnCollision
}
public void CheckCollisions(List<LivingEntity> livingEntities,
private void CheckCollisionsLE_MO(List<LivingEntity> livingEntities,
List<MapObject> mapObjects)
{
LivingEntity currentEntity;
Rectangle oldRect;
for (int i = 0; i < livingEntities.Count; i++)
foreach (var currentEntity in livingEntities)
{
currentEntity = livingEntities[i];
oldRect = currentEntity.Rectangle;
bool isXNormalise = true;
bool isYNormalise = true;
var currentRect = currentEntity.Rectangle;
var newRect = currentRect;
oldRect.Offset((int)currentEntity.velocity.X, 0);
for (int j = 0; j < mapObjects.Count; j++)
#region x collision
var collidedX = false;
var tryingRectX = currentRect;
tryingRectX.Offset((int)Math.Ceiling(currentEntity.velocity.X), 0);
foreach (var mapObject in mapObjects)
{
if (Math.Abs(mapObjects[i].Pos.X - currentEntity.Pos.X) < 550 && Math.Abs(mapObjects[i].Pos.Y - currentEntity.Pos.Y) < 550)
if (
Math.Abs(mapObject.Pos.X - currentEntity.Pos.X) < 550
&& Math.Abs(mapObject.Pos.Y - currentEntity.Pos.Y) < 550
&& tryingRectX.Intersects(mapObject.Rectangle)
)
{
if (oldRect.Intersects(mapObjects[j].Rectangle))
{
isXNormalise = false;
oldRect.Offset(-(int)currentEntity.velocity.X, 0);
collidedX = true;
break;
}
}
}
if (!isXNormalise)
if (collidedX)
{
currentEntity.velocity.X = 0;
oldRect.Offset(0, (int)currentEntity.velocity.Y);
for (int j = 0; j < mapObjects.Count; j++)
}
else
{
newRect.X = tryingRectX.X;
}
#endregion
if (oldRect.Intersects(mapObjects[j].Rectangle))
#region y collision
var collidedY = false;
var tryingRectY = currentRect;
tryingRectY.Offset(0, (int)Math.Ceiling(currentEntity.velocity.Y));
if (currentEntity is Player)
{
isYNormalise = false;
oldRect.Offset(0, -(int)currentEntity.velocity.Y);
AppManager.Instance.DebugHUD.Set("velocity", currentEntity.velocity.ToString());
AppManager.Instance.DebugHUD.Set("intersects y", "");
}
foreach (var mapObject in mapObjects)
{
if (tryingRectY.Intersects(mapObject.Rectangle))
{
if (currentEntity is Player) AppManager.Instance.DebugHUD.Set("intersects y", mapObject.GetType().ToString());
collidedY = true;
break;
}
}
if (!isYNormalise)
currentEntity.isOnGround = collidedY && currentEntity.velocity.Y > 0;
if (collidedY)
{
currentEntity.velocity.Y = 0;
currentEntity.SetPosition(new Vector2(oldRect.X, oldRect.Y));
}
else
{
newRect.Y = tryingRectY.Y;
}
#endregion
currentEntity.SetPosition(new Vector2(newRect.X, newRect.Y));
}
}
public void OnCollision(List<Entity> entities, List<LivingEntity> livingEntities)
private void CheckCollisionsE_LE(List<Entity> entities, List<LivingEntity> livingEntities)
{
for (int i = 0; i < entities.Count; i++)
foreach (var entity in entities)
{
for (int j = 0; j < livingEntities.Count; j++)
foreach (var livingEntity in livingEntities)
{
if (livingEntities[j].Rectangle.Intersects(entities[i].Rectangle))
if (livingEntity.Rectangle.Intersects(entity.Rectangle))
{
livingEntities[j].OnCollision(entities[i]);
entities[i].OnCollision(livingEntities[j]);
livingEntity.OnCollision(entity);
entity.OnCollision(livingEntity);
}
}
}
}
public void OnCollision(List<LivingEntity> livingEntities)
private void CheckCollisionsLE_LE(List<LivingEntity> livingEntities)
{
for (int i = 0; i < livingEntities.Count; i++)
{

View file

@ -40,6 +40,7 @@ namespace DangerousD.GameCore
public void StartAmbientSound(string soundName) // запустить звук у которого нет позиции
{
return;
var sound = new Sound(Sounds[soundName]);
sound.SoundEffect.IsLooped = false;
sound.SoundEffect.Play();