Cocos2d-x vs2012 简单入门笔记

main调用AppDelegate()创建应用,进行场景launching和finish以及频率等一些游戏配置,然后调入场景GameScene

GameScene.h   定义了主游戏场景,包括精灵,动作,以及碰撞

#ifndef __GameScene_SCENE_H__
#define __GameScene_SCENE_H__

#include "cocos2d.h"
//#include "BackgroundLayer.h"
class GameScene : public cocos2d::CCLayerColor
{
public:
	// there's no 'id' in cpp, so we recommend returning the class instance pointer
	static cocos2d::CCScene* scene();
	cocos2d::CCSprite* target;
	// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
	virtual bool init();  

	// a selector callback

	// implement the "static create()" method manually
	CREATE_FUNC(GameScene);
	void menuCloseCallback(CCObject* pSender);

	void responseFunc(CCObject* obj);
	void myDefine(CCNode* who);
	void createTarget();
	void gameLogic(float dt);
	void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
	~GameScene();
	void update(float delta) ;//delta = 1s/fps;


	//array or list
	//add:怪物飞镖出现 delete:碰撞出现
	//遍历:FPS的时间遍历一次

	cocos2d::CCArray *_targets;
	cocos2d::CCArray *_projs;
	int _successCount; //打怪数
protected:
	

};

#endif // __HELLOWORLD_SCENE_H__
GameScene.cpp  实现精灵、动作、场景切换、碰撞检测、计算分数等

#include "GameScene.h"
#include "SimpleAudioEngine.h"
#include "GameOverLayer.h"
USING_NS_CC;

CCScene* GameScene::scene()
{
	// 'scene' is an autorelease object
	auto scene = CCScene::create();

	// 'layer' is an autorelease object
	auto layer = GameScene::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 GameScene::init()
{
	//
	
	if ( !CCLayerColor::initWithColor(ccc4(255,0,0,255)) )
	{
		return false;
	}

	//杀怪数
	_successCount = 0;
	//创建精灵
	CCSize screenSize = CCDirector::sharedDirector()->getVisibleSize();
	CCSprite* player = CCSprite::create("Player.png");
	player->setPosition(ccp(20,screenSize.height/2));
	this->addChild(player);


	//工厂方法 Class::create 不需要手动释放
	//new 则需要手动释放
	_projs = new CCArray;
	_targets = new CCArray;

	//菜单的使用
	/*CCMenuItemImage* item = CCMenuItemImage::create("button2.png",
		"button2.png","button2.png",this,menu_selector(GameScene::responseFunc));
	item->setPosition(ccp(30,30));
	CCMenu* menu= CCMenu::create(item,NULL);
	this->addChild(menu);*/


	this->schedule(schedule_selector(GameScene::gameLogic),2);
	this->schedule(schedule_selector(GameScene::update),1/60);
	this->setTouchEnabled(true);

	CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background-music-aac.wav",true);
	return true;
}
void GameScene::update(float delta) //delta = 1s/fps
{
	CCArray* targetToDelete = new CCArray;
	CCArray* projToDelete = new CCArray;

	CCObject* itarget;
	CCObject* iproj;
	CCARRAY_FOREACH(_targets,itarget)
	{
		CCSprite* target=(CCSprite*)itarget;
		CCRect targetZone = CCRectMake(target->getPositionX(),
			target->getPositionY(),target->getContentSize().width,
			target->getContentSize().height);

		CCARRAY_FOREACH(_projs,iproj)
		{
			CCSprite* proj=(CCSprite*)iproj;
			CCRect projZone = CCRectMake(proj->getPositionX(),
				proj->getPositionY(),proj->getContentSize().width,
				proj->getContentSize().height);

			if(projZone.intersectsRect(targetZone))
			{
				if(_successCount++>5){
					CCScene* overScene = GameOverLayer::scene();
					//CCScene->GameOverLayer->Label

					GameOverLayer* overLayer = (GameOverLayer*) overScene->getChildByTag(100);
					overLayer->_label->setString("Man,you Rock!");

					CCDirector::sharedDirector()->replaceScene(overScene);
				}
				projToDelete->addObject(iproj);
				targetToDelete->addObject(itarget);
			}
		}
	}//end of iterate
	CCARRAY_FOREACH(projToDelete,iproj)
	{
		_projs->removeObject(iproj);
		CCSprite* proj=(CCSprite*)iproj;
		proj->removeFromParentAndCleanup(true);
	}

	CCARRAY_FOREACH(targetToDelete,itarget)
	{
		_targets->removeObject(itarget);
		CCSprite* target=(CCSprite*)itarget;
		target->removeFromParentAndCleanup(true);
	}

	targetToDelete->release();
	projToDelete->release();
}
void GameScene::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
	CCTouch* touch = (CCTouch*)pTouches->anyObject();
	CCPoint locInView = touch->getLocationInView();
	CCPoint loc = CCDirector::sharedDirector()->convertToGL(locInView);

	if(loc.x <=20)
	{

		return;
	}
	CCSize screenSize = CCDirector::sharedDirector()->getVisibleSize();
	CCSprite* proj = CCSprite::create("Projectile.png");
	proj->setPosition(ccp(20,screenSize.height/2));
	this->addChild(proj);

	CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("pew-pew-lei.wav");
	_projs->addObject(proj);
	proj->setTag(2);
	double dx = loc.x-20;
	double dy = loc.y-screenSize.height/2;
	double d = sqrt(dx*dx + dy*dy);
	double D = sqrt(screenSize.width*screenSize.width+screenSize.height*screenSize.height);

	double ratio = D/d;
	double endx = ratio *dx +20;
	double endy = ratio * dy+screenSize.height/2;
	CCMoveTo* move=CCMoveTo::create(D/320,ccp(endx,endy));
	CCCallFuncN* moveFinish = CCCallFuncN::create(this,
		callfuncN_selector(GameScene::myDefine));
	CCSequence* actions = CCSequence::create(move,moveFinish,NULL);
	proj->runAction(actions);
}




GameScene::~GameScene()
{
	if(_projs!=NULL)
		_projs->release();

	if(_targets!=NULL)
		_targets->release();
}

void GameScene::gameLogic(float dt)
{
	this->createTarget();
}
void GameScene::createTarget()
{
	CCSize screenSize = CCDirector::sharedDirector()->getVisibleSize();
	//添加怪物并直接移动到消失
	CCSprite* mytarget = CCSprite::create("Target.png");
	int y = rand() % (int)screenSize.height;
	mytarget->setPosition(ccp(screenSize.width-20,y));
	this->addChild(mytarget);
	_targets->addObject(mytarget);
	mytarget->setTag(1);

	CCMoveTo* move = CCMoveTo::create(2,ccp(0,y));
	CCCallFuncN* disappear = CCCallFuncN::create(this,
		callfuncN_selector(GameScene::myDefine));
	CCSequence* actions = CCSequence::create(move,disappear,NULL);
	mytarget->runAction(actions);
}
void GameScene::responseFunc(CCObject* obj)
{
	//CCLOG("menue item clicked");
	CCMoveTo* move = CCMoveTo::create(2,ccp(0,40));
	CCCallFuncN* disappear = CCCallFuncN::create(this,
		callfuncN_selector(GameScene::myDefine));
	CCSequence* actions = CCSequence::create(move,disappear,NULL);
	target->runAction(actions);
}
void GameScene::myDefine(CCNode* who)
{
	//who->setPosition(ccp(0,0));
	//who->setScale(2);
	who->removeFromParentAndCleanup(true);

	int tag = who->getTag();
	if(1==tag)
	{
		_targets->removeObject(who);
		CCScene* overScene = GameOverLayer::scene();
		//CCScene->GameOverLayer->Label

		GameOverLayer* overLayer = (GameOverLayer*) overScene->getChildByTag(100);
		overLayer->_label->setString("Man,you suck!");

		CCDirector::sharedDirector()->replaceScene(overScene);

	}
	else if(2==tag)
	{
		_projs->removeObject(who);
	}
}
void GameScene::menuCloseCallback(CCObject* pSender)
{
	CCDirector::sharedDirector()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
	exit(0);
#endif
}
GameOverLayout.h  用于显示游戏结果

#include "cocos2d.h"

//不用USING_NS_CC,避免污染其他环境
class GameOverLayer : public cocos2d::CCLayerColor
{
public:
	bool init();
	cocos2d::CCLabelTTF* _label;
	~GameOverLayer();

	//create scene,相互依赖,方便切换
	static cocos2d::CCScene* scene();

	CREATE_FUNC(GameOverLayer);
	void returnToGame(cocos2d::CCNode*);
	//CCLabelTTF::create() 要先设置一个宏变量,使用create则执行init
};
GameOverLayout.cpp 实现显示结果和自动切回主游戏场景

#include "GameOverLayer.h"
#include "GameScene.h"
USING_NS_CC;
bool GameOverLayer::init()
{
	if(CCLayerColor::initWithColor(ccc4(0,255,0,255)))
	{
		_label = CCLabelTTF::create("word","Artial",40);

		CCSize size = CCDirector::sharedDirector()->getVisibleSize();
		_label->setPosition(ccp(size.width/2,size.height/2));
		this->addChild(_label);

		_label->retain(); //保证label不被autorelease,和layer有同样生命周期

		CCDelayTime* delay = CCDelayTime::create(5);
		CCCallFuncN* returnToGame = CCCallFuncN::create(this,
			callfuncN_selector(GameOverLayer::returnToGame));

		this->runAction(CCSequence::create(delay,returnToGame,NULL));


		return true;
	}
	return false;
}

GameOverLayer::~GameOverLayer()
{
	if(_label)
	{
		_label->release();
	}
}

cocos2d::CCScene* GameOverLayer::scene()
{
	CCScene* scene = CCScene::create();
	GameOverLayer* layer = GameOverLayer::create();
	layer->setTag(100);
	scene->addChild(layer);

	return scene;
}

void GameOverLayer::returnToGame(CCNode*)
{
	CCDirector::sharedDirector()->replaceScene(GameScene::scene());
}

注意文件位置以及游戏过程调用和变量的生命周期


游戏结果截图:


(最后感谢,cocos2d-x简单入门视频教学   云盘位置:http://pan.baidu.com/s/1ELk78#dir/path=%2Fcocos2dx-%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值