首页 > 代码库 > 《一个都不能死》游戏设计及实现

《一个都不能死》游戏设计及实现

声明:本文是本人在网上看视频后作出的作品,并非真实原创(动画部分自己实现的,总结自己总结的),感谢一下勇于分享的人,你们的付出也是激励我们前进的动力,谢谢!!!此致敬礼(哈哈哈,扯系列之逗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




《一个都不能死》游戏设计及实现