上一篇中我們建立了第一個場景,下面我們着手建立第二個場景哦,第二個場景比較複雜了,我們先看一下實現的效果吧,在本節中將會帶大家一起實現第二場景。
場景的將會涉及到文件標籤,菜單按鈕等操作,下兩節將會分別介紹文字標籤和菜單的實現,現在可以先帶着問題做下去哦。
看下對比圖,是不是很有感覺了,
好像當時上數學課的樣子~~有沒有不一樣的感覺
閒話不多說,開始準備今天的場景搭建吧。
一、準備場景素材
一個遊戲的任何場景都會有相應的元素(圖片等資源)
我們要實現的場景中存在的元素有哪些呢?
對,相信大家看了上面的圖片也都能猜出來,有背景圖,有標題圖,有按鈕圖,有選擇關卡圖,有第幾關的圖
準備好相關素材後,開始編寫可愛的代碼吧
二、建立第二個場景
1、創建場景類GameMenuScene
我們已經熟悉了WelcomeScene的創建,GameMenuScene的創建和它一樣,但稍有不同哦,多了兩個方法,是做什麼的呢?上代碼,大家直接看~~
頭文件:GameMenuScene.h
#pragma once
#include "cocos2d.h"
class GameMenuScene : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(GameMenuScene);
//開始遊戲
void onStartBtnPressed(Ref* pSender);
//選擇關卡
void onSelectBtnPressed(Ref* pSender);
};
類文件:WelcomeScene.cpp
#include "GameMenuScene.h"
USING_NS_CC;
Scene* GameMenuScene::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::create();
// 'layer' is an autorelease object
auto layer = GameMenuScene::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool GameMenuScene::init()
{
//////////////////////////////
// 1. super init first
if (!Layer::init())
{
return false;
}
auto visibleSize = Director::getInstance()->getWinSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
//繪製背景
auto bg = Sprite::create("menu/bg.jpg");
bg->setPosition(visibleSize / 2);
this->addChild(bg);
//標題
auto title = Sprite::create("menu/title.png");
title->setPosition(visibleSize.width / 2, visibleSize.height - 180);
this->addChild(title);
//關卡
auto level = Sprite::create("menu/level.png");
level->setPosition(visibleSize.width / 2, visibleSize.height - 343);
this->addChild(level);
//關卡數字
auto levelTTF = Label::createWithCharMap("fonts/label/label_ball.png", 14, 20, '0');
levelTTF->setString(StringUtils::format("%d", 1));
levelTTF->setPosition(level->getContentSize() / 2);
level->addChild(levelTTF);
//按鈕
auto startBtn = MenuItemImage::create("menu/start.png", "menu/start.png");
startBtn->initWithCallback(CC_CALLBACK_1(GameMenuScene::onStartBtnPressed, this));
startBtn->setPosition(visibleSize.width / 2, visibleSize.height - 485);
//選關按鈕
auto selectBtn = MenuItemImage::create("menu/select.png", "menu/select.png");
selectBtn->initWithCallback(CC_CALLBACK_1(GameMenuScene::onSelectBtnPressed, this));
selectBtn->setPosition(visibleSize.width / 2 + 20, visibleSize.height - 660);
auto menu = Menu::create(startBtn, selectBtn, NULL);
menu->setPosition(Point::ZERO);
this->addChild(menu);
return true;
}
//開始遊戲
void GameMenuScene::onStartBtnPressed(Ref* pSender) {
//需要跳轉到遊戲界面
}
//選擇關卡
void GameMenuScene::onSelectBtnPressed(Ref* pSender) {
//需要跳轉到選擇關卡界面
}
我們已經完成了該場景的搭建,仔細看,是不是都是一個套路啊!
創建一個對象,設置這個對象的屬性和位置,將這個對象加入到這個層中呢,一起試一試吧!
二、測試運行
我們將AppDelegate中的場景運行換成該場景運行一下,是不是看到了文章最上方的界面呢~~
在上一教程的結尾還提到了如何直接替換場景,有興趣的小夥伴可以直接使用哦
Director::getInstance()->replaceScene(???); //該方式有很多種的切入效果,在後面會給大家介紹
三、按鈕點擊沒反應啊?
界面已經完美的展示出來,是不是都迫不及待的點擊一下試試看呢?
沒反應?這就對啦,菜單按鈕的回調函數還沒實現呢。
下一節將會講解菜單按鈕的實現和C++ 11涉及到的相關新特性哦
每一節講解的都不會太多,將會通過每個場景的搭建將相關知識點穿插進來,在實現的過程中學習是不是更有趣呢?