对象应该如何在Java游戏中

编辑:我刚刚删除了整篇文章,并重新提出了更为通用的问题.

我想做一个简单的策略游戏:地图,单位.

地图:一节课.单位:另一类,自绘.

简单问题:

>单位如何在地图上重绘自己.
>一个单元应该是一个JPanel或类似的Swing组件(只是为了能够将它们作为一个具有自己的鼠标处理程序的实体来管理)或者可以是另一个东西,而不会忽略它应该是一个具有自己的动作处理程序的自治对象的事实.领域.
>这个地图单元模型是否正确,这将有助于我以有趣的方式学习Java和OOP基础知识.

而已!

最佳答案 有两种方法.

>要么有一个Map类,它是主要的JPanel,要维护单元的集合,但要将Unit类保持为非Swing.调用Map的paint()方法时,通过调用每个可见Unit中的方法,让每个Unit重绘自己. Unit可以从任何基类继承,例如Rectangle,或者您在程序中使用的其他一些数据结构.在这种情况下,Unit类处理绘画和计算,但Map处理每个单元的点击和事件.如果需要,它可以将消息传递给该单位;但是,如果单位本身不需要了解这些东西,这种方法效果很好. Unit类轻巧经济.您还可以决定单位是否知道其在地图中的位置.
>或者将每个单元作为JComponent,并分别处理自己的事件.缺点是单元的每个实例都会创建一堆数据以便绘制它.因此,如果你有数百个单位,只有几个单位被绘制,这种方式效率不高.优点是每个单元可以处理自己的GUI事件而无需翻译等.这也假设游戏中的实际单位和屏幕上的图形单元的1:1映射.如果一个单元需要知道其他单位是什么,那么在单位中实施某些事件处理程序也比较棘手!
>第三种可以说是更好的方法是拥有一个纯数据Unit类,包含有关单元的游戏信息,如(1)所示,但它有一个在需要时创建JComponent的方法.例如,JComponent可以是Unit中的内部类 – 然后它可以访问Unit数据.如果单元可能需要在2个位置显示(例如,在2个屏幕或视图上),这是很好的.

发表评论的补遗

这是正确的,在(1)Map(主JPanel)实现鼠标处理程序,并依次询问每个单元是否“命中”.这允许您执行更复杂的操作,例如将2个单元重叠/彼此叠加,并且两者都可以响应单击.

另外,例如,它们可能不是矩形,也可能是使用alpha通道绘制的(如果单位是JComponents,它们默认会在整个矩形上抓取任何鼠标事件给自己).如果你的单位没有重叠并且在它们自己的矩形中,那么JComponent自己的鼠标处理程序就足够了.

如果使用方法(1),Map可以询问每个单元是否包含单击的点,然后Map可以处理“选择”过程.请记住,一个单位本身将无法确定选择其他单位 – 选择可能涉及取消选择另一个单位.在这种情况下,选择操作实际上是Map操作,而不是Unit操作,尽管它也可能改变Unit的外观或功能.

如果对单位使用单独的JComponents,则可以覆盖contains(Point)以确定鼠标是否命中该项目,但这不会让其他单位也响应该单击.但是每个单元可以“自己选择”(设置绘制时使用的标志)然后通知Map(它需要使用getParent或预设属性来查找它).

在决定此设计之前,您需要了解的关键事项是:
每场比赛你需要一个以上的“地图”面板吗?
您是否需要比显示更多的Unit对象?
你需要不止一次展示一个单位吗?
如果答案是肯定的,您应该将“数据”类与“视图”类分开,如3中所示.
那么:一个单位需要做什么?为了做到这一点,它需要了解地图和其他单位需要了解什么?例如在这种情况下,移动通常由Map类完成,因为它取决于Map和其他单元;最好由单位完成绘图,因为可能需要绘制许多具有不同数据结构的单位子类型;你所指出的单位选择操作介于两者之间.如果您看到Swing如何实现这一点(例如ButtonGroup,ListSelectionModel),那么’selection’本身可以作为一个单独的类.

点赞