2016年5月15日 星期日

用C++寫2D捲軸射擊遊戲

緣起:
學習C++多年,一直想自己寫個game,近日寫game的background knowledge已趨完整俱備,就寫了一個2D垂直向捲軸射擊game雛型,中文就叫"射擊就對了",這個game已具備2D捲軸射擊基本要素:我機(目前設定是無敵狀態)/敵機/子彈/場景/音效,目前改進的空間還很大,日後會補上計分系統/吃彈藥包等等,大家可以參考這個雛型修改成自己想要的模樣,本篇blog有不足之處,日後補上,請注意引用本篇blog不必註明出處,但程式的部分是參考網路上的資料而修改的,請注意智慧財產權,

程式參考網站:
1.C++實務班(http://garfstudio.blogspot.tw/2015/12/cyoutube.html),
2.DirectX教學網站(http://www.rastertek.com/dx11tut14.html),

程式細節:
1.我機/敵機/子彈:這部分的程式是參考底下這個網站修改而成:
http://garfstudio.blogspot.tw/2015/12/cyoutube.html
這位作者(Gary Lin老師)在youtube有放上完整教學影片_C++程式設計:(https://www.youtube.com/channel/UC6kvAnrYEXwE4tVG8zOdWvw),
建議初學者請先完整看完全部29小時的課程(29部影片),所以這部分程式不多作解釋,

2.背景捲軸:原本從天文網站抓一張星象圖裁成800*600的24-bit BMP無縫圖,每次向上捲動幾個pixel,結果原先只有白背景+我機+敵機+子彈時的fps還有1k~2k,加上背景後只剩4,最後換另一種做法,將背景圖切成10x10的小矩形,由這些小矩形來構成背景圖,然後每次捲動一列,fps可提升到幾百,但目前暫時限制住fps為30左右,

3.音效:由C++實務班的youtube影片中得知簡單播放音樂的函數是playsound(),但無法同時播放兩種以上的音效(這叫混音),在第一個背景音樂(重複播放)播放時,又播放第二個音效檔,會導致第一個音效停止播放,微軟論壇有人問過這個問題:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/de87d08e-dab6-4b4e-948a-3ef4142b7e04/how-could-i-mutiple-sounds-with-playsound?forum=vclanguage,
有人提出Direct Sound(DirectX SDK的一部份)這組api可以做出"混音"效果,先抓微軟官網的DirectX SDK回來安裝,其實只要安裝include(標頭檔)跟Lib即可讓程式編譯,在網路上有找到教學網站(DirectX教學網站:http://www.rastertek.com/dx11tut14.html),拿範例程式(soundclass.h,soundclass.cpp)來改成同時播三個音效,這三個音效檔是windows作業系統內建的,DS1.wav當背景音樂所以設成重複播放,DS2.wav當發射子彈的音效,DS3.wav當子彈打到敵機的音效,

本篇blog附上範例程式的使用方式:
1.在任何一種版本的Visual Studio建立C++ win32專案,專案名稱打"JustShootIt",專案建立後再修改專案->屬性->不使用Unicode字集,專案->屬性->C/C++->先行編譯標頭檔->不使用先行編譯標頭檔,開啟JustShootIt.cpp,清光內容,

2.將範例程式解壓縮,除了JustShootIt.cpp以外,其他檔案都放到專案的那個目錄內,用記事本打開JustShootIt.cpp,全部複製貼到Visual Studio編輯視窗的JustShootIt.cpp裡頭,

3.依序為專案加入game.h,dsound.h,fps_time.h,key_state.h,map.h,soundclass.h,soundclass.cpp,

4.build->Run,

遊戲操作方式:
1.射擊子彈(滑鼠游標跟我機連成一線的方向就是子彈的射出方向):Shift鍵+Z,
2.上下左右方向鍵控制我機的移動方向,

遊戲畫面:

範例程式:
https://drive.google.com/file/d/0B6EVEd5P2B9cVDhIaGFqRVI3OUk/view?usp=sharing

沒有留言:

張貼留言