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涉及到的相关新特性哦
每一节讲解的都不会太多,将会通过每个场景的搭建将相关知识点穿插进来,在实现的过程中学习是不是更有趣呢?
标签:教程,场景,auto,create,visibleSize,Cocos2dx,见缝插针,menu,GameMenuScene 来源: https://blog.csdn.net/slaron/article/details/104786360