gpt4 book ai didi

c# - 扩展方法是解决这个问题的方法吗?

转载 作者:行者123 更新时间:2023-11-30 16:28:31 25 4
gpt4 key购买 nike

在我的程序中,用于绘制的源矩形可以是常规矩形、空矩形或 X 或 Y 为 -1 的矩形。如果矩形是正常的(例如 (0, 0, 64, 64)),那么它只是从纹理中绘制它。如果它是 Rectangle.Empty,它什么也不画,只是继续循环。如果源矩形的 X 或 Y 为 -1,则它被确定为碰撞图 block 。

问题在于 -1 不直观。这是令人困惑和糟糕的解决方案。此外,如果出现更多的瓦片类型,它会开始变得荒谬,例如 -2 表示慢速瓦片或 -3 表示水瓦片。

另一个问题是,由于我不知道早期会有碰撞 block ,而且常规的 XNA 矩形很好,所以整个系统(谢天谢地,目前只有大约 1,000 行代码)使用 XNA 矩形。我想此时我将不得不创建一个单独的类并更新所有内容,但我不确定。

有什么好的解决方案?我根本没有真正涉足扩展方法。能否将它们应用于 Rectangle 类并提供 IsCollisionTile() 或 IsBlankTile() 等方法?最初我希望我可以从 Rectangle 类派生出一个 Tile 类,但不幸的是这个类是密封的。我想另一个简单的解决方案可能只是创建一个全局常量类,其中 -1 是 CollisionTile,0 是 BlankTile,等等。这至少会让它更容易理解,但对我来说这仍然很难看:

if (tiles[y, x].X == Constants.BlankTile)
continue;

if (tiles[y, x].X == Constants.CollisionTile)
{
Utility.DrawRectangle(spriteBatch, new Rectangle(x * TileSize, y * TileSize, TileSize, TileSize), collisionTileColor);
continue;
}

spriteBatch.Draw(tileset, new Rectangle(x * TileSize, y * TileSize, TileSize, TileSize), tiles[y, x], Color.White);

要是有一个属性我可以使用,比如带控件的 Tag。我真的不想放弃使用 Rectangle 类,因为它是如此嵌入到系统中,而且该程序纯粹是功能性的,只是在这方面不美观。理想情况下,我更喜欢一种只允许扩展 Rectangle 类的解决方案,以便能够以某种方式与其客户沟通它应该是什么类型的图 block 。

好吧,打字比我原先希望的要多得多。抱歉阅读时间过长x_x

最佳答案

我建议设置全局常量。在这种情况下出现扩展方法的问题是因为 Rectangle 是一个结构,一种值类型。这意味着您的扩展方法正在使用矩形的副本,而不是原始的。

关于c# - 扩展方法是解决这个问题的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7057505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com