懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 )
《喵汪大战》原作者:bill_man http://my.csdn.net/bill_man
闲话不说继续开搞《喵汪大战》(完美运行在vs2012+cocos2dx2.2的版本点此下载)
上回把编译错误的9个bug连蒙带诌的解决掉了
还剩了个运行时bug:就是运行一小会游戏必崩
跑了几次发现好像每次骨头(真骨头,小狗扔的骨头)移出屏幕时就蹦
难道是子弹的原因?
删除子弹相关的确实ok了
过了一天
重新编译了一次
发现跟子弹没关系正常运行了
这个游戏跟之前的《战神传说》应该是一个模子出来的:
所以简单一过:
=========================================
欢迎界面:GameMenuScene.cpp
主要贴背景图,贴logo,放三个CCMenuItemImage按钮,和一个声音控制按钮:
注意cocos2dx 2。2版本较之前版本的变化:
//SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic( CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("background.mp3") );
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("background.mp3");
其实我不太喜欢去学习新旧版本的变化
因为这实在是,这些变化可能只是框架开发者改改方法名改改参数等,掌握其思想更好些。
void GameMenu::onEnter() 方法里,让各个元素动画方式出现。
游戏界面:GameScene.cpp
左边三个猫表示生命,简单的贴精灵来实现
右边的分数,根据每位的数字来贴图。[1.png][2.png][3.png]...
敌人GameObjEnemy.cpp 和敌人子弹GameEnemyBullet.cpp:
敌人呢,始终有三个,根据贝塞尔曲线来移动。
void GameObjEnemy::movestart(){
islife = true;
int type = CCRANDOM_0_1() * 4;
//贝塞尔曲线移动
ccBezierConfig bezier2;
bezier2.controlPoint_1 = CCPointMake(this->getPosition().x - 400,330);
bezier2.controlPoint_2 = CCPointMake(this->getPosition().x + 400,280);
bezier2.endPosition = CCPointMake(this->getPosition().x,-70);
CCBezierTo * bezierBy2 = CCBezierTo::create(6, bezier2);
ccBezierConfig bezier1;
bezier1.controlPoint_1 = CCPointMake(this->getPosition().x + 400,330);
bezier1.controlPoint_2 = CCPointMake(this->getPosition().x - 400,280);
bezier1.endPosition = CCPointMake(this->getPosition().x,-70);
CCBezierTo * bezierBy1 = CCBezierTo::create(6, bezier1);
switch(type){
case 0:
case 1:
this->runAction(CCSequence::create(CCMoveBy::create(6,ccp(0,-600)),CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::restart)),NULL));
break;
case 2:
this->runAction(CCSequence::create(bezierBy2,CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::restart)),NULL));
break;
case 3:
this->runAction(CCSequence::create(bezierBy1,CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::restart)),NULL));
break;
}
schedule(schedule_selector(GameObjEnemy::releasebullet), 1.2f);
}
并且有个死亡动画:就是根据状态来显示一个帧动画。
敌人子弹类也很简单,先初始化,然后运行两个action,一个自己旋转,一个朝下移动,溢出屏幕之外就停止动画。
主角类GameObjHero.cpp和主角子弹类GameHeroBullet.cpp:
主角类的动画比较多,尾巴能动,两个胳膊也能动。
主要是跟随触摸移动那块比较麻烦
下面方法是判断是否按到主角的矩形区域内
bool GameObjHero::containsTouchLocation(CCTouch* touch)
{
return rect().containsPoint(convertTouchToNodeSpaceAR(touch));
//return CCRect::CCRectContainsPoint(, );
}
下面方法如果按住了主角,则开始记录下触摸位置
bool GameObjHero::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
if(((GameMain *)this->getParent())->isover)
return false;
if(! containsTouchLocation(touch)){
return false;
}else{
//获得触摸偏移位置
iscontrol = true;
//CCPoint touchPoint = touch->locationInView();
CCPoint touchPoint=touch->getLocationInView();
touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);
offset.x = touchPoint.x - this->getPosition().x;
offset.y = touchPoint.y - this->getPosition().y;
}
return true;
}
下面方法是触摸移动的回调,主要是让主角的位置跟着触摸来走。
void GameObjHero::ccTouchMoved(CCTouch* touch, CCEvent* event)
{
if(iscontrol){
CCPoint touchPoint = touch->getLocationInView();
touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);
//设置左右手上下
float x = touchPoint.x - offset.x;
float y = touchPoint.y - offset.y;
if(x < this->getPosition().x){
lefthand->setFlipY(true);
righthand->setFlipY(false);
}else{
lefthand->setFlipY(false);
righthand->setFlipY(true);
}
this->setPosition(x,y);
}
}
以下方法,修改标记,让主角的猫停止跟随触摸移动。
void GameObjHero::ccTouchEnded(CCTouch* touch, CCEvent* event)
{
if(iscontrol){
iscontrol = false;
lefthand->setFlipY(false);
righthand->setFlipY(false);
}
}
主角子弹类同敌人子弹类。
主要逻辑类:GameScene.cpp
首先:初始化各个元素:主角,敌人,子弹等
其次:在void GameMain::update(float time)主要循环里做两件事:
1 循环背景:
//背景移动逻辑
bg1->setPosition(ccp(bg1->getPosition().x,bg1->getPosition().y - 2));
bg2->setPosition(ccp(bg2->getPosition().x,bg2->getPosition().y - 2));
if(bg2->getPosition().y < 0){
float temp = bg2->getPosition().y + 480;
bg1->setPosition(ccp(bg2->getPosition().x,temp));
}
if(bg1->getPosition().y < 0){
float temp = bg1->getPosition().y + 480;
bg2->setPosition(ccp(bg1->getPosition().x,temp));
}
2 判断是否中弹
bool GameMain::isCollion(CCPoint p1,CCPoint p2,int w1,int h1,int w2,int h2){
//判断两个矩形是否碰撞
if(abs(p1.x - p2.x) < w1 + w2 && abs(p1.y - p2.y) < h1 + h2){
return true;
}
return false;
}
3 如果中弹,调用主角的中弹方法,生命-1,生命减没了就结束游戏。
ok!
------------------- 飞船起飞--------------------
Cocos2dx游戏开发系列笔记16:来个Demo:《喵汪大战》之cocos2dx版本移植问题
Cocos2dx游戏开发系列笔记15.1:添加虚拟摇杆SneakyInput
Cocos2dx游戏开发系列笔记14:一个横版拳击游戏Demo-下(让游戏跑在手机上)
Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo-中
Cocos2dx游戏开发系列笔记12:一个横版拳击游戏Demo-上
Cocos2dx游戏开发系列笔记11:解 刨《战神传说》完结篇
Cocos2dx游戏开发系列笔记9:android手机上运行《战神传说》,并解决横竖屏即分辨率自适应问题
Cocos2dx游戏开发系列笔记8:开搞一个射击游戏《战神传说》//就个打飞机的
Cocos2dx游戏开发系列笔记7:一个简单的跑酷游戏《萝莉快跑》的消化(附下载)
Cocos2dx游戏开发系列笔记6:怎样让《萝莉快跑》的例子运行在vs和手机上
Cocos2dx游戏开发系列笔记5:继续润色《忍者飞镖射幽灵》
Cocos2dx游戏开发系列笔记4:怎样新加一个Scene类?
Cocos2dx游戏开发系列笔记3:牛刀小试->忍者飞镖射幽灵的Demo
Cocos2dx游戏开发系列笔记2:一个刚创建的cocos2dx中的demo里都有什么
Cocos2dx游戏开发系列笔记1:一个崭新的开始,cocos2dx2.2+ndkr9+Cygwin+vs2012游戏开发环境搭建
-------------------- 飞船降落--------------------
骨头在写最近几篇日志的时候
哲哲就在旁边制作这个可爱的小猫
一针一线
一丝不苟
有喜欢的人
并且跟喜欢的人一起做各自喜欢的事情
这大概就是幸福了