2010-07-18 161 views
-1

我想在C構建一個簡單的實體/組件系統++的基礎上的第二次回答這個問題:Best way to organize entities in a game?映射類實例

現在,我想有一個靜態的std ::地圖返回(如果可能,甚至會自動創建)。

我在想什麼是沿着線的東西:

PositionComponent *pos = systems[PositionComponent].instances[myEntityID]; 

什麼會實現,最好的方法是什麼?

+0

static is bad,mmkay? – Puppy 2010-07-18 18:49:41

+0

我同意,但讓我們假裝它不是靜態的。有沒有辦法將類映射到實例? – sharvey 2010-07-18 18:53:32

+0

PositionComponent是一個位置向量? – Albert 2010-07-18 18:54:14

回答

1

也許這樣?

std::map< std::type_info*, Something > systems; 

然後,你可以這樣做:

Something sth = systems[ &typeid(PositionComponent) ]; 

只是出於好奇,我查了一下這個C++代碼

#include <typeinfo> 
#include <cstdio> 

class Foo { 
    virtual ~Foo() {} 
}; 

int main() { 
    printf("%p\n", &typeid(Foo)); 
} 

的彙編代碼,以確保它確實是一個常數。彙編(剝離)由GCC輸出(沒有任何的優化):

.globl _main 
_main: 
LFB27: 
     pushl %ebp 
LCFI0: 
     movl %esp, %ebp 
LCFI1: 
     pushl %ebx 
LCFI2: 
     subl $20, %esp 
LCFI3: 
     call L3 
"L00000000001$pb": 
L3: 
     popl %ebx 
     leal L__ZTI3Foo$non_lazy_ptr-"L00000000001$pb"(%ebx), %eax 
     movl (%eax), %eax 
     movl %eax, 4(%esp) 
     leal LC0-"L00000000001$pb"(%ebx), %eax 
     movl %eax, (%esp) 
     call _printf 
     movl $0, %eax 
     addl $20, %esp 
     popl %ebx 
     leave 
     ret 

所以它實際上有閱讀L__ZTI3Foo$non_lazy_ptr符號(雖然我不知道這是不是恆定的 - 也許與其他編譯器選項或與其他編譯器,它是)。所以常量可能會稍微快一點(如果編譯器在編譯時看到常量),因爲您保存了讀取。

+0

我不知道bmargulies是否認爲一個理智的人會使用它。 – sharvey 2010-07-18 19:02:52

+0

那麼,我從來沒有見過任何需要將類映射到某個東西的用例。 :)但如果你想這樣做,我認爲這種解決方案沒有任何問題。或者在那裏?這應該是完全有效的C++。而且它也是有效的。 – Albert 2010-07-18 19:07:08

+0

與使用常量一樣高效嗎? – sharvey 2010-07-18 19:08:47

1

您應該創建一些常量(例如POSITION_COMPONENT = 1),然後將這些整數映射到實例。

+0

感謝您的回答,但有沒有辦法避免創建這樣的常量? – sharvey 2010-07-18 18:51:32

+0

爲什麼你不想使用常量? – Maz 2010-07-18 18:53:15

+0

來自Python/javascript/...,我只是不覺得它們特別優雅。並不是說這是避免它們的合理理由:) – sharvey 2010-07-18 18:55:22