声明:本文是本人在网上看视频后作出的作品,并非真实原创(动画部分自己实现的,总结自己总结的),感谢一下勇于分享的人,你们的付出也是激励我们前进的动力,谢谢!!!此致敬礼(哈哈哈,扯系列之逗X生活欢乐多!)
下面开始正文:
《一个都不能死》游戏的设计及说明:
GameScen :继承自 Layer
创建 GameController 传过去 当前layer 和 Y坐标
创建一个集合,gcs 存放所有创建的 GameController 对象,进行碰撞检测
设置两个监听事件:
1. 碰撞监听
auto listen = EventListenerPhysicsContact::create();
listen->onContactBegin =[=](PhysicsContact &contact){
Director::getInstance()->replaceScene(GameOver::creteScene());
log("哇塞!!,我撞到了哎");
return true;
};
//分发事件
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listen,this);
2. touch监听
//添加touch事件
auto listener= EventListenerTouchOneByOne::create();
listener->onTouchBegan = [=](Touch *t,Event *e){
for (auto it = gcs.begin();it!=gcs.end();it++){
if ((*it)->hitTestPoint(t->getLocation())){
(*it)->onUserTouch();
break;
}
}
return true;
};
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener,this);
设置一个定时器:
void GameScene::update(float t){
for (auto it = gcs.begin();it!=gcs.end();it++ ){
(*it)->onupdate(t);
}
}
Block :继承自 Sprite
障碍物
设置 随机宽高,出屏幕删除
设置颜色,setTextureRect()为其制定区域
设置contentSize();
setPhysicsBody(PhysicsBody::createBox(size));//指定 物理 body 必须!!!
getPhysicsBody()->setContactTestBitmask(1);//设置碰撞标识,默认是不检测碰撞的 //设置参与碰撞
getPhysicsBody()->setDynamic(false);//默认是动态物体,受重力的影响,如果不设置会把小人 堵在那里!!
回调函数让 木块一直向左走,出屏幕清除
Edge : 继承自 Node
添加边界框 防止 小人 下落出屏幕
Size size = Director::getInstance()->getVisibleSize();
//创建边界框
setPhysicsBody(PhysicsBody::createEdgeBox(size));
setContentSize(size);
GameOver :继承自 LayerColor 结束的界面 (有一个label 一个 Menu 知识提醒的作用) 但是这里设置点击 屏幕的时候就退出了
此处省略 20 行代码。。。。。。 呵呵
GameController :继承自 Ref 这里面是主要的设计的关键,因为要创建个数不定的小人,在 GameScene中 向 GameController中传递 layer 和 位置 就可以了
所以在这里要重写 create、init 参数为 (Layer *layer,Float postion ) 方法
这里主要是创建:
边框
Hero
地板:
auto ground = Sprite::create();//这个奏是一个精灵,嘚瑟
设置颜色 //个人比较喜欢黄色。。。。。。3B 喔
setTextureRect设置区域
位置
Hero : 继承自 Sprite ,因为小人要运动,所以在 GameController中创建的时候要传进来 一个plist文件,通过下面的语句创建
重写的create方法:
Hero *Hero::create(std::string fileName){
Hero *hero = new Hero();
if(hero && hero->init(fileName)){
hero->autoRealease();
return hero;
}
CC_SAFE_DELETE(hero);
hero= null;
return hero;
}
重写的init方法:
Hero *Hero::init(std::string fileName){
if(!Sprite::init()){
return false;
}
//根据 传进来的文件创建 动画
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(fileName);
Animation *ani = Animation::create();
for(int i =0;i<4;i++){
std::string strName = StringUtily::Formate("majinajie%d.png",i);
SpriteFrame *sp = SpriteFrameCache::getinstance()->addSpriteFrameByName(strName);
ani->addSpriteFrame(sp);
}
ani->setDelayPerUnit(0.1);
ani->setLoops(-1);
auto amt = Animate::create(ani);
this->runAction(amt);
return true
}
getPhysicsBody()->setContactTestBitmask(1);//设置碰撞标识,默认是不检测碰撞的
以上基本就是我总结的,有不完善的地方,由于时间原因,只是出了个模型,以后有时间会完善,下面 附截图和源码下载地址: http://pan.baidu.com/s/1eQFzNj0