在多人游戏中处理能力使用的好方法?

Tom*_*Tom 1 actionscript-3

我编写了一个基于客户端<>服务器的多人游戏并完成了基础知识(它是一个用 actionscript 3 编写的 Flash 客户端)。下一步将是实施一个系统,让我可以轻松地为游戏添加能力。

这里的问题是一种能力可以做很多事情。例如。玩家 A 对玩家 B 使用“修复”能力,必须发生以下情况:

  • 玩家 A 向服务器发送消息通知有关该操作的信息
  • 玩家 A 现在在自己的船上显示“修复铸造”动画
  • 服务器必须通知该船 A 附近的所有玩家现在有“修复铸造”动画
  • 服务器必须增加玩家B的“健康”,因为它已被玩家A修复
  • 服务器必须通知附近的所有玩家玩家 B 现在有不同的生命值
  • 服务器必须通知附近的所有玩家玩家 B 应该显示“正在修复”动画

这只是一个例子,一个简单的能力必须发生很多事情。我可以进入每个对象并为这个咒语添加代码行。但是,当我需要添加很多(约 50 个)能力时,这会变得一团糟。另请注意,有些能力与其他能力完全不同,有些必须显示动画,有些则不会。有些将不得不损坏,有些将不得不增加统计数据等。

那么,这种“能力系统”通常是如何处理客户端和服务器端的呢?

Cem*_*ncu 5

在客户端,未经服务器同意,永远不要做任何事情。所以客户端应该只发送一个能力和一个可选目标或一些值的请求。客户端也应该监听服务器的任何命令。另一方面,服务器应该实现一个函数或类(任何你觉得舒服的)来控制能力动作。每当客户端请求能力时,应该调用能力函数。作为第一项任务,函数应该检查先决条件。如果失败,应通知客户。否则,应将使用修复能力确定信号传递给客户端。然后该功能会在更新其状态的同时查找并向附近的任何船只发送所需的命令。这种方法将保证能力不会被客户滥用。

要理解它,请检查以下内容,这是为了说明方法,所以不要告诉我使用这么多ifs不好。

客户

function massRepair() {
    server.send("USE mass_repair;"); //no decisions in here
}

function recive(command, target) {
    if(command=="USE mass_repair OK")
        massRepairAnim.gotoAndPlay(0);

    if(command=="ANIM mass_repair") {
        massRepairAnim.setTarget(target);
        massRepairAnim.gotoAndPlay(0);
    }

    if(command==/SET ENERGY [0-9]/) {
         value=getValue(command);
         setEnergy(value);
    }

    if(command==/SET HEALTH [0-9]/) {
         value=getValue(command);
         setHealth(value);
    }

    if(command=="ANIM self_repair") {
        selfRepairAnim.gotoAndPlay(0);
    }

    if(command=="USE mass_repair FAIL NOENERGY") {
        display("Not enough energy to use the skill");
    }
}

somebutton.click=function() { massRepair(); }
Run Code Online (Sandbox Code Playgroud)

服务器

function userMassRepair(Ship owner) {
    if(owner.energy<30) {
        send(owner, "USE mass_repair FAIL NOENERGY");
        return false;
    }

    owner.energy-=30;
    send(owner, "SET ENERGY "+owner.energy); //every data sent is absolute
    send(owner, "USE mass_repair OK");

   foreach(ship in owner.shipsInRange(100)) {
        if(owner.ally(ship)) {
             ship.health+=10;
             ship.send("SET HEALTH " + ship.health);
             ship.send("ANIM mass_repair "+owner.position);
             ship.send("ANIM self_repair");
        }
   }
}
Run Code Online (Sandbox Code Playgroud)