using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using System; namespace LunaLightXMG { public class Enemy { private float hsp; // Horizontal speed private float hspPrev; private float vsp; // Vertical speed private float hsp_frac; // Horizontal fractional speed private float vsp_frac; // Vertical fractional speed private float vspJump; private bool grounded; private bool walled; private float grv; private Texture2D texture; public Vector2 position; public BoundingBox boundingBox { get; private set; } private CollisionManager collisionManager; private static Random random; public Enemy(Vector2 initPosition, float initHsp) { hsp = initHsp; vsp = 0; hsp_frac = 0; vsp_frac = 0; vspJump = -4f; grounded = false; walled = false; grv = 0.2f; position = initPosition; boundingBox = new BoundingBox(new Rectangle((int)position.X, (int)position.Y, 8, 8)); collisionManager = new CollisionManager(); random = new Random(42); } public void LoadContent(ContentManager content) { texture = content.Load("enemy"); } public void Update(GameTime gameTime, Player player, Platform[] platforms) { Movement(); boundingBox.Update(position, boundingBox.Bounds.Width, boundingBox.Bounds.Height); DumpFractions(); CollisionChecks(platforms, player); } public void Draw(SpriteBatch spriteBatch) { if (hsp <= 1 && hsp >= -1) { spriteBatch.Draw(texture, position, Color.White); } else { spriteBatch.Draw(texture, position, Color.Red); } } // Method Implementation ------------------------------------------------------------------------------- private void Movement() { if (hsp == 0) { hsp = hspPrev; } if (walled) { hsp = -hsp; } if (!grounded) { vsp += grv; } if (RandomJump() && grounded) { vsp = vspJump; } } private void CollisionChecks(Platform[] platforms, Player player) { // Remember hsp hspPrev = hsp; // Horizontal collision prediction float onePixh = Math.Sign(hsp); if (collisionManager.IsColliding(position + new Vector2(hsp, 0), boundingBox, platforms)) { while (!collisionManager.IsColliding(position + new Vector2(onePixh, 0), boundingBox, platforms)) { position.X += onePixh; } hsp = 0; } position.X += hsp; // Horizontal move // Vertical collision prediction float onePixv = Math.Sign(vsp); if (collisionManager.IsColliding(position + new Vector2(0, vsp), boundingBox, platforms)) { while (!collisionManager.IsColliding(position + new Vector2(0, onePixv), boundingBox, platforms)) { position.Y += onePixv; } vsp = 0; } position.Y += vsp; // Vertical move // Grounded? grounded = collisionManager.IsColliding(position + new Vector2(0, 1), boundingBox, platforms); // Walled? walled = collisionManager.WallCheck(position, boundingBox, platforms); // Check for collision with player if (boundingBox.Intersects(player.boundingBox) && player.vsp > 0) { // Player jumps on top of the enemy, enemy dies Die(); } } // Enemy dies private void Die() { // Logic for enemy death (e.g., remove from game, play animation, etc.) // Here we just move the enemy off-screen as a simple example position = new Vector2(-100, -100); } private void DumpFractions() { if (grounded) { float adjustedPosX = (float)Math.Round(position.X); float adjustedPosY = (float)Math.Round(position.Y); position.X = adjustedPosX; position.Y = adjustedPosY; } if (vsp >= 0) { hsp += hsp_frac; vsp += vsp_frac; hsp_frac = hsp - (float)Math.Floor(hsp); vsp_frac = vsp - (float)Math.Floor(vsp); hsp -= hsp_frac; vsp -= vsp_frac; } } public static bool RandomJump() { return (1 + 2 * random.NextDouble() > 2) ? true : false; } } }