MonoGame开发问题:List移除Block失败,全部删除后需自动退出程序
代码核心错误点
- 成员访问与逻辑错误:
Block类中没有定义名为block的集合成员,存储所有Block实例的blocks是Game1类的私有成员,Block类无权直接访问。且你自定义的Remove方法逻辑完全无效,每次执行都会重置i=0,永远只会尝试移除索引0的元素,i++没有任何实际作用。
- 成员访问与逻辑错误:
- 遍历规则冲突:
Game1的Update方法中用foreach遍历blocks集合的同时修改集合(移除元素),会直接抛出「集合被修改,枚举操作无法执行」的运行时异常。
- 遍历规则冲突:
- 语法错误:
Block类没有定义RemoveAt方法,你在Update中直接调用block.RemoveAt(i)属于语法错误,代码无法正常编译运行。
- 语法错误:
- 计数逻辑失效:
Update的foreach循环中每次迭代都会重置i=0,i永远无法累计到2000,自动退出的逻辑永远不会触发。
- 计数逻辑失效:
修复方案
第一步:修改Block类,删除无效的Remove方法
namespace projectblob_nivå1 { class Block { public int X { get; set; } = 100; public int Y { get; set; } = 100; public Color Color { get; set; } = Color.Red; public void Draw(SpriteBatch spriteBatch, Texture2D texture) { spriteBatch.Draw(texture, new Rectangle(X, Y, 30, 30), Color); } } }
第二步:修改Game1的Update方法,修正集合移除逻辑
如果需要一次性清空所有Block后直接退出:
protected override void Update(GameTime gameTime) { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) Exit(); // 直接清空所有Block blocks.Clear(); // 集合为空直接退出 if (blocks.Count == 0) { Exit(); } base.Update(gameTime); }
如果需要逐帧逐步移除Block(比如每次只删一个),用倒序for循环避免遍历异常:
protected override void Update(GameTime gameTime) { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) Exit(); // 倒序遍历不会因为元素移除导致索引错乱 for (int i = blocks.Count - 1; i >= 0; i--) { // 此处可添加自定义移除判断条件,满足条件再删除当前Block blocks.RemoveAt(i); break; // 每次只删一个就跳出,实现逐帧删除效果 } if (blocks.Count == 0) { Exit(); } base.Update(gameTime); }
内容的提问来源于stack exchange,提问作者Monkeybeat
相关产品推荐
相关产品推荐

