首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多人游戏中处理能力使用的好方法?

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

Stack Overflow用户
提问于 2009-09-17 09:11:53
回答 2查看 161关注 0票数 1

我编写了一个基于client<>server的多人游戏,并完成了基础工作(这是一个用actionscript 3编写的闪存客户端)。下一步将是实现一个系统,这将使我可以轻松地增加能力的游戏。

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

  • Player A向服务器发送消息,告知
  • player A正在自己的船舶
  • 上显示一个“修复铸造”动画,服务器必须通知A船附近的所有玩家现在有了“修复铸造”动画
  • 服务器必须增加播放器B的“健康状态”,因为它已经被玩家A

<

  • >H19修复了,服务器必须通知附近所有玩家B现在具有不同的健康值H 210H 111/code>服务器必须通知附近的所有玩家,播放器B应该显示“正在修复的动画”<>H 212<代码F><代码>

这只是一个例子,很多事情都必须发生,一个简单的能力。我可以进入每个对象并为这个咒语添加代码行。然而,当我需要增加很多(~50)能力时,这会变得一团糟。还要注意的是,有些技能会比其他技能做其他的事情,有些将不得不显示动画,有些则不会,有些将不得不伤害,有些将不得不增加统计,等等。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-17 09:24:25

在客户端,没有服务器的同意,绝不能做任何事情。因此,客户端应该只发送能力和可选目标或某些值的请求。此外,客户端必须侦听服务器上的任何命令。另一方面,服务器应该实现一个或多个类(不管你感觉如何)来控制能力动作。每当客户端请求转换能力时,都应该调用能力函数。作为第一项任务,函数应该检查先决条件。如果失败,应通知客户端。否则,使用修复能力ok信号应传递给客户端。然后,该函数查找并向附近的任何船只发送所需的命令,同时更新它们的状态。这种方法将保证能力不会被客户端滥用。

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

客户端

代码语言:javascript
复制
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(); }

服务器

代码语言:javascript
复制
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");
        }
   }
}
票数 5
EN

Stack Overflow用户

发布于 2009-09-17 11:00:55

它看起来像很多东西,但它实际上只是几个标准组件的排列。大多数行动将包括改变固有的性质和一些化妆品将显示在客户端,只有少数几种不同的方式来做。

您需要以下内容:

  • 是向服务器发送操作的一种标准方法,它允许方便地提取任意参数(因为每个操作都可能有一些非常特定的参数),
  • 是从服务器到客户端的消息类型,用于在指定的船舶
  • 上播放指定的动画--从服务器到客户端的消息类型增加了

上的健康值。

然后,您提到的操作的服务器代码看起来像这个伪代码:

代码语言:javascript
复制
if (message.type == REPAIR)
{
    repairer = message.actor;
    repaired = message.target;

    // Insert verification code here to check that the 2 ships are close enough,
    // that the repairer is entitled to perform this action, etc

    // Verification has passed: do the work
    broadcastToAllClients(new Message(type=PLAY_ANIM, target=repairer, value=REPAIR_CASTED));
    broadcastToAllClients(new Message(type=CHANGE_PROPERTY, target=repaired, proerty=HEALTH, value=5)); // 5 is the amount 
    broadcastToAllClients(new Message(type=PLAY_ANIM, target=repaired, value=BEING_REPAIRED));
}

这很容易扩展到任意数量的操作,并且只需要一些额外的消息类型来适应可以更改或显示的不同内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1437661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档