mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-25 16:03:02 +00:00
95 lines
3.7 KiB
C#
95 lines
3.7 KiB
C#
|
using Microsoft.Xna.Framework;
|
||
|
using Microsoft.Xna.Framework.Graphics;
|
||
|
using ProjectZ.Base;
|
||
|
using ProjectZ.InGame.GameObjects.Base;
|
||
|
using ProjectZ.InGame.GameObjects.Base.CObjects;
|
||
|
using ProjectZ.InGame.GameObjects.Base.Components;
|
||
|
using ProjectZ.InGame.Things;
|
||
|
|
||
|
namespace ProjectZ.InGame.GameObjects.Things
|
||
|
{
|
||
|
internal class ObjCollider : GameObject
|
||
|
{
|
||
|
private Box _singleCollisionBox;
|
||
|
private Box[] CollisionBoxes { get; }
|
||
|
|
||
|
private readonly Color _editorColor = Color.DarkRed * 0.65f;
|
||
|
private readonly int _level = -1;
|
||
|
|
||
|
public ObjCollider(Map.Map map, int posX, int posY, Color editorColor, Values.CollisionTypes type, params Rectangle[] rectangles) : base(map)
|
||
|
{
|
||
|
EditorIconSource = new Rectangle(0, 0, 16, 16);
|
||
|
_editorColor = editorColor;
|
||
|
|
||
|
EntityPosition = new CPosition(posX, posY, 0);
|
||
|
EntitySize = new Rectangle(0, 0, 16, 16);
|
||
|
|
||
|
CollisionBoxes = new Box[rectangles.Length];
|
||
|
for (var i = 0; i < rectangles.Length; i++)
|
||
|
CollisionBoxes[i] = new Box(
|
||
|
posX + rectangles[i].X, posY + rectangles[i].Y, 0,
|
||
|
rectangles[i].Width, rectangles[i].Height, 16);
|
||
|
|
||
|
AddComponent(CollisionComponent.Index, new CollisionComponent(MultiBoxCollision) { CollisionType = type });
|
||
|
}
|
||
|
|
||
|
public ObjCollider(Map.Map map, int posX, int posY, int height, Rectangle rectangle, Values.CollisionTypes type, int level) : base(map)
|
||
|
{
|
||
|
EditorIconSource = new Rectangle(0, 0, 16, 16);
|
||
|
|
||
|
EntityPosition = new CPosition(posX, posY, 0);
|
||
|
EntitySize = new Rectangle(0, 0, 16, 16);
|
||
|
|
||
|
_level = level;
|
||
|
_singleCollisionBox = new Box(
|
||
|
posX + rectangle.X, posY + rectangle.Y, 0,
|
||
|
rectangle.Width, rectangle.Height, height);
|
||
|
|
||
|
AddComponent(CollisionComponent.Index, new CollisionComponent(SingeBoxCollision) { CollisionType = type });
|
||
|
}
|
||
|
|
||
|
private bool MultiBoxCollision(Box box, int dir, int level, ref Box collidingBox)
|
||
|
{
|
||
|
foreach (var singleBox in CollisionBoxes)
|
||
|
if (singleBox.Intersects(box))
|
||
|
{
|
||
|
collidingBox = singleBox;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
private bool SingeBoxCollision(Box box, int dir, int level, ref Box collidingBox)
|
||
|
{
|
||
|
if ((_level != -1 && _level < level) || !_singleCollisionBox.Intersects(box))
|
||
|
return false;
|
||
|
|
||
|
collidingBox = _singleCollisionBox;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public override void DrawEditor(SpriteBatch spriteBatch, Vector2 drawPosition)
|
||
|
{
|
||
|
if (CollisionBoxes != null)
|
||
|
for (var i = 0; i < CollisionBoxes.Length; i++)
|
||
|
{
|
||
|
spriteBatch.Draw(Resources.SprWhite,
|
||
|
new Rectangle(
|
||
|
(int)(drawPosition.X + CollisionBoxes[i].X),
|
||
|
(int)(drawPosition.Y + CollisionBoxes[i].Y),
|
||
|
(int)CollisionBoxes[i].Width,
|
||
|
(int)CollisionBoxes[i].Height), _editorColor);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
spriteBatch.Draw(Resources.SprWhite,
|
||
|
new Rectangle(
|
||
|
(int)(drawPosition.X + _singleCollisionBox.X),
|
||
|
(int)(drawPosition.Y + _singleCollisionBox.Y),
|
||
|
(int)_singleCollisionBox.Width,
|
||
|
(int)_singleCollisionBox.Height), _editorColor);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|