gpt4 book ai didi

java - 对象在Java游戏中应该如何

转载 作者:搜寻专家 更新时间:2023-11-01 03:30:06 26 4
gpt4 key购买 nike

编辑:我只是删除了整个职位,并重新制定了更一般的问题。

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

地图:一类。单位:另一类,自行绘制。

简单的问题:

  • 单位应如何在地图上重新绘制自己。
  • 一个单元应该是JPanel或类似的Swing组件(只是为了能够使用自己的鼠标处理程序将它们作为一个实体来管理),或者可以是另一回事,而不必忽略这样的事实,即它应该是具有自己的动作处理程序的自治对象,并且领域。
  • 这个地图单元模型是否与一个简单的游戏正确,它将帮助我以一种有趣的方式学习Java和OOP基础知识。

  • 而已!

    最佳答案

    有两种方法。

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

  • -

    解决评论的附录

    没错,在(1)中,Map(主JPanel)实现了鼠标处理程序,并依次询问每个单元是否“命中”。这样一来,您可以做更复杂的事情,例如2个单元重叠/彼此重叠,并且两者都可以响应点击。

    同样,例如,它们可能不是矩形的,或者可能是通过Alpha通道绘制的(如果单元是JComponents,则默认情况下,它们会在整个矩形上自行捕获任何鼠标事件)。如果您的单元不重叠并且位于自己的矩形中,那么JComponent自己的鼠标处理程序就足够了。

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

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

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

    关于java - 对象在Java游戏中应该如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2664807/

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