Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在多人游戏中处理能力使用的好方法?_Actionscript 3 - Fatal编程技术网

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

Actionscript 3 在多人游戏中处理能力使用的好方法?,actionscript-3,Actionscript 3,我已经编写了一个基于clientserver的多人游戏,并完成了基础知识(这是一个用actionscript 3编写的flash客户端)。下一步将实施一个系统,这将使我能够轻松地添加到游戏的能力 这里的问题是一种能力可以做很多事情。玩家A对玩家B使用技能“修复”,必须发生以下情况: 播放器A向服务器发送消息,通知操作 玩家A现在正在自己的飞船上播放“修复铸造”动画 服务器必须通知船A附近的所有玩家现在有“修复铸造”动画 服务器必须增加玩家B的“运行状况”,因为它已经被玩家A修复 服务器必须通知

我已经编写了一个基于clientserver的多人游戏,并完成了基础知识(这是一个用actionscript 3编写的flash客户端)。下一步将实施一个系统,这将使我能够轻松地添加到游戏的能力

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

  • 播放器A向服务器发送消息,通知操作
  • 玩家A现在正在自己的飞船上播放“修复铸造”动画
  • 服务器必须通知船A附近的所有玩家现在有“修复铸造”动画
  • 服务器必须增加玩家B的“运行状况”,因为它已经被玩家A修复
  • 服务器必须通知附近的所有玩家,玩家B现在有不同的健康值
  • 服务器必须通知附近的所有玩家,玩家B应该显示“正在修复”动画
这只是一个例子,对于一个简单的能力,很多事情都必须发生。我可以进入每一个物体,为这个法术添加代码行。然而,当我需要增加很多(~50)个技能时,这会变得一团糟。还要注意的是,有些技能可以做其他的事情,有些必须显示动画,有些则不能。有些将不得不损坏,有些将不得不增加统计数据,等等


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

在客户端,未经服务器同意,决不做任何事情。所以客户端应该只发送一个能力和一个可选目标或某个值的请求。客户机还必须监听服务器上的任何命令。另一方面,服务器应该实现一个函数或类(您觉得合适的)来控制操作。每当客户机请求强制转换功能时,都应该调用该功能。作为第一个任务,函数应该检查先决条件。如果失败,应通知客户。否则,应将使用修复能力ok信号传递给客户机。然后,该函数在更新其状态的同时,查找并向附近的任何船舶发送所需的命令。此方法将保证客户端不会滥用这些能力

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

客户 服务器
功能用户批量维修(船东){

if(owner.energy客户端的if(owner.energy在未经服务器同意的情况下从不做任何事情。因此,客户端应该只发送对某个能力和可选目标或某个值的请求。客户端还应该侦听服务器的任何命令。另一方面,服务器应该实现一个函数或类(无论您觉得舒服与否)控制能力操作。每当客户端请求能力转换时,应调用能力转换函数。作为第一项任务,函数应检查先决条件。如果先决条件失败,则应通知客户端。否则,应向客户端发送使用修复能力ok信号。然后,函数查找所需命令,并在更新他们的状态。此方法将保证客户端不会滥用这些能力

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

客户 服务器
功能用户批量维修(船东){

如果(owner.energy它看起来像很多东西,但实际上只是几个标准组件的排列。大多数操作将包括对内在属性的更改和一些化妆品在客户身上的展示,只有少数几种不同的方法可以做到这一点

您需要以下内容:

  • 向服务器发送操作的标准方式,允许方便地提取任意参数(因为每个操作可能有一些非常特定的参数)
  • 从服务器到客户端的消息类型,用于在指定的船舶上开始播放指定的动画
  • 从服务器到客户端的消息类型,增加了船上的运行状况值
然后,您提到的操作的服务器代码如下所示:

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));
}

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

它看起来像很多东西,但实际上只是几个标准组件的排列。大多数操作将包括对固有属性的更改等等我想向客户展示化妆品,但只有少数几种不同的方式可以做到这一点

您需要以下内容:

  • 向服务器发送操作的标准方式,允许方便地提取任意参数(因为每个操作可能有一些非常特定的参数)
  • 从服务器到客户端的消息类型,用于在指定的船舶上开始播放指定的动画
  • 从服务器到客户端的消息类型,增加了船上的运行状况值
然后,您提到的操作的服务器代码如下所示:

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));
}
这很容易扩展到任意数量的操作,并且只需要一些额外的消息类型来适应可以更改或显示的不同内容

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));
}