【獨立遊戲製做人】領先業界3年的遊戲開發技術——業務邏輯持久化

概述:

本文介紹一種「邏輯持久化技術」。目的是進一步提高代碼複用程度。主要應用場景在遊戲中,例如人物角色升級、事物隊列冷卻等。前端

 

 

前言:

開發遊戲中,常常看到一些業務邏輯類似,可是又沒法複用的代碼。例如升級。react

 

英雄:每100點經驗升級1級。程序員

騎寵:每100點經驗升級1星,每12星升級一級。數據庫

 

若是用傳統的設計思路,會獲得如下代碼片斷:編程

 

USR_HERO
{
  public int exp;
  public int level;
}
UsrHeroDao
{
  public boolean upgrade( USR_HERO hero, int exp)
  {
    hero.exp += exp;
    if (hero.exp >= MAX_EXP)
    {
      hero.exp = MAX_EXP - hero.exp;
      hero.level += 1;
    }
  }
}

 

 

若是是寵物,就寫一套寵物的升級代碼。這種代碼開發多了,就開始以爲煩,可是不認真看又會出Bug。咱們程序員尼瑪怎麼能天天都重複的幹着這些無聊的事情??後端

 

因而我開始左思右想,若是這些能力是模塊,一個對象安裝了這個模塊,就具有了升級的能力,那我就不用開發了啊。多爽??不斷的左思右想,曾經還半夜在家裏的大廳摸黑轉來轉去,大腦不斷構造着各類架構,又不斷的被推翻。架構

 

終於,有一天, 我走在回家的路上的時候,給我想到了!!!app

PS: 各位看解決方案的時候,也能夠稍微1分鐘思考下上面的問題)this

 

核心思路:

首先要分析爲何代碼不能複用。由於升級的經驗值是值類型對象!這個就是一切的根源本質。能夠想象下,若是把對象的經驗、等級放入方法內運算,實際上對象的值是沒有受到影響的,由於按值傳遞被拷貝了一份。spa

 

因此???把值類型轉成對象類型,忽然間一切都柳暗花明了。例如:

 

OrmInt
{
  public int value;
}
USR_HERO
{
  public OrmInt exp;
  public OrmInt level;
}

 

 

看到這裏,你們是否忽然間明白了?忽然間以爲高端大氣上檔次了?尼瑪這但是我奮戰幾天的結果。我相信我不說,業界起碼3年內不會有人往這個方向思考(臭美一下,各位大俠手下留情,千萬別噴我。。。。。)

 

如今我把升級的方法修改一下:

 

UsrHeroDao
{
  public boolean upgrade(OrmInt exp, OrmInt level, int exp)
  {
    exp.value += exp;
    If(exp.value >= MAX_EXP)
    {
      exp.value = MAX_EXP - exp;
      level.value += 1; 
    }
  }
}

 

 

怎樣?是否是以爲爽了不少。

案例:

爲了進一步說明這個「邏輯持久化」如何的高端,我舉個我實際使用的例子, 使用了簡化代碼:

 

// 爲OrmInt增長一個可升級的方法,返回升級對象。
OrmInt
{
  public OrmUpgradable ugprade(OrmInt upgradeValue, OrmUpgradeLimit upgradeLimited)
  {
    OrmUpgradable value = new OrmUpgradable(this, value, ugpradeLimited);
  }
}

// 升級對象,支持鏈式編程,實現升級觸發下一升級的效果
OrmUpgradable
{
  private OrmInt value; // 被升級的對象
  private OrmInt upgradeValue; // 當前升級的值
  private OrmUpgradeLimit upgradeLImited; // 升級的上限對象
  private OrmUpgradable head; // 鏈式升級的頭
  private OrmUpgrade child; // 鏈式升級的尾
  
  // 觸發下一個升級
  public OrmUpgradable upgrade(OrmInt value, OrmInt upgradeValue, OrmUpgradeLimit upgradeLimited)
  {
    OrmUpgradable orm = new OrmUpgradable(value, upgradeValue, upgradeLimited);
    orm.head = this.head;
    this.child = orm;
    return orm;
  }
  
  // 開始升級
  public boolean doWhile()
  {
    // 不斷循環升級
    if(this.value.greatThan(0))
    {
      // 當前的升級上限
      int upgradeLimited = this.upgradeLimited.getUpgradeLimit();
      // 計算可升級的值的部分 並升級
      int incValue = min(upgradeLimited.substract(this.value), upgradeValue);
      this.value.increase(incValue);
  
      //判斷是否升級
      if(this.value.greatEqualThan(upgradeLimit))
      {
        // 鏈式觸發後續的升級
        if(!this.child.doWhile())
          return true;
      }
  
      // 更新剩餘可升級部分
      upgradeValue.update(upgradeValue.substract(incValue));
      this.value.update(0);
    }
  
  return true;
  
  }
}

 

 

 

使用方法:

p.value.upgrade(11, 10)

.upgrade(p.value2, 1, 10)

.upgrade(p.value3, 1, 10)

.doWhile()

 

這段代碼用起來簡單,可是原理有點複雜。

  • 首先這是個鏈式升級。當exp值增長到達了最大值,則觸發下個對象level進行增長,一直觸發到最後。而後一個循環。
  • 其次,exp不斷升級,直到可升級的值用完了。感受就像一個儲水池。
  • 最後,升級上限我用了一個對象OrmUpgradeLimit,緣由是實際項目中,當用戶的等級不一樣的時候,當前等級經驗值上限是不同的。因此OrmUpgradeLimit實際上內部包含了level這個對象。而因爲level類型對象,所以在升級過程當中,升級上限是動態變化的。

 

小結:

本文拋磚引玉,介紹了一種很是強大的「業務邏輯持久化」技術。本質就是值類型轉對象類型;對象類型除了包含數據外,並帶上處理方法。

這樣,這個對象複製給了OrmOrm就具有了對應的能力。因此我命名爲「業務邏輯持久化」,由於我把邏輯放在了持久層。

 

擴展閱讀: 

實際上如今的業務邏輯操做,都是圍繞着數據。

邏輯更確切的說,就是圍繞相互有關聯的數據字段進行邏輯操做。 思惟發散下,就明白。這個已經不是對某個對象進行操做了。

英雄有經驗等級、坐騎也有經驗等級,可是升級這個操做其實是針對經驗和等級這2個數據創建關係,而不是英雄和坐騎。

這個技術國外叫作:functional reactive programming
Hudak, Paul (September 1989). "Conception, evolution, and application of functional programming languages" (PDF). ACM Computing Surveys 21 (3): 359–411. doi:10.1145/72551.72554.

 

下期預告:

領先業界3年的遊戲開發技術——頂級數據庫持久層的設計。

目前最流行的數據庫持久層是什麼?Hibernate?ADO.NET?不,Hibernate從出生開始,我就以爲他實在太落後了。歡迎關注6月份的主題——頂級數據庫持久層設計。

 

關於咱們:

咱們來自Pixysoft獨立遊戲製做人。咱們的目標是培養早就遊戲行業的獨立製做人,提供一切相關的技術文檔資料,從前端到後端、策劃、數值、美術全方位進行培養。

歡迎加入咱們的羣:95755843

本羣每個月1~10日爲開放日,不限條件加入。11~30日爲閉關日,除了成員邀請外,不對外開放,進行封閉培訓。

本羣關注的是思想的交流,其次藉助開源平臺共享資源。

歡迎遊戲愛好者加入。

相關文章
相關標籤/搜索