gpt4 book ai didi

oop - 游戏开发中的面向对象应用问题

转载 作者:行者123 更新时间:2023-12-04 04:23:27 24 4
gpt4 key购买 nike

关于这个问题,我会尽可能直接,因为结构化编程背景中肯定有一些我完全错过的东西。

假设我有一个 Player 类(class)。这个 Player 类做一些事情,比如改变它在游戏世界中的位置。我将此方法称为 warp(),它以一个 Position 类实例作为参数来修改 Player 的内部位置。这在 OO 方面对我来说完全有意义,因为我要求玩家“做”一些事情。

当我除了修改球员位置之外还需要做其他事情时,问题就出现了。例如,假设我需要将该扭曲事件发送给在线游戏中的其他玩家。该代码是否也应该在 Player 的 warp() 方法中?如果不是,那么我会想象在 Server 类中声明某种辅助方法,例如 warpPlayer(player, position)。这样做似乎会减少玩家对自己作为一系列 getter 和 setter 所做的一切,还是我在这里错了?这是完全正常的事情吗?我已经读过无数次了,将所有内容公开为一系列 getter/setter 的类表明抽象非常差(被用作数据结构而不是类)。

当您需要持久化数据并将其保存到文件时,也会出现同样的问题。由于将播放器“保存”到文件与 Player 类处于不同的抽象级别,因此在播放器类中具有 save() 方法是否有意义?如果没有,像 savePlayer(player) 这样在外部声明它意味着 savePlayer 方法需要一种方法来从 Player 类中获取它需要的每条数据,这最终会暴露该类的整个私有(private)实现。

因为 OOP 是当今最常用的设计方法(我假设?),所以我在这些问题上一定缺少一些东西。我已经与同样从事轻量级开发的同行讨论过,他们也遇到了与 OOP 完全相同的问题。也许正是结构化编程背景使我们无法理解 OOP 的全部好处,而不仅仅是提供设置和获取私有(private)数据的方法,以便从一个地方对其进行更改和检索。

在此先感谢,希望我听起来不会太像个白痴。对于那些真正需要了解这种设计所涉及的语言的人来说,它是服务器端的 Java 和客户端的 ActionScript 3。

最佳答案

我建议你不要害怕这样一个事实,玩家将是一类 setter/getter 和二传手。到底什么是对象?它是属性和行为的汇编。事实上,您的类越简单,您在开发过程中获得的 OOP 好处就越多。

我会将您的任务/功能分解为如下类:

玩家:

  • 有生命值属性
  • 有位置属性
  • 可以walkTo(位置),触发“walk”事件
  • 可以治愈(生命值)
  • 可以承受伤害(生命值),触发“isHurt”事件
  • 可以检查是否还活着,例如 isAlive() 方法

  • Fighter 扩展了 Player(您应该能够在需要时将 Player 转换为 Fighter):
  • 有力量和其他战斗参数来计算伤害
  • 可以攻击()触发“攻击”事件

  • 世界跟踪所有玩家:
  • 监听“步行”事件(并防止非法移动)
  • 监听“isHurt”事件(并检查它们是否还活着)

  • Battle 处理两个战士之间的战斗:
  • 以两个战士为参数的构造函数(您只想构建真正互相战斗的玩家之间的战斗)
  • 监听双方玩家的“攻击”事件,计算伤害,并执行防御玩家的 takeDamage 方法

  • PlayerPersister 扩展了 AbstractPersister:
  • 将玩家状态保存在数据库中
  • 从数据库中恢复玩家状态

  • 当然,你的游戏崩溃会复杂得多,但我希望这能帮助你开始以“更多 OOP”的方式思考问题 :)

    关于oop - 游戏开发中的面向对象应用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1962074/

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