我编写了一个基于client<>server的多人游戏,并完成了基础工作(这是一个用actionscript 3编写的闪存客户端)。下一步将是实现一个系统,这将使我可以轻松地增加能力的游戏。
这里的问题是一个能力能做这么多事情。例如:玩家A对玩家B使用能力“修理”,以下情况必须发生:
<
H 210H 111/code>服务器必须通知附近的所有玩家,播放器B应该显示“正在修复的动画”<>H 212<代码F><代码>这只是一个例子,很多事情都必须发生,一个简单的能力。我可以进入每个对象并为这个咒语添加代码行。然而,当我需要增加很多(~50)能力时,这会变得一团糟。还要注意的是,有些技能会比其他技能做其他的事情,有些将不得不显示动画,有些则不会,有些将不得不伤害,有些将不得不增加统计,等等。
那么,这种“能力系统”通常是如何处理客户端和服务器端的呢?
发布于 2009-09-17 09:24:25
在客户端,没有服务器的同意,绝不能做任何事情。因此,客户端应该只发送能力和可选目标或某些值的请求。此外,客户端必须侦听服务器上的任何命令。另一方面,服务器应该实现一个或多个类(不管你感觉如何)来控制能力动作。每当客户端请求转换能力时,都应该调用能力函数。作为第一项任务,函数应该检查先决条件。如果失败,应通知客户端。否则,使用修复能力ok信号应传递给客户端。然后,该函数查找并向附近的任何船只发送所需的命令,同时更新它们的状态。这种方法将保证能力不会被客户端滥用。
为了理解它,检查下面的内容,这是为了说明这个方法,所以不要告诉我使用这么多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(); }服务器
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");
}
}
}发布于 2009-09-17 11:00:55
它看起来像很多东西,但它实际上只是几个标准组件的排列。大多数行动将包括改变固有的性质和一些化妆品将显示在客户端,只有少数几种不同的方式来做。
您需要以下内容:
上的健康值。
然后,您提到的操作的服务器代码看起来像这个伪代码:
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));
}这很容易扩展到任意数量的操作,并且只需要一些额外的消息类型来适应可以更改或显示的不同内容。
https://stackoverflow.com/questions/1437661
复制相似问题