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涉及到的相关新特性哦
每一节讲解的都不会太多,将会通过每个场景的搭建将相关知识点穿插进来,在实现的过程中学习是不是更有趣呢?

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