鐵之狂傲
標題:
[轉載]如何成為一位專業的遊戲程式設計師
[列印本頁]
作者:
發條人形紅舞鞋
時間:
08-7-2 10:43
標題:
[轉載]如何成為一位專業的遊戲程式設計師
轉自
http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=760&prev=786&next=726
作者 勇者大人
人格特質篇
如何成為一位專業的遊戲程式設計師,
有興趣製作遊戲的人一定會想要知道吧!
我不是要老王賣瓜,自賣自誇~
我只是想和網友們分享我的一些看法而已!
如有不當,望請海涵~
那麼,我用條例式來敘述會比較清楚~
如何成為一位專業的遊戲程式設計師 - 人格特質:
1. 要有對想要的事堅持到底的態度。
這點我想對多數人來說,很難。我的一些朋友說要學,
至今沒有一個學成的@@,全部都很快就感到困難或是說沒時間就放棄了。
這也就是遊戲程式設計師稀少的原因之一嚕~
這職務不是任何人都能來試試看的!
所以我很佩服能『對某事持續堅持到底直到完成的人』。
當然,這需要極高的『熱情』。
2. 要有學習新知的渴望,以及也願意將基礎認真打好的態度。
例如C語言和C++語言,這是很重要的基本功。
我以前曾聽過某人說『三個月就學會了C語言』(他在自誇說很簡單),
其實光會語法,那只是基礎中的基礎,若是不會『活用』,那你只能唬唬門外漢。
C是不難沒錯,但是如果你能理解『學會』和『學好』的差別,你就不會這樣說了。
如果C語言沒將『指標』學到精,那就根本不算學好~
如果C++語言沒將『多型與虛擬』學到精,那就根本不算學好~
如果你設計不出好的『程式框架』,那你的程式活用規劃能力還不行。
3. 要能不在乎花多少錢,只在乎學會技術沒...的態度。
如果你只在乎那一本幾百元的書錢,而不願意買回家學習或是保存技術資料,
隨時查詢,備而不用,那麼就能得知你的學習渴望仍然不夠喔~
或者你會說,網路上都查的到,不用花錢!
看起來好像沒錯~ 實際上。。。
如果世間真的有這麼美好的事,那技術作家,出版社現在都要倒了~
所以切記勿因小失大,『省了小錢,虧了將來能賺更多錢的能力』。
4. 要有創造力,寫遊戲沒有制式的方法,只有更好的解法。
我認為遊戲程式設計的一個很有趣的特性是,
能將『招式是死的,人是活的』這句話,發揮的淋漓盡致。
寫的久,又有規劃能力的人,或許就能開始體會到『程式的藝術』。
而要培養創造力,那就要多看書,也看創造力培養的書,多汲取非程式的專業資訊。
但也要注意,不要陷入書呆子的盲點中,理論和實務絕對要完美結合。
5. 要自信,不自大。
老實說,很多程式師其實都蠻自大的~會以為自己高高在上,懂別人所不懂的技術,
會誇說,這功能很簡單啊~沒問題!(若真的都沒問題,代表問題可大了)
再將企劃人員唬的一愣一愣的~
這很糟~
要注意『自大是成長的阻力』。
6. 要有團隊精神,大局為重。
有的程式師,會過度理想化,以為公司專案真的是自己的專案,
而一味的求技術流程上的完美,忽略公司的成本問題,行銷推廣時程問題,
而導致遊戲難產,或是嚴重耽誤進度。
很有可能會因為程式師的問題,而讓一個公司倒閉喔。
也有的跟企劃人員不合,認為我~~~這麼厲害,
為什麼要聽你這啥都不懂的小毛頭企劃呢?
乍聽之下似乎沒錯,但是有本事你就做到主管,那你就能指揮大家,
不然公司專案無法順利進展,遊戲做不出來,最後大家就和公司一起掛。
這樣你才高興嗎?
如果你是這麼私心的人,我相信你的未來發展不會太好。
7. 要廣結善緣,不耍孤僻。
通常程式師比較內向,不善於溝通,自我主觀意識很強,
非黑即白,坐井觀天,而導致容易自滿自大。
但是若能改善這些通病,則會對你的職涯發展和技術成長有很大的幫助。
怎麼說呢?這仔細說的話就太過勢利嚕~ 自己體會吧~
而且不要老是將自己的程式碼當成寶一樣,不願意和人交流程式碼,
我認為這是舊時代的思維~
現在早已是地球村,全世界資訊交換的奇快,你自以為的寶貝技術,
其實對世界而言,只是雕蟲小技而已!
能寬心的和同好多多分享討論,將能更促進你的進步。
聽不懂的人就沒辦法嚕~ 因為『氣度決定高度』。
抱歉!我沒有在影射誰喔!如有冒犯,望請海涵!
作者:
發條人形紅舞鞋
時間:
08-7-2 10:50
標題:
程式初探篇
從無到有學習遊戲程式設計的過程概念...要開始啦~
1. 先學會C語言。
不少人問過我,該如何學習遊戲程式設計,我都會建議他們先從C語言開始學起。
因為這實在是遊戲程式領域中,基礎的基礎!
或者,也有少數人早已先學習過其他語言,如HTML, Visual Basic, C#等等,那則更好,
無論如何,至少你已先有程式的概念,恭喜你將能更快的學會C語言!
學任何語言其實也都是萬變不離其宗,道理都是一樣的!
只要你學會一種程式語言,以後要再學其他語言,絕對沒問題!
我認為,學習C語言語法最重要的是
函式(Function),結構(Structure)和指標(Pointer)!
(我這裡強調的只是
語法
,還不是
應用
)
遊戲程式其實只是一堆資料結構和操作邏輯的結合。
函式就是操作邏輯。(例如角色的攻擊流程判定 / 死亡流程判定等)
結構就是資料群組。(例如角色的HP / MP等)
而指標是啥呢?這就又點複雜,又會常常讓人搞混的神兵利器!
簡單說就是...能操作和存取記憶體的東西。
詳細的說明...你還是去看書會比較清楚吧。
總之,指標學熟了,你才算學會C語言語法喔。
我以前學習時,也是被指標搞得頭昏腦脹,但是書上又說超重要,
我就一直看一直看,一直去瞭解他的特性,還特別為了學熟指標,
去買了一本
Turbo C
進階的書,裡面就有詳細介紹指標的概念,複雜應用和特殊應用!
指標的學習重點又細分為:
[1]指標 long *p;
[2]指標的指標 long **pp;
[3]指標陣列 long *pointer_array[ 10 ];
[4]陣列指標 long (*array_pointer)[ 10 ];
[5]函式指標 void (*func_pointer)( long a, long b );
[6]函式指標陣列 void (*func_pointer_array[ 10 ])( long a, long b );
這些都要徹底理解喔~
然後我也做過了很多的C語言練習,藉此測驗我的學習程度。
例如製作DOS環境下的井字遊戲,問答遊戲,地圖捲動迷宮,檔案資料庫等等。
而比較有趣的就是地圖捲動迷宮,
顧名思義就是用那些ASCII字符和陣列來做一個迷宮,
重點是他能捲動畫面,當時我可覺得很棒呢!
因為這樣就像是模擬RPG裡面的地圖和人物移動啦~
2. C++語言是撰寫大型專案的基石。
等你熟悉C語言後,你就可以繼續往C++語言邁進!
而C和C++之間有何差別呢?
簡單的說,
C的進階版就是C++。
而坊間的C/C++書籍多到不勝枚舉,那麼又該如何挑書呢?
我認為,初學者挑書時,先挑自己感覺容易看得懂的,每一本書的教法也會有所不同,
絕對不宜挑看起來太多字的,太像教科書的,這樣初學者應該沒多久就會陣亡嚕。
書店甚至還有出C語言繪本,C++語言繪本,我翻過後發現,這書設計的真棒!
很適合初學者呢!(因為圖文並茂,畫的又很可愛,將生硬的東西解釋的比較有趣)
總之,
挑適合自己的閱讀理解程度和感覺才是最重要的
!(
而高手挑書就不是這樣挑嚕
)
C++語法中,我認為務必要學好學熟的重點部份,
就是
多型與虛擬(Polymorphism / Virtual)和樣板(Template)!
而什麼是多型與虛擬呢?
這其實很難解釋...
簡單說就是...用相同的操作方法,展現不同的執行結果。
嗯~我想大家應該聽不懂,那你就去仔細研究書上的教學和範例吧~以後你就會懂了!
這是學習多型與虛擬的權威書籍:
多型與虛擬 - 侯捷 著
多型與虛擬 - 簡體版導讀
而侯捷老師又將多型與虛擬形容成
物件導向的精髓
!
你就知道這有多重要嚕!
而什麼是樣板呢?
也很難解釋...
簡單說就是...能用不同的資料型別來操作相同的方法,也能編譯時期才生成程式碼。
哇~太文言文嚕~ 那你自己去查書吧~
記住!
這兩個沒學好,你就根本無法發揮C++的特性喔!
我當初學C++後,語法會是會了,但是我無法理解用C++到底要做什麼呢?
我覺得,C語言都能實現需要的程式邏輯啊~
直到我到遊戲公司上班後,才開始徹底理解C++在大型專案上的重要性!
同時也趕快再持續惡補複習,然後實際應用在工作上。
簡單說就是...用C++設計了一個可讀性和高彈性的遊戲程式框架,
以便將來程式碼變得超多時,能夠避免發生混亂到連自己都看不懂~
若是沒做好這框架,很有可能連自己都抓不到自己搞出的眾多臭蟲(bugs)呢!
(這是真的~)
ps: 這裡可以下載免費版的
Visual C++ 2005 Expess Edition編譯器
我現在就是用這個版本~
[
本文章最後由 發條人形紅舞鞋 於 08-7-2 10:54 編輯
]
作者:
發條人形紅舞鞋
時間:
08-7-2 10:57
標題:
遊戲框架篇
繼程式初探篇說的,要學好C++後,
我現在就將我以前寫給朋友的遊戲框架事件驅動概念的範例,分享給大家!
而這是需要善用多型和虛擬喔!
遊戲框架是什麼呢?就是能夠將複雜的程式邏輯,規劃限制在容易理解的設計範圍中!
當你程式碼越寫越多越大時,就會體現出遊戲框架的重要性!
就像...如果你有一萬本書,你是否該買些書櫃並好好的規劃如何放置,對吧!
如果隨便亂丟...而又要找一本書時,這還找的到嗎?
以下只節錄程式碼中的重點部份!
這是遊戲框架最上層介面類別,一定需要被繼承!
//=================================================================
class Event_Driven_Base // 事件驅動介面
{
public :
virtual ~Event_Driven_Base(){}
// 事件驅動函式
virtual void vOnInitiate() {};
virtual void vOnInitiate2() {};
virtual void vOnInitiate3() {};
virtual void vOnNormalUpdate() {};
virtual void vOnInRectScope() {};
virtual void vOnExitInRectScopeOfUpdate() {};
virtual void vOnMouseLeftDown() {};
virtual void vOnMouseRightDown() {};
virtual void vOnMouseLeftUp() {};
virtual void vOnMouseRightUp() {};
virtual void vOnMouseLeftDB() {};
virtual void vOnMouseKeyboardDown( long keyboard_code ){};
virtual void vOnAfterPressUpdate() {};
virtual void vOnShow() {};
virtual void vOnTerminate() {};
};
// 這是框架的共用中間層類別,目的是將有些能泛用的功能和變數放置於此!
// 達到資源再利用的目的!
class Common_Obj_Base : public Event_Driven_Base // 子物件基礎類別
{
public :
long Number;
RECT RectScope;
POINT NowPos;
long Parameter;
Common_Obj_Base();
// 事件驅動函式
virtual void vOnNormalUpdate() ;
virtual void vOnShow() ;
};
// 由於這是個示範用的範例,所以我建立一個testObj來演示事件驅動!
// 此類別擴展了vOnNormalUpdate, vOnMouseLeftDown,
// vOnMouseRightDown和vOnShow函式!
// 所以使用者就可以將遊戲邏輯撰寫於此!非常的直覺化!
class testObj : public Common_Obj_Base // 子物件類別
{
public :
long Counter;
testObj();
// 事件驅動函式
virtual void vOnNormalUpdate() ;
virtual void vOnMouseLeftDown() ;
virtual void vOnMouseRightDown() ;
virtual void vOnShow() ;
};
//=================================================================
// 以此範例中,就是將Common_Obj_Base物件,用AddObj函式來加入管理機制,
// 然後藉由Decision來執行事件函式觸發判斷,
// 再通過Show來顯示最後的執行結果!
// 請各位仔細研究程式碼!體會我的設計含意!
class Event_Driven_Manager : public DynamicArrayClass // 子物件管理者基礎類別
{
public :
~Event_Driven_Manager();
BOOL AddObj( void *object );
void Decision( long mouse_x, long mouse_y, _MOUSE_STATE_TYPE_ mouse_type );
void Show();
};
// 邏輯執行判斷,來決定要呼叫哪個事件驅動函式
void Event_Driven_Manager::Decision( long mouse_x, long mouse_y, _MOUSE_STATE_TYPE_ mouse_type )
{
POINT mouse_pos = { mouse_x, mouse_y };
Common_Obj_Base *obj = NULL;
for( DWORD n = 0; n < GetUseCount(); n++ )
{
obj = (Common_Obj_Base *)Get( n );
if( ! obj )
continue;
if( mouse_type == MOUSE_STATE_NULL )
obj->vOnNormalUpdate();
else if( Decision_Is_In_Rect_Scope( obj->RectScope, mouse_pos ) )
{
switch( mouse_type )
{
case MOUSE_STATE_LEFT_DOWN :
{
obj->vOnMouseLeftDown();
break;
}
case MOUSE_STATE_RIGHT_DOWN :
{
obj->vOnMouseRightDown();
break;
}
case MOUSE_STATE_DB_LEFT_DOWN :
{
obj->vOnMouseLeftDB();
break;
}
case MOUSE_STATE_LEFT_UP :
{
obj->vOnMouseLeftUp();
break;
}
case MOUSE_STATE_RIGHT_UP :
{
obj->vOnMouseRightUp();
break;
}
}
obj->vOnAfterPressUpdate();
}
}
}
// 最後執行vOnShow將畫面輸出
void Event_Driven_Manager::Show()
{
Common_Obj_Base *obj = NULL;
for( DWORD n = 0; n < GetUseCount(); n++ )
{
obj = (Common_Obj_Base *)Get( n );
if( ! obj )
continue;
obj->vOnShow();
}
}
複製代碼
好的!此範例適用在動畫物件管理上,
當然其他種類的物件管理概念也是由此延伸出去!
而以上只是節錄重點,我想光這樣看...很難清楚理解!
以下是此範例的程式碼,有興趣研究的人可以下載看看喔!
程式碼下載:
我的遊戲事件驅動框架示範程式碼下載連結
事件驅動概念,簡單說就是有一個物件管理類別,它運用多型和虛擬機制
來負責控制所有子物件的事件觸發!
而子物件的事件函式就是撰寫各遊戲程式碼的地方!
這能夠大幅加速程式的開發以及邏輯思考上的便利!
這種概念可以運用在哪呢!
例如:
1. 動畫物件管理
遊戲中的人物角色,射出去的魔法,子彈等,就是一種動畫物件,
而眾多不同的物件,也需要有各自的物件管理者來好好管理!
2. 遊戲視窗管理
遊戲中一定有眾多的介面,而這就需要有良好的視窗管理者來管理!
不然,你的程式碼只會越寫越亂喔!最後會大到自己都不想維護了!
3. 只要符合這事件驅動精神的地方都可以!
我運用這個概念設計遊戲已經很久嚕~
這確實在實務上有莫大的幫助喔!
這個設計模式的重點是在於事件導向驅動的核心精神,而不是在於程式語法喔!
只要核心精神相同,你要用任何方式實現都可以!
(只不過...多型與虛擬能很方便的實現這種設計模式)
如果新手看不懂,不理解也沒關係,
暫時不用也都沒關係,沒有一定要這樣才能寫程式。
但只要你多多的練習寫,將來自然會懂得這個方法的!
而這也是邁向撰寫大型專案的超級重要能力喔!
作者:
路.里美亞克
時間:
08-7-2 11:43
「大學學過指標 到現在教書十幾年了 我到現在還是不怎麼會寫指標」
以上出自小路的演算法教授之口
補充:
多型:一個函式能用多種方式呼叫 能提升函式活用度
虛擬:動態聯結的實作 不需撰寫複雜的指令就可以使用不同的功能
樣板:與class(類別)類似 只是更加嚴謹而且更加方便
我本身學資工的
不過C++剛好學到多型前面學期就結束了
指標也不是很會
接下來都只跟虛擬碼打混
C++已經很久沒開了=___=
不過光是C++之類的只能做相當簡單的東西
要做出個有樣子的遊戲
還要學習類似資料庫等處理資料的方式會比較好
光憑C++寫的出來
只是會很累是真的
歡迎光臨 鐵之狂傲 (https://gamez.com.tw/)