鐵之狂傲

 取回密碼
 註冊
搜尋

無名的勇者

天繾寶寶說你好

切換到指定樓層
1#


人格特質篇

如何成為一位專業的遊戲程式設計師,
有興趣製作遊戲的人一定會想要知道吧!
我不是要老王賣瓜,自賣自誇~
我只是想和網友們分享我的一些看法而已!
如有不當,望請海涵~

那麼,我用條例式來敘述會比較清楚~


如何成為一位專業的遊戲程式設計師 - 人格特質:

1. 要有對想要的事堅持到底的態度。
  這點我想對多數人來說,很難。我的一些朋友說要學,
  至今沒有一個學成的@@,全部都很快就感到困難或是說沒時間就放棄了。
  這也就是遊戲程式設計師稀少的原因之一嚕~
  這職務不是任何人都能來試試看的!
  所以我很佩服能『對某事持續堅持到底直到完成的人』。
  當然,這需要極高的『熱情』。

2. 要有學習新知的渴望,以及也願意將基礎認真打好的態度。
  例如C語言和C++語言,這是很重要的基本功。
  我以前曾聽過某人說『三個月就學會了C語言』(他在自誇說很簡單),
  其實光會語法,那只是基礎中的基礎,若是不會『活用』,那你只能唬唬門外漢。
  C是不難沒錯,但是如果你能理解『學會』和『學好』的差別,你就不會這樣說了。
  如果C語言沒將『指標』學到精,那就根本不算學好~
  如果C++語言沒將『多型與虛擬』學到精,那就根本不算學好~
  如果你設計不出好的『程式框架』,那你的程式活用規劃能力還不行。

3. 要能不在乎花多少錢,只在乎學會技術沒...的態度。
  如果你只在乎那一本幾百元的書錢,而不願意買回家學習或是保存技術資料,
  隨時查詢,備而不用,那麼就能得知你的學習渴望仍然不夠喔~
  或者你會說,網路上都查的到,不用花錢!
  看起來好像沒錯~ 實際上。。。
  如果世間真的有這麼美好的事,那技術作家,出版社現在都要倒了~
  所以切記勿因小失大,『省了小錢,虧了將來能賺更多錢的能力』。

4. 要有創造力,寫遊戲沒有制式的方法,只有更好的解法。
  我認為遊戲程式設計的一個很有趣的特性是,
  能將『招式是死的,人是活的』這句話,發揮的淋漓盡致。
  寫的久,又有規劃能力的人,或許就能開始體會到『程式的藝術』。
  而要培養創造力,那就要多看書,也看創造力培養的書,多汲取非程式的專業資訊。
  但也要注意,不要陷入書呆子的盲點中,理論和實務絕對要完美結合。

5. 要自信,不自大。
  老實說,很多程式師其實都蠻自大的~會以為自己高高在上,懂別人所不懂的技術,
  會誇說,這功能很簡單啊~沒問題!(若真的都沒問題,代表問題可大了)
  再將企劃人員唬的一愣一愣的~ 
  這很糟~
  要注意『自大是成長的阻力』。

6. 要有團隊精神,大局為重。
  有的程式師,會過度理想化,以為公司專案真的是自己的專案,
  而一味的求技術流程上的完美,忽略公司的成本問題,行銷推廣時程問題,
  而導致遊戲難產,或是嚴重耽誤進度。
  很有可能會因為程式師的問題,而讓一個公司倒閉喔。
  也有的跟企劃人員不合,認為我~~~這麼厲害,
  為什麼要聽你這啥都不懂的小毛頭企劃呢?
  乍聽之下似乎沒錯,但是有本事你就做到主管,那你就能指揮大家,
  不然公司專案無法順利進展,遊戲做不出來,最後大家就和公司一起掛。
  這樣你才高興嗎?
  如果你是這麼私心的人,我相信你的未來發展不會太好。

7. 要廣結善緣,不耍孤僻。
  通常程式師比較內向,不善於溝通,自我主觀意識很強,
  非黑即白,坐井觀天,而導致容易自滿自大。
  但是若能改善這些通病,則會對你的職涯發展和技術成長有很大的幫助。
  怎麼說呢?這仔細說的話就太過勢利嚕~ 自己體會吧~
  而且不要老是將自己的程式碼當成寶一樣,不願意和人交流程式碼,
  我認為這是舊時代的思維~
  現在早已是地球村,全世界資訊交換的奇快,你自以為的寶貝技術,
  其實對世界而言,只是雕蟲小技而已!
  能寬心的和同好多多分享討論,將能更促進你的進步。
  聽不懂的人就沒辦法嚕~ 因為『氣度決定高度』。


抱歉!我沒有在影射誰喔!如有冒犯,望請海涵!
 
轉播0 分享0 收藏0

回覆 使用道具 檢舉

無名的勇者

天繾寶寶說你好

程式初探篇

從無到有學習遊戲程式設計的過程概念...要開始啦~

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 編輯 ]
 

回覆 使用道具 檢舉

無名的勇者

天繾寶寶說你好

遊戲框架篇

繼程式初探篇說的,要學好C++後,
我現在就將我以前寫給朋友的遊戲框架事件驅動概念的範例,分享給大家!
而這是需要善用多型和虛擬喔!
遊戲框架是什麼呢?就是能夠將複雜的程式邏輯,規劃限制在容易理解的設計範圍中!
當你程式碼越寫越多越大時,就會體現出遊戲框架的重要性!
就像...如果你有一萬本書,你是否該買些書櫃並好好的規劃如何放置,對吧!
如果隨便亂丟...而又要找一本書時,這還找的到嗎?


以下只節錄程式碼中的重點部份!


這是遊戲框架最上層介面類別,一定需要被繼承!
  1. //=================================================================
  2. class Event_Driven_Base // 事件驅動介面
  3. {
  4. public :
  5.   virtual ~Event_Driven_Base(){}

  6.    // 事件驅動函式
  7.    virtual void vOnInitiate() {};
  8.    virtual void vOnInitiate2() {};
  9.    virtual void vOnInitiate3() {};
  10.    virtual void vOnNormalUpdate() {};
  11.    virtual void vOnInRectScope() {};
  12.    virtual void vOnExitInRectScopeOfUpdate() {};
  13.    virtual void vOnMouseLeftDown() {};
  14.    virtual void vOnMouseRightDown() {};
  15.    virtual void vOnMouseLeftUp() {};
  16.    virtual void vOnMouseRightUp() {};
  17.    virtual void vOnMouseLeftDB() {};
  18.    virtual void vOnMouseKeyboardDown( long keyboard_code ){};
  19.    virtual void vOnAfterPressUpdate() {};
  20.    virtual void vOnShow() {};
  21.    virtual void vOnTerminate() {};
  22. };

  23. // 這是框架的共用中間層類別,目的是將有些能泛用的功能和變數放置於此!
  24. // 達到資源再利用的目的!
  25. class Common_Obj_Base : public Event_Driven_Base // 子物件基礎類別
  26. {
  27. public :
  28.    long Number;
  29.    RECT RectScope;
  30.    POINT NowPos;
  31.    long Parameter;

  32.    Common_Obj_Base();

  33.    // 事件驅動函式
  34.    virtual void vOnNormalUpdate() ;
  35.    virtual void vOnShow() ;
  36. };

  37. // 由於這是個示範用的範例,所以我建立一個testObj來演示事件驅動!
  38. // 此類別擴展了vOnNormalUpdate, vOnMouseLeftDown,
  39. // vOnMouseRightDown和vOnShow函式!
  40. // 所以使用者就可以將遊戲邏輯撰寫於此!非常的直覺化!
  41. class testObj : public Common_Obj_Base // 子物件類別
  42. {
  43. public :
  44.    long Counter;

  45.    testObj();

  46.    // 事件驅動函式
  47.    virtual void vOnNormalUpdate() ;
  48.    virtual void vOnMouseLeftDown() ;
  49.    virtual void vOnMouseRightDown() ;
  50.    virtual void vOnShow() ;
  51. };

  52. //=================================================================
  53. // 以此範例中,就是將Common_Obj_Base物件,用AddObj函式來加入管理機制,
  54. // 然後藉由Decision來執行事件函式觸發判斷,
  55. // 再通過Show來顯示最後的執行結果!
  56. // 請各位仔細研究程式碼!體會我的設計含意!
  57. class Event_Driven_Manager : public DynamicArrayClass // 子物件管理者基礎類別
  58. {
  59. public :
  60.    ~Event_Driven_Manager();

  61.    BOOL AddObj( void *object );
  62.    void Decision( long mouse_x, long mouse_y, _MOUSE_STATE_TYPE_ mouse_type );
  63.    void Show();
  64. };

  65. // 邏輯執行判斷,來決定要呼叫哪個事件驅動函式
  66. void Event_Driven_Manager::Decision( long mouse_x, long mouse_y, _MOUSE_STATE_TYPE_ mouse_type )
  67. {
  68.    POINT mouse_pos = { mouse_x, mouse_y };
  69.    Common_Obj_Base *obj = NULL;
  70.    for( DWORD n = 0; n < GetUseCount(); n++ )
  71.    {
  72.      obj = (Common_Obj_Base *)Get( n );
  73.      if( ! obj )
  74.        continue;
  75.      if( mouse_type == MOUSE_STATE_NULL )
  76.        obj->vOnNormalUpdate();
  77.      else if( Decision_Is_In_Rect_Scope( obj->RectScope, mouse_pos ) )
  78.      {
  79.        switch( mouse_type )
  80.        {
  81.        case MOUSE_STATE_LEFT_DOWN :
  82.        {
  83.          obj->vOnMouseLeftDown();
  84.          break;
  85.        }
  86.        case MOUSE_STATE_RIGHT_DOWN :
  87.        {
  88.          obj->vOnMouseRightDown();
  89.          break;
  90.        }
  91.        case MOUSE_STATE_DB_LEFT_DOWN :
  92.        {
  93.          obj->vOnMouseLeftDB();
  94.          break;
  95.        }
  96.        case MOUSE_STATE_LEFT_UP :
  97.        {
  98.          obj->vOnMouseLeftUp();
  99.          break;
  100.        }
  101.        case MOUSE_STATE_RIGHT_UP :
  102.        {
  103.          obj->vOnMouseRightUp();
  104.          break;
  105.        }
  106.        }
  107.        obj->vOnAfterPressUpdate();
  108.      }
  109.    }
  110. }

  111. // 最後執行vOnShow將畫面輸出
  112. void Event_Driven_Manager::Show()
  113. {
  114.    Common_Obj_Base *obj = NULL;
  115.    for( DWORD n = 0; n < GetUseCount(); n++ )
  116.    {
  117.      obj = (Common_Obj_Base *)Get( n );
  118.      if( ! obj )
  119.      continue;

  120.      obj->vOnShow();
  121.    }
  122. }
複製代碼
好的!此範例適用在動畫物件管理上,
當然其他種類的物件管理概念也是由此延伸出去!
而以上只是節錄重點,我想光這樣看...很難清楚理解!


以下是此範例的程式碼,有興趣研究的人可以下載看看喔!
程式碼下載:我的遊戲事件驅動框架示範程式碼下載連結


事件驅動概念,簡單說就是有一個物件管理類別,它運用多型和虛擬機制
來負責控制所有子物件的事件觸發!
而子物件的事件函式就是撰寫各遊戲程式碼的地方!
這能夠大幅加速程式的開發以及邏輯思考上的便利!

這種概念可以運用在哪呢!

例如:
1. 動畫物件管理
遊戲中的人物角色,射出去的魔法,子彈等,就是一種動畫物件,
而眾多不同的物件,也需要有各自的物件管理者來好好管理!

2. 遊戲視窗管理
遊戲中一定有眾多的介面,而這就需要有良好的視窗管理者來管理!
不然,你的程式碼只會越寫越亂喔!最後會大到自己都不想維護了!

3. 只要符合這事件驅動精神的地方都可以!


我運用這個概念設計遊戲已經很久嚕~
這確實在實務上有莫大的幫助喔!
這個設計模式的重點是在於事件導向驅動的核心精神,而不是在於程式語法喔!
只要核心精神相同,你要用任何方式實現都可以!
(只不過...多型與虛擬能很方便的實現這種設計模式)

如果新手看不懂,不理解也沒關係,
暫時不用也都沒關係,沒有一定要這樣才能寫程式。
但只要你多多的練習寫,將來自然會懂得這個方法的!
而這也是邁向撰寫大型專案的超級重要能力喔!
 

回覆 使用道具 檢舉

超級版主

斬斷阻礙我的一切

Rank: 4Rank: 4Rank: 4Rank: 4

「大學學過指標 到現在教書十幾年了 我到現在還是不怎麼會寫指標」

以上出自小路的演算法教授之口


補充:

多型:一個函式能用多種方式呼叫 能提升函式活用度

虛擬:動態聯結的實作 不需撰寫複雜的指令就可以使用不同的功能

樣板:與class(類別)類似 只是更加嚴謹而且更加方便


我本身學資工的

不過C++剛好學到多型前面學期就結束了

指標也不是很會

接下來都只跟虛擬碼打混

C++已經很久沒開了=___=

不過光是C++之類的只能做相當簡單的東西

要做出個有樣子的遊戲

還要學習類似資料庫等處理資料的方式會比較好

光憑C++寫的出來

只是會很累是真的

回覆 使用道具 檢舉

你需要登入後才可以回覆 登入 | 註冊

存檔|手機版|聯絡我們|新聞提供|鐵之狂傲

GMT+8, 24-11-2 18:34 , Processed in 0.026357 second(s), 20 queries , Gzip On.

回頂部