过了将近一个月了,终于之前说的主机与敌机,子弹与敌机,子弹与主机的碰撞问题解决,太开心了,写出自己的东西就是开心,等下把那块代码贴上来,顺带上一些我写的游戏的图片。
我定义了个子弹类,用来主机发射子弹用的,因为敌机与主机的方向不同,所以,敌机的子弹写到敌机类中,由于子弹类中需要用到主机的位置并且主机只有一个,所以我将主机定义成了一个单列变量,以便读取其位置。说到子弹,由于子弹有很多,会无数的发射,所以我首先用CCSpriteBatchNode,CCSpriteBatchNode是cocos2d-x为了降低渲染批次而建立的一个专门管理精灵的类。所以用他管理子弹,然后定义数组,将CCSpriteBatchNode中图片保存在CCArray中,循环10次,重复用这10张图片,敌机也是同样的理。(由于刚学,所以可能会有很多不够优化,或是方法有问题,还请大家海涵)
子弹类,主机类,敌机类,都是层,最终加入GameSence场景中,在该场景中实现所谓的碰撞检测逻辑。实现这一步,大概整个游戏差不多了。另外背景层的话,我是单独定义一个背景层用来实现背景的移动。好吧,下面给出一些代码~~
子弹的创建:
void BulletSprite::Create() { batch=CCSpriteBatchNode::create("bullet2.png"); batch->getTexture()->setAliasTexParameters(); addChild(batch); bulletArr=CCArray::create(); bulletArr->retain(); num=0; for(int i=0;i<10;i++) { bSprite=CCSprite::createWithTexture(batch->getTexture()); bulletArr->addObject(bSprite); } } void BulletSprite::moving(float dt) { auto PlanePos =FlySprite::sharedPlane->getChildByTag(AIRFLY)->getPosition(); bulletX=PlanePos.x; bulletY=PlanePos.y+40; Sprite=(CCSprite* )bulletArr->objectAtIndex(num); //根据索引获得对象,所以这里是根据Num得到数组中的元素 Sprite->setPosition(ccp(bulletX,bulletY)); this->addChild(Sprite,1); //当前对象要移动的位置 move=CCMoveTo::create(0.5f,ccp(bulletX,visibleSize.height)); CCActionInstant *funcN=CCCallFuncN::create(this,callfuncN_selector(BulletSprite::removeBullet)); Sprite->runAction(CCSequence::create(move,funcN,NULL)); num++; if(num>=10) num=0; } void BulletSprite::removeBullet(CCNode *p) { CCSprite *sp=(CCSprite*)p; this->removeChild(sp); }
//敌军和主机的碰撞,主机减分,敌机死亡 void GameScene::update(float dt) { sp1=(CCSprite*)eSprite->enemyArr->objectAtIndex(eynum); sp1->setVisible(true); if(fSprite->getBoundingBox().intersectsRect(sp1->boundingBox())) { //爆炸效果 kill(sp1); this->removeChild(sp1); sp1->setVisible(false); move=CCMoveTo::create(0.001f,ccp(-1,-1)); sp1->runAction(move); fSprite->life--; if(fSprite->life==0) { //this->removeChild(fSprite); CCScene *s=EndScene::scene(); CCDirector::sharedDirector()->replaceScene(s); } } eynum++; if(eynum>=10) eynum=0; }
//碰撞爆炸效果,图片资源来自cocos2d-x中的samplesJavascriptSharedgamesMoonWarriors
void GameScene::kill(CCSprite *sp) { CCSpriteFrameCache *cache=CCSpriteFrameCache::sharedSpriteFrameCache(); cache->addSpriteFramesWithFile("explosion.plist"); CCSprite *ex=CCSprite::createWithSpriteFrameName("explosion_01.png"); ex->setPosition(ccp(sp->getPositionX(),sp->getPositionY())); this->addChild(ex); CCArray *arr=CCArray::createWithCapacity(14); char str[50]={0}; for(int i=1;i<15;i++) { sprintf(str,"explosion_%02d.png",i); CCSpriteFrame *frame=cache->spriteFrameByName(str); arr->addObject(frame); } CCAnimation *animation=CCAnimation::createWithSpriteFrames(arr,0.02f); CCActionInstant *funcN=CCCallFuncN::create(this,callfuncN_selector(GameScene::remove)); ex->runAction(CCSequence::create(CCAnimate::create(animation),NULL)); } void GameScene::remove(CCNode *p) { CCSprite *sp=(CCSprite*)p; this->removeChild(sp); }
主要代码大概是这样,路漫漫~~~继续学习吧~~~ (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|