LADXHD/InGame/GameObjects/Enemies/ObjZombieSpawner.cs
2023-12-14 17:21:22 -05:00

62 lines
2.3 KiB
C#

using Microsoft.Xna.Framework;
using ProjectZ.Base;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.Map;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.Enemies
{
internal class ObjZombieSpawner : GameObject
{
private Rectangle _triggerField;
private float _spawnTime;
private float _spawnCounter;
public ObjZombieSpawner() : base("zombie") { }
public ObjZombieSpawner(Map.Map map, int posX, int posY, int spawnTime) : base(map)
{
_triggerField = map.GetField(posX, posY);
_spawnTime = spawnTime;
_spawnCounter = spawnTime;
EntityPosition = new CPosition(_triggerField.X, _triggerField.Y, 0);
EntitySize = new Rectangle(0, 0, _triggerField.Width, _triggerField.Height);
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
}
private void Update()
{
// check if the player is standing in the field
if (_triggerField.Contains(new Point((int)MapManager.ObjLink.EntityPosition.X, (int)MapManager.ObjLink.EntityPosition.Y)))
_spawnCounter -= Game1.DeltaTime;
if (_spawnCounter <= 0)
{
_spawnCounter = _spawnTime;
// try to find a position for the new zombie
for (var i = 0; i < 10; i++)
{
var posX = _triggerField.X + Game1.RandomNumber.Next(0, 10) * Values.TileSize;
var posY = _triggerField.Y + Game1.RandomNumber.Next(0, 8) * Values.TileSize;
// found a good position?
var collidingRectangle = Box.Empty;
if (!Map.Objects.Collision(new Box(posX, posY, 0, 16, 16, 8), Box.Empty,
Values.CollisionTypes.Normal | Values.CollisionTypes.Enemy | Values.CollisionTypes.Player, 0, 0,
ref collidingRectangle))
{
var newZombie = new EnemyZombie(Map, posX, posY);
Map.Objects.SpawnObject(newZombie);
break;
}
}
}
}
}
}