桥梁设计游戏






4.84/5 (25投票s)
2006年12月22日
4分钟阅读

200664

2999
本文介绍用于开发桥梁设计游戏的设计和技术。
引言
本文介绍了小型但可扩展的桥梁设计游戏的开发。它为用户提供了一系列设计挑战,要求他们建造越来越大的桥梁,在预算有限的情况下跨越更长的距离。 设计师必须使用梁、电缆和销钉等小型结构组件来创建桥梁。 桥梁必须使用有限数量的支撑点跨越间隙。 为了向用户提供提示并使其在视觉上更令人愉悦,可以为每个难题指定背景图片。
背景
有一些桥梁设计游戏提供了一组免费试用级别。 这些游戏很有趣,但您必须付费才能获得更多级别,而且我更喜欢自己编写软件的挑战。 此外,这个项目让我有机会尝试 .NET 2.0 的新功能,例如泛型和新的 TabStrip
UI 控件。
使用代码
提供了完整的源代码作为您自己修改或版本的起点。 我希望在其他人的贡献下对其进行扩展。
设计要素
该项目中使用的第一个设计要素是弹簧。 模拟中的每个结构元件要么是弹簧,要么是销钉(用于连接弹簧)。 钢只是一个非常非常硬的弹簧(它具有很高的弹簧常数)。 电缆是只能承受张力的另一种形式的弹簧。 正如我的大学物理学教授所说,“你不能推绳子。” 所以我首先创建了 Spring
类,赋予它一些属性,并为它定义了一些方法。 然后,我对它进行了子类化,以提供 LightSteel
、HeavySteel
和 Cable
的具体类
以下代码中定义了 Spring
对象的一些更有趣的属性。
public virtual float MaxSpringLength { get { return 90.0f; } }
public virtual float MaximumForce { get { return 1.0f; } }
public virtual float CostPerFoot { get { return 10.0f; } }
public virtual float SpringConstant { get { return 5.0f; } }
public virtual float WeightPerFoot { get { return 1.0f; } }
这些属性中的每一个都是虚拟的,可以在子类中重写,以专门化不同构建组件的行为。 例如,HeavySteel
与 LightSteel
相似,只是它更重(更高的 WeightPerFoot
)、更坚固(更高的 SpringConstant
)并且更昂贵(更高的 CostPerFoot
)。
根据需要创建销钉,以提供弹簧之间的连接点。 每个销钉只是游戏板上的一个 2D 位置。 它被定义为 2D 点的泛型集合,如下所示
System.Collections.Generic.List< System.Drawing.PointF > m_pins;
整个桥梁存储在 Bridge
类中。 值得注意的是,它包含销钉集合、弹簧集合、当前交互模式和锚定销钉。 锚定销钉通过提供环境中唯一的实体连接点来帮助定义难题。 无论有多少其他弹簧连接到锚定点,它都会支撑它们的重量而不会移动。 Bridge
类还支持以下方法:
- 清除桥梁结构
- 加载新的难题
- 向结构添加新的弹簧或销钉
- 从结构中移除弹簧或销钉
- 计算结构的成本
- 计算结构中的力
- 挠曲桥梁(移动销钉位置)
- 绘制桥梁
各种谜题级别由 Level
类支持。 它们由 XML 定义,并存储在磁盘上某个文件夹中的级别文件夹中。 这允许用户仅通过添加级别文件夹来定义自己的级别。 为了使此过程更加方便,有一个简单的级别编辑器可以管理级别文件夹的创建。 每个级别都定义锚点列表、背景图像和预算(允许的材料总成本)。
模拟
物理模拟可能是最有趣的部分。 它发生在单独的线程中,以便允许图形更新(交互式用户体验)和用户对模拟过程的控制。 主模拟循环遵循此迭代算法,以便为权重和重力提供动态响应
white ( simulating )
calculate all the forces for all the springs
find the maximum force
scale all the forces to prevent moving to quickly or too slowly
apply the forces to all the pins to move them
未来计划
该项目的计划是根据读者的评论进一步完善游戏的设计,然后提供一个中央在线位置,用户可以在其中上传和下载游戏级别。 为了使其易于使用,应将其集成到用户界面中,使其更加有趣和动态。 另一个有趣的事情是允许可扩展的组件,也许是可定义的,特别是对于每个级别。
历史
- 12/22/06 - 首次提交到 CodeProject。