通常你會將一些應用程序(遊戲?)的內部接口和對象暴露給mod編寫者。 mod編寫器將構建一個dll,它使用這些對象和接口來做一些有用的事情。然後,應用程序將動態加載mod dll,並在必要時調用mod實現。
另一種考慮它的方式是想象你的遊戲是一個操作系統(Windows),而你的mod是一個應用程序(Word)。操作系統提供了一些API來創建和管理窗口,應用程序在必要時使用它們。
所以,作爲一個遊戲開發你的可以創建和分發以下接口:
//mod.h
class Mod {
//takes suggested damage as an arg and returns modified damage
virtual int takeDamage(int damage);
};
,並指示用戶提供導出的函數實例化和刪除國防部對象。
實現:
//godmod.h
class GodMod : public Mod {
int takeDamage(int damage) { return 0; } // god mode!!
}
__declspec(dllexport) Mod *create_mod() { return new GodMode(); }
__declspec(dllexport) void delete_mod(Mod *mod) { delete mod; }
然後,你將不得不加載DLL(LoadLibrary
API在Windows上),出口create_mod
與GetProcAddress
API delete_mod
符號。在比賽之後的某個地方,你將實例國防部與create_mod
,並用它在需要的地方:
int damage = 100; //original damage
for (int i = 0; i < mods_count; i++) {
damage = mods[i]->tageDamage(damage);
}
decrease_health(damage);
畢竟,你將不得不與
delete_mod
從相應的DLL釋放國防部
。
編譯完成後,你會使用該函數的名稱或地址嗎? (從配置文件中)然後,您可以指定一個預定義的函數,以便從main可執行文件(如main())中進入。 – 2011-02-12 14:42:33
@Will Young - 在windows中,你不知道地址,直到DLL被加載,所以你可以通過名稱來引用這些函數。加載DLL後,您可以調用GetProcAddress將名稱轉換爲地址,以便您可以調用該函數。 – MerickOWA 2011-02-12 15:00:51