1. 写笔记主要是为了同强大的忘性作斗争,学习《Cocos2d-x 3.x游戏开发之旅》所记。

2. 以下参照书本,跑出来的效果图,所以主要还是把代码贴上来,方便日后查询。



3.下面开始贴代码

创建基类,为人物和金币所继承.Entity 继承与Node.

#ifndef _ENTITY_H_
#define _ENTITY_H_

#include"cocos2d.h"
USING_NS_CC;

class Entity : public Node
{
public:
	Entity();
	~Entity();
	Sprite* getSprite();
	void bindSprite(Sprite* sprite);
private:
	Sprite* m_sprite;
};
#endif

#include"Entity.h"
#include"Player.h"

Entity::Entity()
{
	m_sprite = NULL;
}

Entity::~Entity()
{
}

Sprite* Entity::getSprite()
{
	return this->m_sprite;
}

void Entity::bindSprite(Sprite* sprite)
{
	this->m_sprite = sprite;
	this->addChild(m_sprite);
        /*由于需要做碰撞检测,而Node的默认宽高属性(0,0),所以需要获取精灵的宽高,设置给Entity.这样Entity就有了Sprite对象的宽高。*/
	Size size = m_sprite->getContentSize();
	m_sprite->setPosition(Point(size.width*0.5f,size.height*0.5f));
	this->setContentSize(size);
}

2.创建主角类Player和金币类Monster.
#ifndef _PLAYER_H_
#define _PLAYER_H_
#include"cocos2d.h"
#include"Entity.h"

using namespace cocos2d;

#define JUMP_ACTION_TAG 1
class Player : public Entity
{
public:
	Player();
	~Player();
	CREATE_FUNC(Player);
	virtual bool init();
	void jump();
	void hit();
	int getiHP();
	void resetData();
private:
	bool b_isJumping;
	int m_iHP;
};
#endif

#include"Player.h"
//#include"FlowWord.h"
Player::Player()
{
	b_isJumping = false;
	m_iHP = 1000;
}

Player::~Player()
{}

bool Player::init()
{
	return true;
}

void Player::hit()//碰撞时,人物的动作
{
	if(getSprite() == NULL)
	{
		return;
	}

	m_iHP -= 15;
	if(m_iHP < 0)
	{
		m_iHP = 0;
	}

	//FlowWord* flowWord = FlowWord::create();
	//this->addChild(flowWord);
	//flowWord->showWord("-15",GetSpoolFileHandle);

	auto backMove = MoveBy::create(0.1f,Point(-20,0));
	auto forwardMove = MoveBy::create(0.1f,Point(20,0));
	auto backRotate = RotateBy::create(0.1f,-5,0);
	auto forwardRotate = RotateBy::create(0.1f,5,0);

	auto backAction = Spawn::create(backMove,backRotate,NULL);
	auto forwardAction = Spawn::create(forwardMove,forwardRotate,NULL);
	auto actions = Sequence::create(backAction,forwardAction,NULL);

	stopAllActions();
	resetData();
	runAction(actions);
}

void Player::resetData()
{
	if(b_isJumping)
	{
		b_isJumping = false;
	}
	setPosition(Point(200,140));
	setScale(1.0f);
	setRotation(0);
}

int Player::getiHP()
{
	return m_iHP;
}

void Player::jump()
{
	if(getSprite() == NULL)
		return;

	if(b_isJumping)
		return;

	b_isJumping = true;

	auto jump = JumpBy::create(2.0f,Point(0,0),250,1);//原地跳跃,高度250像素,跳跃一次
	auto callFunc = CallFunc::create([&]()
	{
		b_isJumping = false;
	});

	auto jumpAction = Sequence::create(jump,callFunc,NULL);
	this->runAction(jumpAction);
}
<pre name="code" class="cpp">#ifndef _MONSTER_H_
#define _MONSTER_H_
#include"Entity.h"
#include"Player.h"
class Monster:public Entity
{
public:
	Monster();
	~Monster();
	CREATE_FUNC(Monster);
	virtual bool init();
public:
	void show();
	void hide();
	void reset();
	bool isAlive();
	bool isCollideWithPlayer(Player* player);
private:
	bool b_isAlive;
};
#endif

#include"Monster.h"

Monster::Monster()
{
	b_isAlive = false;
}

Monster::~Monster()
{}

bool Monster::init()
{
	return true;
}
void Monster::show()
{
	if(getSprite() != NULL)
	{
		setVisible(true);
		b_isAlive = true;
	}
}

void Monster::hide()
{
	if(getSprite() != NULL)
	{
		setVisible(false);
		reset();
		b_isAlive = false;
	}
}

void Monster::reset()
{
	if(getSprite() != NULL)
	{
		setPosition(Point(800+CCRANDOM_0_1() * 2000,200-CCRANDOM_0_1()*100));
	}

}

bool Monster::isAlive()
{
 	return b_isAlive;
}

bool Monster::isCollideWithPlayer(Player* player)
{
	if(player == NULL || getSprite() == NULL)
		return false;
	Rect entityRect = player->getBoundingBox();//获取碰撞检测对象的boundingBox
	Point monsterPos = getPosition();
	return entityRect.containsPoint(monsterPos);
}

3.金币管理类,负责金币的创建,管理。

 
#ifndef _MANAGERMONSTER_H_
#define _MANAGERMONSTER_H_

#include "cocos2d.h"
#include "Monster.h"

USING_NS_CC;

#define MAX_MONSTER_NUM 10
class MonsterManager:public Node
{
public:
	CREATE_FUNC(MonsterManager);
	virtual bool init();
	virtual void update(float dt);

private :
	void createMonster();
public:
	void bindplayer(Player* player);
private: 
	Vector<Monster*> m_monsterarr;//Vector容器的应用
	Player* m_player;
};
#endif

#include"MonsterManager.h"
#include"Player.h"
#include"Monster.h"

bool MonsterManager::init()
{
	createMonster();
	this->scheduleUpdate();
	return true;
}

void MonsterManager::createMonster()
{
	Monster* monster = NULL;
	Sprite* sprite = NULL;

	for(int i = 0; i < MAX_MONSTER_NUM; i++)
	{
		monster = Monster::create();
		monster->bindSprite(Sprite::create("monster.png"));
		monster->reset();
		this->addChild(monster);
		m_monsterarr.pushBack(monster);
	}
}
 void MonsterManager::update(float dt)
 {
	 for(auto monster:m_monsterarr)
	 {
		 if(monster == NULL)
			 continue;
		 if(monster->isAlive())
		 {
			 monster->setPositionX(monster->getPositionX() - 4);

			 if(monster->getPositionX() < 0)
			 {
				 monster->hide();
			 }
		 }
		 else
		 {
			 monster->show();
		 }

		if(monster->getPositionX() < 0)
		{
			monster->hide();
		}
		else if(monster->isCollideWithPlayer(m_player))
		{
			m_player->hit();
			monster->hide();
		}
	 }
 }

 void MonsterManager::bindplayer(Player* player)
 {
	m_player = player;
 }

4.创建场景类
#ifndef _TOLLGATESCENE_H_
#define _TOLLGATESCENE_H_

#include "cocos2d.h"
using namespace cocos2d;

#include"editor-support/cocostudio/CCSGUIReader.h"
#include"ui/CocosGUI.h"

using namespace cocos2d::ui;
using namespace cocostudio; 
class Player;

class TollgateScene : public Layer
{
public:
	static Scene* createScene();
    virtual bool init();
	CREATE_FUNC(TollgateScene);
	virtual void update(float delta);//update函数的调用
private:
	void initBG();
	void loadUI();
	void jumpEvent(Ref*,TouchEventType type);

private:
	Sprite* m_bg1;
	Sprite* m_bg2;
	Player* m_player;
	int m_iscore;
	Text* m_scoreLab;
	LoadingBar* m_hpBar;
};
#endif

#include"TollgateScene.h"
#include"Player.h"
#include"Entity.h"
#include"cocos2d.h"
#include"MonsterManager.h"

Scene* TollgateScene::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();
    
    // 'layer' is an autorelease object
    auto layer = TollgateScene::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

bool TollgateScene::init()
{
	if(!Layer::init())
	{
		return false;
	}
        //尽量不要使用多线程,Cocos2d-x的Node对象提供了一个update函数,在游戏的每一帧都会调用update函数,我们只要调用它便可以
	this->scheduleUpdate();//这句表示我们开启调用update函数的功能

	Size visibleSize = Director::getInstance()->getVisibleSize();

	Sprite* titleSprite = Sprite::create("title.png");
	titleSprite->setPosition(Point(visibleSize.width/2,visibleSize.height-50));
	this->addChild(titleSprite,2);

	m_player = Player::create();
	m_player->bindSprite(Sprite::create("sprite.png"));
	m_player->setPosition(Point(200,visibleSize.height / 4));
	this->addChild(m_player,3);

	initBG();

	MonsterManager* monsterMgr = MonsterManager::create();
	this->addChild(monsterMgr,4);

	monsterMgr->bindplayer(m_player);

	m_iscore = 0;

	return true;
}

void TollgateScene::initBG()
{
	Size visibleSize = Director::getInstance()->getVisibleSize();
	m_bg1 = Sprite::create("tollgateBG.jpg");
	m_bg1->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
	this->addChild(m_bg1,0);

	m_bg2 = Sprite::create("tollgateBG.jpg");
	m_bg2->setPosition(Point(visibleSize.width+visibleSize.width/2,visibleSize.height/2));
	m_bg2->setFlippedX(true);
	this->addChild(m_bg2,0);
	loadUI();
}

void TollgateScene::update(float delta)  //<span style="font-family: Arial,Helvetica,sans-serif;">开启调用update函数的功能,需要加this->scheduleUpdate()</span>
{
	int posX1 = m_bg1->getPositionX();
	int posX2 = m_bg2->getPositionX();

	int speed = 1;

	posX1 -= speed;
	posX2 -= speed;

	m_bg1->setPositionX(posX1);
	m_bg2->setPositionX(posX2);

	Size mapsize = m_bg1->getContentSize();

	if(posX1 <= -mapsize.width/2)
	{
		posX1 = mapsize.width + mapsize.width/2;
	}

	if(posX2 <= -mapsize.width/2)
	{
		posX2 = mapsize.width + mapsize.width/2;
	}

	m_bg1->setPositionX(posX1);
	m_bg2->setPositionX(posX2);

	m_iscore += 1;
	m_scoreLab->setText(Value(m_iscore).asstring());
	//m_hpBar->setPercent(100);
	m_hpBar->setPercent(m_player->getiHP()/1000.0f*100);
}

void TollgateScene::loadUI()//加载cocostudio的控件
{
	auto UI = cocostudio::GUIReader::getInstance()->widgetFromJsonFile("LittleRunnerUI_1.ExportJson");
	this->addChild(UI);

	auto jumpBtn = (Button*)Helper::seekWidgetByName(UI,"JumpBtn");
	jumpBtn->setTitleText("Jump");
	jumpBtn->addTouchEventListener(this,toucheventselector(TollgateScene::jumpEvent));//跳跃动作的监听

	m_scoreLab = (Text*)Helper::seekWidgetByName(UI,"scoreLab");
	m_hpBar = (LoadingBar*)Helper::seekWidgetByName(UI,"ProgressBar_11");
}

void TollgateScene::jumpEvent(Ref*,TouchEventType type)
{
	switch(type)
	{
	case TouchEventType::TOUCH_EVENT_ENDED:
		m_player->jump();
		break;
	}
}

5 启动

#ifndef  _APP_DELEGATE_H_
#define  _APP_DELEGATE_H_

#include "cocos2d.h"

/**
@brief    The cocos2d Application.

The reason for implement as private inheritance is to hide some interface call by Director.
*/
class  AppDelegate : private cocos2d::Application
{
public:
    AppDelegate();
    virtual ~AppDelegate();

    /**
    @brief    Implement Director and Scene init code here.
    @return true    Initialize success,app continue.
    @return false   Initialize Failed,app terminate.
    */
    virtual bool applicationDidFinishLaunching();

    /**
    @brief  The function be called when the application enter background
    @param  the pointer of the application
    */
    virtual void applicationDidEnterBackground();

    /**
    @brief  The function be called when the application enter foreground
    @param  the pointer of the application
    */
    virtual void applicationWillEnterForeground();
};

#endif // _APP_DELEGATE_H_

#include "AppDelegate.h"
#include "HelloWorldScene.h"
#include "TollgateScene.h"
USING_NS_CC;

AppDelegate::AppDelegate() {

}

AppDelegate::~AppDelegate() 
{
}

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getopenGLView();
    if(!glview) {
        glview = GLView::create("My Game");
		glview->setFrameSize(800,500);//只针对windos平台,移植到手机后这些设置是无效的。由手机屏幕来决定大小
        director->setopenGLView(glview);
    }

    // turn on display FPS
    director->setdisplayStats(false);

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0 / 60);

    // create a scene. it's an autorelease object
    auto scene = TollgateScene::createScene();

    // run
    director->runWithScene(scene);

    return true;
}

// This function will be called when the app is inactive. When comes a phone call,it's be invoked too
void AppDelegate::applicationDidEnterBackground() {
    Director::getInstance()->stopAnimation();

    // if you use SimpleAudioEngine,it must be pause
    // SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground() {
    Director::getInstance()->startAnimation();

    // if you use SimpleAudioEngine,it must resume here
    // SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
}
6.不要在写代码的时候,把所有的功能都往一个类里面写,多分开几个类来写,多写一些注释,以便后面要修改或者查阅看不懂。

Cocos2dx学习笔记3---LittleRunner的更多相关文章

  1. 详解iOS游戏开发中Cocos2D的坐标位置关系

    这篇文章主要介绍了iOS游戏开发中Cocos2D的坐标位置关系,Cocos2D是专门用来开发iOS游戏的开源框架,文中示例代码采用Objective-C语言,需要的朋友可以参考下

  2. 剖析iOS开发中Cocos2d-x的内存管理相关操作

    这篇文章主要介绍了剖析iOS开发中Cocos2d-x的内存管理相关操作,Cocos2d-x是开发游戏的利器,需要的朋友可以参考下

  3. iOS开发中使用cocos2d添加触摸事件的方法

    这篇文章主要介绍了iOS开发中使用cocos2d添加触摸事件的方法,cocos2d是制作iOS游戏的利器,需要的朋友可以参考下

  4. ios – cocos2d 2.0-rc2:结束导演并重启

    我有一个使用UIKitmenues的cocos2d驱动游戏,所以我只使用一个viewcontroller的框架,这是游戏本身.此外,它只有一个场景.由于cocos2d2.0导演本身是一个UIViewController子类,所以我只需在用户点击一个开始按钮时将其推送到我的MenuViewController中:当用户启动第一个游戏时,第一次调用该方法时,这很好.当游戏结束时,我调用[[CCDire

  5. cocos2dx之飞机大战简单版1

    先说下版本vs2010+cocos2dx2.2本章主要是告诉大家如何实现创建背景、飞机、***精灵,并且然后他们动起来,然后做一个碰撞测试,当***和敌方飞机碰撞时就销毁精灵并且加一个爆炸的精灵。所以我们只需要在GameLogic中调用addMonster,在GameLogicaddBullet1中调用addBullet1就可以了注意一定要在参数中加上floatdt,它是表明多少秒调用一次这个函数。

  6. cocos2d: fullPathForFilename: No file found at /cc_2x2_white_image. Possible missing file.

    程序运行的时候输出这条信息cocos2d:fullPathForFilename:Nofilefoundat/cc_2x2_white_image.Possiblemissingfile.并没有影响程序正常运行产生的原因可能是某个精灵未配置纹理导致的,不需要关心。参考cc_2x2_white_imageismissing,givingwarningatruntime:http://www.coco

  7. Cocos2dx学习笔记3---LittleRunner

    4.创建场景类5启动6.不要在写代码的时候,把所有的功能都往一个类里面写,多分开几个类来写,多写一些注释,以便后面要修改或者查阅看不懂。

  8. 寒風的Cocos2dx之旅之添加按钮

    要在Cocos2d中使用Button,首先引入头文件#include"ui/CocosGUI.h"usingnamespaceuil;引入完毕后,就创建button。功能要比MenuItem要强大的多。他可以使按钮放大等功能。

  9. cocos2d实现CCLabelTTF真正字体描边效果

    在开发游戏中,我们需要在需要在游戏中显示一个字体轮廓比较清晰的效果,我们就需要给字体的周围进行描边,让字体显示比较更加突出,我重写了cclabelttf类,使它具有描边的特效,和描边的大小以及颜色。。。

  10. cocos2d刚体会被穿透

    在调试Coco2d-javaEditor的BoxShape刚体碰撞时,发现有时候没有碰撞效果,直接穿透过去了。后来发现,刚体碰撞必须在没有外在干扰下才正常,而我每次碰撞的时候,都执行了Action动作,这个action动作会优先于碰撞,所以,会先执行action,这个action导致碰撞无效。为了防止穿透,最好不要用action。

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部