精選文章

SmallBurger Asset Home

  SmallBurger

2012年2月10日 星期五

XML與物件掛勾後的感覺真好…

在寫工具的時候,物件屬性的編輯是很麻煩的問題(要開一大堆的介面、一大堆的判斷式、繁瑣的通知事件…等等),有沒有更的的做法呢?其實有,那就是讓XML跟物件掛勾…
掛勾有什麼好處?要怎麼掛勾呢?

只參考XML最大的好處,就是可以提升可攜性,修改屬性資料不用參照到真實的物件,但修改完之後,要如何驅動物件的相關函式呢?以TinyXML為例:
pElement->SetUserData(pObject);
其中Object為最原始的類別,再為其規劃一個虛擬函式
virtual bool DoPropertyChange(const std::string& strPorpertyName, const std::string& strValue) = 0;
讓之後繼承的人去實作相關的屬性改變後,應該驅動那些表現性的函式,就可以達到這個目標。這樣一來,所有屬性的驅動方式可以封裝在各個物件,再也不用在介面寫像這樣的code了…
 CWater* pWater = SceneManager::GetSingleton().GetWater(m_iTargetObjectId);
 if(pWater)
 {
  if(strAttributeName == "Float_Size")
  {
   pWater->SetScaleFactor(CVector3(NewValue, 1.0f, NewValue));
   CVector3 Position;
   theApp.GetTestPushRipplePosition(Position);
   pWater->PushRipple(Position.m_fX, Position.m_fZ, theApp.GetTestPushRippleValue());
   return true;
  }
  else if(strAttributeName == "Int_Complexity")
  {
   pWater->ResetComplexity(NewValue);
   CVector3 Position;
   theApp.GetTestPushRipplePosition(Position);
   pWater->PushRipple(Position.m_fX, Position.m_fZ, theApp.GetTestPushRippleValue());
   return true;
  }
  else if(strAttributeName == "MaterialName")
  {
   return pWater->ResetMaterialNmae(GetStringValue(NewValue));
  }
  else if(strAttributeName == "NoiseModule")
  {
   return pWater->ResetNoiseModuleName(GetStringValue(NewValue));
  }
  else if(strAttributeName == "Bool_EnableRipple")
  {
   return pWater->ChangeRippleState(NewValue);
  }
  else if(strAttributeName == "Float_Strength")
  {
   pWater->SetStrength(NewValue);
   return true;
  }
  else if(strAttributeName == "CVector3_Position")
  {
   CVector3 Position;
   Position.ReadFromString(GetStringValue(NewValue));
   return pWater->SetPosition(Position);
  }
 }
 return false;
整個介面都清爽起來,大大降低Dependency、提升ReUse,好久沒有這麼舒服了…

4 則留言:

  1. 您好, 我也是用Ogre的開發者, 最近也遇到這狀況

    我有個核心lib提供物件給編輯器和遊戲使用
    照這篇XML榜物件的方式, 在編輯器開發上確實俐落好看
    但在遊戲時, 並不需要編輯那些XML相關的資訊, 這時反而佔了多餘的記憶體(因為不會被使用)

    這做法似乎是個trade-off? 不知道您有什麼看法?

    回覆刪除
  2. 我覺得這個部份很好處理,原則上物件仍然要提供SetPosition的函式,而DoPropertyChange這個函式是要留給編輯器call的,而在非編輯器的app時,並不用保存這一份xml,這樣應該就可以解決。

    回覆刪除
  3. 請問你們是製作輪迴unknown的人嗎?
    我好不容易從youtube上看到
    輪迴是我國中時買來玩的
    當時覺得不管畫面跟操作還有劇情都很棒!
    由於懷念所以又去網購了一次
    但是完全進不去了!
    不知是電腦太新跑不動還是怎樣
    想請問一下!

    回覆刪除
  4. 我是製作成員之一,我還有保留一片,改天我安裝起來試試,看能不能跑.


    回覆刪除