cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第一步---開始界面&关卡选择

/* 说明:

**1.本次游戏实例是《cocos2d-x游戏开发之旅》上的最后一个游戏,这里用3.0重写并做下笔记

**2.我也问过木头本人啦。他说:随便写,第一别全然照搬代码;第二能够说明是学习笔记---好人

**3.这里用cocos2d-x 3.0版本号重写,非常多地方不同。可是从重写过程中也非常好的学习了cocos2d-x

*/

***每一步相应的全部代码以及用到的资源都会打包在最后给出

***为避免代码过多。每一步的代码都做了标记--一看就晓得是第几步实现的避免出错改不回去(难不成还用Git?)

***能够依据设计思路(好吧,那名字太高大上。

实际就是这一步要干啥)先自己实现---cocos2d-x本来就是如此,同样的功能有很多不同实现方法;先自己折腾是蛮不错的。

***为了方便移植到手机上,对于每一步都进行编译android測试;由于非常多时候代码在win32下能够,编译就会出错,给出的代码会是測试过后的。

start:先新建一个project

本次笔记内容:

1、效果预览

2、设计思路&问题注意

3、实现代码&具体解释

4、总结&下节预览

一:效果图

依照前面的第0步的知识点&设计思路里面的主设计思路。先完毕MainScene到关卡选择&编辑界面的处理

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWllZMTczNTMzODMy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="600" height="350" >

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWllZMTczNTMzODMy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="600" height="450" >

二:设计思路&问题注意

MainScene  载入一个背景, 两个选择菜单。

编辑button先无论;

開始button时候,进行关卡选择GameLvlChooseScene

关卡选择button也先不实现

-(好吧,这是什么烂设计思路。。无聊。。。

)可是。这里我们会遇到一个坐标的小问题--代码中解释吧

三:实现代码+解析

好吧。事实上这么简单的代码。。还是贴上吧

MainScene:

#ifndef __MainScene__H__
#define __MainScene__H__

#include "cocos2d.h"
USING_NS_CC;

class MainScene : public Layer{
public:
	MainScene();
	~MainScene();
	CREATE_FUNC(MainScene);
	virtual bool init();

	static Scene* createScene();

private:
	//**1**选择菜单
	void chooseMenu();

	//**1**两个选择菜单的回调函数
	void editorScene(Ref* pSender);
	void startGame(Ref* pSender);
};/**/

#endif
#include "MainScene.h"

MainScene::MainScene(){
}
MainScene::~MainScene(){
}

Scene* MainScene::createScene(){
	auto scene = Scene::create();

	auto layer = MainScene::create();

	scene->addChild(layer);

	return scene;
}

bool MainScene::init(){
	auto visibleSize = Director::getInstance()->getVisibleSize();

	auto BG = Sprite::create("game/MainSceneBG.jpg");
	BG->setPosition(visibleSize.width/2,visibleSize.height/2);
	BG->setOpacity(200); //设置透明度。看起来更像背景->_->
	this->addChild(BG);

	chooseMenu();

	return true;
}

void MainScene::chooseMenu(){
	auto visibleSize = Director::getInstance()->getVisibleSize();

	const char* norImg = "Button/choose_btn_nor.png";
	const char* lightImg = "Button/choose_btn_light.png";

	//**1**---------開始--------------------------------
	auto title = Label::create("Start","Arial",35);
	title->setPosition(ccp(60, 60));
	auto startItem = MenuItemImage::create(norImg, lightImg, CC_CALLBACK_1(MainScene::startGame,this));
	startItem->addChild(title);

	//**1**---------编辑场景----------------------------
    title = Label::create("Editor","Arial",35);
	title->setPosition(ccp(60, 60));
	auto editorItem = MenuItemImage::create(norImg, lightImg, CC_CALLBACK_1(MainScene::editorScene,this));
	editorItem->addChild(title);

	//**1**菜单
	auto menu = CCMenu::create(startItem, editorItem, nullptr);
	//**1**依照一列放置
	menu->alignItemsVerticallyWithPadding(20);
	menu->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2));

	this->addChild(menu);

}

void MainScene::startGame(Ref* pSender){
	CCLOG("startGame");
	//auto scene = GameLvlChoose::createScene();
	//Director::getInstance()->replaceScene(scene);
}

void MainScene::editorScene(Ref* pSender){
	CCLOG("EditorScene");
}

没啥好解释的。可是注意两个问题

1、一个小小的坐标问题:chooseMenu 里面,我们对于一个菜单单项。要加一个Label。也就是在button图片中加入的Start之类的文字Label,这样你就知道这个button是干嘛的啦。

我们须要把Label的位置 放在ccp(60,60)。

why?那是由于我们须要把Label addChild到菜单单项里面去。son 的放置位置是相对于parent来的。你若不setPosition,那么默认的就是(0,0)。相对于parent 放在 0,0 位置是个什么意思呢?看图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWllZMTczNTMzODMy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

那么,打开资源图片,发现button图片是 130*130的。所以应该把Label放在(60,60)。关于这个问题后面还会用到。须要注意

2、关于Scene和Layer的关系。依照新建的project来看。HelloWorld里面。是一个Scene里面放了一个层,它的处理方式是HelloWorld是继承自Layer,它是一个Layer,仅仅只是,我们在这个层里,有一个createScene 方法来创建而且返回Scene。 createScene里面HelloWorld::create();然后调用virtual
bool init 函数,创建这个层,增加scene里面,返回scene;这里的MainScene比較简单;也是这么做的。对于后面有的地方,一个Scene里面有多个Layer,那么能够分离出来

-------------------------------------------------------------------------------------------------

然后我们在AppDelegate.cpp中 改动scene;同一时候这里先

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLView::create("My Game");
	glview->setFrameSize(800,450);<span style="color:#ff0000;">//------------------Win32下先set----------------------</span>
        director->setOpenGLView(glview);
    }

	glview->setDesignResolutionSize(800,450,ResolutionPolicy::SHOW_ALL);//屏幕自适应
    /*..........省略.....................*/
    return true;
}

好吧。到上面一步能够F5測试,button之后,能够看到回调对应函数输出

然后增加关卡选择Scene

#ifndef __GameLvlChoose__H__
#define __GameLvlChoose__H__

#include "cocos2d.h"
USING_NS_CC;

class GameLvlChoose : public Layer{
public:
	GameLvlChoose();
	~GameLvlChoose();
	virtual bool init();
	CREATE_FUNC(GameLvlChoose);

	static Scene* createScene();

private:
	//--1--在init里面加入菜单,这里是回调函数
    void level_1(Ref* pSender);
    void level_2(Ref* pSender);
    void level_3(Ref* pSender);

	//--1--依据不同级别createLabel。菜单标签
	Label* createLevelLab(const char* sLvl);

	int _level;
};/**/

#endif

.cpp

#include "GameLvlChoose.h"

GameLvlChoose::GameLvlChoose(){
	_level = 1;
}
GameLvlChoose::~GameLvlChoose(){
}

Scene* GameLvlChoose::createScene(){
	Scene* scene = Scene::create();

	auto layer = GameLvlChoose::create();

	scene->addChild(layer);

	return scene;
}

bool GameLvlChoose::init(){
	auto visibleSize = Director::getInstance()->getVisibleSize();

	//**1**-------- 创建关卡选则菜单 ------------------------------
	const char* norImg = "Button/choose_btn_nor.png";
	const char* lightImg = "Button/choose_btn_light.png";

	//Lv_1
	auto level_1_Item = MenuItemImage::create(norImg, lightImg, CC_CALLBACK_1(GameLvlChoose::level_1,this));
	level_1_Item->addChild(createLevelLab("1"));

	//Lv_2
	auto level_2_Item = MenuItemImage::create(norImg, lightImg, CC_CALLBACK_1(GameLvlChoose::level_2,this));
	level_2_Item->addChild(createLevelLab("2"));

	//Lv_3
	auto level_3_Item = MenuItemImage::create(norImg, lightImg, CC_CALLBACK_1(GameLvlChoose::level_3,this));
	level_3_Item->addChild(createLevelLab("3"));

	//**1**菜单
	auto menu = CCMenu::create(level_1_Item, level_2_Item, level_3_Item, nullptr);
	//**1**依照一行放置
	menu->alignItemsHorizontallyWithPadding(20);
	menu->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2));

	this->addChild(menu);

	return true;
}

Label* GameLvlChoose::createLevelLab(const char* sLvl) {
	auto level_lab = Label::create(sLvl, "Arial", 60);
	level_lab->setColor(Color3B::RED);
	level_lab->setPosition(ccp(60, 60));

	return level_lab;
}

void GameLvlChoose::level_1(CCObject* pSender) {
	CCLOG("111111");
	_level = 1;
}

void GameLvlChoose::level_2(CCObject* pSender) {
	CCLOG("222222");
	_level = 2;
}

void GameLvlChoose::level_3(CCObject* pSender) {
	CCLOG("333333");
	_level = 3;
}

之后能够,在MainScene里面的StartGame函数里面,切换场景

四:小结&下次预览

小结:没啥好说的。。。

下次我们要開始实现编辑Scene啦。我们能够自由编辑每一级别关卡的怪物行走路线以及能够放英雄的炮台位置

------------------------------------------------------

代码&资源

------------------------------------------------------

个人愚昧观点。欢迎指正与讨论-------

时间: 2024-10-24 13:07:52

cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第一步---開始界面&amp;关卡选择的相关文章

cocos2d-x 3.0游戏实例学习笔记 《跑酷》第六步--物理碰撞检测(1)

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 那么这一步,我们先不急着给主角和金币岩石碰撞检测,我这里把cocos2d-x 3.0 的物理碰撞检测单独抽取出来,之前看了cocos的官网,有一个教程:用新物理引擎完成碰撞检测,就是一个车和猫的碰撞检测,车撞倒猫,猫就消失.我之前也单独试了下.但是那个教程的代码好像完整性不好,不能运行...于是我又借

cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&amp;主角添加动作

这一步当中,我们主要完成以下功能: 1.地图的无限滚动---让主角看起来真的是在跑动 2.给主角添加Jump跳跃和crouch下蹲动作 那么首先来让背景滚动起来,在PlayScene.h中添加: //初始化背景 void initBG(); //用update函数让地图滚动 virtual void update(float dt); //背景精灵 cocos2d::Sprite* bgSprite1; cocos2d::Sprite* bgSprite2; cocos2d::Sprite* g

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&amp;同时带着刚体

在这一步,我们主要是把主角加入到游戏场景中来,并且让它跑动,这里的跑动,实际上也就是执行一组动画,让其看起来像是在跑动,而且相对屏幕的位置也不会改变 我们会定义一个主角类:Runner,而这一步就要用到 帧动画 的创建和使用等知识点. 对于Runner,我的设计思路如下: 1.主角有一个动作集合,包括跑动,跳起来,以及蹲下.那么就有不同的帧动画,那么这里借鉴到 晓风残月前辈的方法,将帧动画打包命名,之后根据动作名来执行动作 2.主角需要绑定刚体,并且在不同的动作下的刚体大小不同 3.我们给主角设

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第五步--按钮控制主角Jump&amp;Crouch

这一步当中,我们给PlayScene中 添加两个按钮,让主角Jump and Crouch,按钮功能如下: Jump按钮,按下主角跳起来 Crouch按钮,按下主角下蹲,一直按着一直蹲,松开之后主角才站起来 这里用按钮包含头文件"cocos-ext.h"会遇到一点点问题,后面给出详细解决方法: 首先PlayScene.h中要包含头文件: <span style="font-size:14px;">#include "cocos-ext.h&qu

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源码放送

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 OK,到昨天为止,我们已经将游戏基本上写完了,这里本来就是别人开源的东西,我这里重写,当然要公布源码.那么这里有两种方式: 第一种:将我运行成功的整个项目打包,VS2012+win7下的,这种方式就比较大,但是可以打开打开 Run/proj.win32/Run.sln 就可以啦 第二种:就是我只打包

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 OK,到昨天为止,我们已经将游戏基本上写完了,这里本来就是别人开源的东西,我这里重写,当然要发布源代码.那么这里有两种方式: 第一种:将我执行成功的整个项目打包,VS2012+win7下的,这样的方式就比較大,可是能够打开打开 Run/proj.win32/Run.sln 就能够啦 另外一种:就是我

cocos2d-x 3.0游戏实例学习笔记 《卡牌塔防》第0步---知识点总结&amp;效果预览

/* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别完全照搬代码:第二可以说明是学习笔记 **3.这里用cocos2d-x 3.0版本重写,很多地方不同,但是从重写过程中也很好的学习了cocos2d-x */ 环境:Win7 .cocos2d-x 3.0final .C++ .VS2012 笔记思路:后面就按这种思路写笔记啦 1.首先给出每次实现的效果截图 2.然后给出设计思路 3.

cocos2d-x 3.0游戏实例学习笔记 《跑酷》移植到android手机

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 好吧,自从上次<跑酷>完结之后,就什么没做什么的,主要是修复了一点点bug ,也在相应的文章里面做出了相应的改动.不过,只能在window上看着玩又有什么太大意思呢!!!于是乎又尝试着弄到手机上试试--OK,初生牛犊不要脸,哦不!不怕喷.这里记录一下我的移植过程.(这里会用到新的大小的资源.待会也会

cocos2d-x 3.0游戏实例学习笔记 《跑酷》一 开始界面

开始界面和前辈的基本上差不多:cocos2d-x游戏开发 跑酷(一)开始界面     但是也有不同 下面先给出游戏过程中用到的所有资源 开始界面定义为:MainScene 有如下功能: 1.背景 2.进入游戏界面按钮 3.预先加载背景音乐文件 .h文件 #ifndef __MainScene__H__ #define __MainScene__H__ #include "cocos2d.h" class MainScene : cocos2d::Layer{ public: virtu