簡體   English   中英

處理多人游戲中能力使用情況的好方法?

[英]Good way to handle ability usage within a multiplayer game?

我已經編寫了一個基於client <> server的多人游戲,並且已經完成了基礎知識(這是用動作腳本3編寫的Flash客戶端)。 下一步將實現一個系統,該系統將使我能夠輕松地為游戲添加功能。

這里的問題是一種能力可以做很多事情。 例如。 玩家A對玩家B使用能力“修復”,則必須進行以下操作:

  • 播放器A向服務器發送消息,通知該操作
  • 玩家A現在正在自己的飛船上顯示“修復投放”動畫
  • 服務器必須通知該船A附近的所有玩家現在具有“修復投放”動畫
  • 服務器必須增加玩家B的“健康狀況”,因為服務器A已對其進行了修復
  • 服務器必須通知所有附近的玩家B玩家現在具有不同的健康值
  • 服務器必須通知所有附近的玩家,玩家B應該顯示“正在修復”動畫

這只是一個例子,一個簡單的功能必須完成很多事情。 我可以進入每個對象,並為該咒語添加代碼行。 但是,當我需要添加很多(〜50)功能時,這將變得一團糟。 還要注意,某些能力會比其他能力做其他事情,有些則必須顯示動畫,有些則不會。 有些將不得不損壞,有些將不得不增加統計數據,等等。

那么,這種“能力系統”通常如何同時在客戶端和服務器端處理?

在客戶端,未經服務器同意絕不能做任何事情。 因此,客戶僅應發送能力和可選目標或某個值的請求。 客戶端也應該監聽服務器的任何命令。 另一方面,服務器應該實現一個函數或類(無論您覺得如何)來控制能力動作。 每當客戶請求能力轉換能力功能時,都應調用。 作為首要任務,職能部門應檢查前提條件。 如果失敗,則應通知客戶。 否則,應將使用修復能力正常信號傳遞給客戶端。 然后,該功能會在更新其狀態時查找所需的命令並將其發送給附近的任何船只。 這種方法將確保客戶不會濫用這些能力。

要了解它,請檢查以下內容,這是方法的說明,所以不要告訴我使用那么多的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");
        }
   }
}

它看起來很多東西,但實際上只是幾個標准組件的排列。 大多數動作將包括對內在特性的更改和一些要在客戶身上展示的化妝品,並且只有少數幾種不同的方法可以做到。

您需要以下內容:

  • 將動作發送到服務器的標准方法,它允許方便地提取任意參數(因為每個動作可能都有一些非常具體的參數)
  • 從服務器到客戶端的消息類型,以開始在指定的飛船上播放指定的動畫
  • 從服務器到客戶端的消息類型,增加了船上的健康值

然后,您提到的操作的服務器代碼看起來像下面的偽代碼:

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

這很容易擴展到任意數量的操作,並且只需要一些額外的消息類型即可容納可以更改或顯示的不同內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM