❶ 怎樣製作基於Cocos2d-x的SLG游戲
創建項目
如果要說到環境搭建,那又該是一篇長篇大論了,所以這里我就不說了,不清楚的同學到網上問度娘吧,會有很多不同系統不同版本搭建的結果的。
Cocos2d-x創建項目的方式一直都在不停的改動,所以這里我覺得很有必要給大家介紹下如何創建項目。
創建3.2的項目其實很簡單,打開終端(Windows是cmd)進入到引擎文件夾目錄,然後輸入以下命令就可以創建。
cocos new SLG -p com.cocos2dx.rs -l cpp -d /Users/cocos2d-x/workspace/cocos2dx/cocos2d-x-3.2/projects
如下圖:
p1
說明:
new:new後是項目名
-p :-p後是包名
-l :-l後是語言(cpp指c++)
-d :-d後是項目生成路徑
如果一切無誤,那等待幾分鍾以後你就可以在給定的目錄下找到新建的項目了。打開項目工程後,下面我們就可以開始游戲的製作了。
前期准備
打開工程後,運行程序,你會發現它不是一個空的項目,在Classes和Resource文件夾下Cocos2d-x已經給出了一些實質性的東西,當然這些不是一定都有用的,它們存在的目的是為了給我們展示一個典型的Cocos2d-x的例子。
除了AppDelegate.h 和 AppDelegate.cpp文件,這兩個文件夾下其他的東西都是可被刪除的(不過在刪除之前,可以先看一下HelloWorld類,了解下它的類結構、類方法,以便對Cocos2d-x進行初步的學習,也方便初學者依葫蘆畫瓢再寫一個類似的場景)。AppDelegate類是創建項目時自動生成的一個類,它控制著游戲的生命周期,是Cocos2d-x游戲的通用入口文件,類似於一般 Windows 工程中main函數所在的文件。
打開AppDelegate.cpp文件,在游戲載入期的最後一個applicationDidFinishLaunching()函數中我們可以設置第一個啟動的游戲場景,如下:
auto scene = GameScene::createScene();
director->runWithScene(scene);
GameScene是我們新建的一個游戲場景,下面會講解。
解析度適配
在我的游戲中,首先第一件事還是做解析度適配,這是個恆古不變的定律。現如今市場中各種屏幕尺寸和解析度的移動設備層出不窮,為了更好地適應這些設備,游戲的解析度適配是十分有必要的。
在農場游戲中,很最要的一點就是實現大地圖背景的拖動、放大縮小等操作,所以可想而知,我們的地圖不是全部都顯示在屏幕內的,也就是說,我們不能像之前的方式那樣把整個顯示內容做適配,我們應該留有一定的邊距供玩家拖動。如下圖所示:
p2
同樣是在applicationDidFinishLaunching函數中,我們添加如下一段代碼對游戲做解析度適配,以便它能更好的適應不同的運行環境。
glview->setDesignResolutionSize(480.0f, 320.0f, ResolutionPolicy::FIXED_HEIGHT);
std::vector searchPath;
searchPath.push_back("H_1920");
FileUtils::getInstance()->setSearchPaths(searchPath);
director->setContentScaleFactor(1440.0f / 320.0f);
解析度適配的原理,建議大家閱讀一下:Cocos2d-x 多解析度適配完全解析這篇文章,雖然它不是針對最新版Cocos2dx引擎,但它還是能很清楚的告訴你解析度適配的原理和方法。
還有要說明的一點是,我們的游戲地圖的高為1920,解析度適配時則只設為了1440,意思就是說,我們本該全在屏幕內的內容留出了4分之一的高度在屏幕外。
編輯游戲地圖
模擬經營游戲中,游戲地圖多為拼接而成,這里我們用瓦片地圖編輯器(Tiled Map Editor)來製作游戲的地圖,它可以把編輯後的地圖文件保存為TMX格式的文件,能被Cocos2d-x很好的支持。瓦片地圖(Tile Map)不但生成簡單,而且可以靈活的用於引擎中。關於瓦片地圖的介紹可參考瓦片地圖一文。
接下來我們開始創建地圖。
運行TiledMap編輯器,新建一個地圖文件。填寫如下對話框:
p3
在地圖方向選項內,可以選擇正常、45度(傳說中的2.5D)和45度交錯,這里我們選擇45度。接下來需要設置地圖大小,這里的數值是指有多少格tile元件,並不是像素,這里我們選擇30×30的地圖。
最後是確定tile元件的大小,根據美工提供的地面元件大小設置,這個教程里,我們使用128×64的大小。
在地圖大小一欄中,你可以看到最終的地圖大小為3840 * 1920。
點擊確認之後,你可能已經發現了,這個游戲地圖它是菱形的,如下圖所示。
p4
這里你可能會想,為什麼要菱形的啦,選擇45度交錯建一個接近矩形的不行嗎?呵呵,其實這樣也是可以的,只不過啦,Cocos2d-x引擎中默認是不支持45度交錯的,如果需要在引擎中載入這種交錯的地圖必須自己修改引擎代碼(看到這,是不是整個人都不好了),而且在修改過後還不能正確的得到地圖的大小,需要自己編寫計算大小的公式代碼。鑒於這一點,我在想,難道《全名農場》、《請叫我海盜》等游戲地圖的四個角都不能被點擊操作都是因為這個原因嗎? 哈哈,就當是我想多了吧。其實菱形就菱形吧,其他的游戲也都這樣,可以在菱形地圖的下層貼一層背景來掩蓋這一現象。
接下來,我們還是回到正題開始拼接地圖吧。選擇地圖-》新圖塊,然後填寫如下所示的對話框。
p5
選擇瀏覽按鈕,將准備好的圖塊文件載入編輯器。接著設置圖塊的寬度和高度(默認情況下是一個tile元件的大小,但),根據圖塊文件中圖塊的大小來設置。邊距、間距什麼的,可不做修改,0就好。
最後選中相應的圖塊,拖動到渲染區拼一個理想的地圖。
p6
暫時我們就只簡單的拼一個地圖就可以了,後面再根據游戲需要,設置一些必要的對象和屬性。
載入地圖資源
新建一個GameScene場景,載入游戲地圖。不過在此之前,請把編輯好的tmx和圖塊文件拷貝到Resource文件夾下。GameScene的結構和HelloWorld差不多,照著HelloWorld類依葫蘆畫瓢就可以建一個。你可以先看看它是如何實現的,再實現自己的類。這里就不多說了。
在Cocos2d-x中使用TMX,有以下流程供你參考:
首先用地圖編輯器編輯你的地圖,導出成TMX 格式。
將導出的TMX 文件和相關圖片放在工程的Resoure文件夾下。
使用Cocos2d-x中TMXTileMap 類的create方法創建地圖對象,TMX 文件的解析是引擎內部完成的,所以我們不需要擔心。TMXTileMap 是Node 的子類,因此只要添加到場景中即可。
通過TMXTileMap,可以獲得其他相關對象,比如單個瓦片(屬Sprite類),比如對象組(ObjectGroup類),比如層(TMXLayer類)等;你可以通過TMXLayer類修改,刪除或者添加某個網格位置的瓦片,這樣可以動態的修改地圖了,你還可以進行其他的操作,相關的API 我們後面使用到了再做講解。
在GameScene類的init函數中添加如下的代碼創建游戲地圖:
mapLayer = LayerColor::create(Color4B(78,127,41,255));
this->addChild(mapLayer,-1);
auto map = TMXTiledMap::create("mymap4.tmx");
mapLayer->setContentSize(map->getContentSize());
mapLayer->addChild(map, 10);
auto treeSprite = Sprite::create("1.png");
treeSprite->setAnchorPoint(Vec2(0, 0));
treeSprite->setPosition(Vec2(0, 0));
treeSprite->setScale(2);
mapLayer->addChild(treeSprite, 11);
代碼中新建了一個帶顏色的背景層,背景層的尺寸等於載入的TMX地圖大小。接著把地圖和如下的一個遮蓋層(其實就是為了防止菱形的地圖看起來那麼突兀而添加的一層)依次添加到層上。