为何无法从Enemy列表中绘制出1个以上的敌人?
解决Enemy列表仅能绘制单个敌人的问题
看起来你遇到了列表中多个敌人只显示一个的典型问题,我来帮你排查几个最可能的原因和对应的修复方案:
1. 所有敌人的初始位置完全重叠
这是最常见的情况——你在循环创建Enemy实例时,没有为每个敌人设置不同的坐标,导致10个敌人都挤在同一个位置,视觉上只看到一个。
修复示例:
检查你的创建循环,确保利用循环变量i来区分每个敌人的位置:
List<Enemy> lista = new List<Enemy>(); for(int i = 0; i < 10; i++) { // 给每个敌人设置不同的X坐标(比如横向间隔50像素) float enemyX = i * 50f; // Y坐标可以固定或也做区分 float enemyY = 100f; lista.Add(new Enemy(texture, delay, elapsedTime, frameX, frameY, enemyX, enemyY, gravity, speedX, speedX2)); }
2. 绘制逻辑没有遍历整个Enemy列表
如果你的主类绘制代码没有遍历lista的所有元素,只绘制了第一个敌人,那自然只能看到一个。
正确的绘制循环:
在主类的Draw方法中,确保遍历列表里的每一个Enemy:
protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); // 遍历所有敌人并绘制 foreach(var enemy in lista) { enemy.Draw(spriteBatch); } spriteBatch.End(); base.Draw(gameTime); }
3. Enemy类的sourceRect未正确实例化或共享
如果sourceRect是基类的静态字段,或者每个Enemy实例的sourceRect都指向同一个矩形对象,可能导致绘制时覆盖,但这种情况更多会导致动画异常,不过也可能影响显示。
检查Enemy类的sourceRect:
确保每个Enemy实例都有自己的sourceRect实例,比如在构造函数中初始化:
public class Enemy : YourBaseClass { private Rectangle sourceRect; private Vector2 enemyPos; public Enemy(Texture2D texture, int delay, int elapsedTime, int frameX, int frameY, float X, float Y, float gravity, float speedX, float speedX2) : base(texture, delay, elapsedTime, frameX, frameY, X, Y, gravity, speedX, speedX2) { this.enemyPos = new Vector2(X,Y); // 初始化当前实例的sourceRect,根据frameX/frameY设置(需替换frameWidth/frameHeight为你的帧尺寸) sourceRect = new Rectangle(frameX * frameWidth, frameY * frameHeight, frameWidth, frameHeight); } public void Draw(SpriteBatch sp) { sp.Draw(texture, enemyPos, sourceRect, Color.Red); } }
先从第1、2点开始排查,这两个是最容易出现的问题,一般就能解决你的显示问题了。
内容的提问来源于stack exchange,提问作者Elie Jamous
相关产品推荐
相关产品推荐

