Cocos2dx遊戲教程(五):“見縫插針”,第二個場景的建立

上一篇中我們建立了第一個場景,下面我們着手建立第二個場景哦,第二個場景比較複雜了,我們先看一下實現的效果吧,在本節中將會帶大家一起實現第二場景。

場景的將會涉及到文件標籤,菜單按鈕等操作,下兩節將會分別介紹文字標籤和菜單的實現,現在可以先帶着問題做下去哦。

看下對比圖,是不是很有感覺了,

在這裏插入圖片描述
好像當時上數學課的樣子~~有沒有不一樣的感覺
在這裏插入圖片描述
閒話不多說,開始準備今天的場景搭建吧。

一、準備場景素材

一個遊戲的任何場景都會有相應的元素(圖片等資源)
我們要實現的場景中存在的元素有哪些呢?
對,相信大家看了上面的圖片也都能猜出來,有背景圖,有標題圖,有按鈕圖,有選擇關卡圖,有第幾關的圖
在這裏插入圖片描述
準備好相關素材後,開始編寫可愛的代碼吧

二、建立第二個場景

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涉及到的相關新特性哦
每一節講解的都不會太多,將會通過每個場景的搭建將相關知識點穿插進來,在實現的過程中學習是不是更有趣呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章