核心代码:
MapScene类-----游戏场景类
MapScene.h
#ifndef __MAPSCENE_H__ #define __MAPSCENE_H__ #pragma once #include "cocos2d.h" #include "GamePlayer.h" #include "GameBullet.h" #include "GameEnemy.h" #include "SimpleAudioEngine.h" using namespace cocos2d; class MapScene : public CCLayer { private: //粒子系统类 CCParticleSystem* m_emitter; //玩家飞机发出的子弹 CCArray * bullets; //敌机发出的子弹 CCArray * enemybullets; //步进索引值,相当于一个标志位 //stepindex = -5; 触摸到玩家飞机时 //stepindex = -1; 初始化 //stepindex = 0 玩家和敌机碰撞 int stepindex; int xdelta; int ydelta; //玩家的生命数目 byte playerlife; //背景图片1 CCSprite* maplayer1; //背景图片2 CCSprite* maplayer2; //3张生命图片 CCSprite* life1; CCSprite* life2; CCSprite* life3; //isreduce = false;正常 //isreduce = false;无敌 bool isreduce; //玩家 GamePlayer* player; //enemy GameEnemy* enemy; //int smallstepindex; //int startx; //int starty; //double xstep; //double ystep; public: //初始化 virtual bool init(); //减少一个生命 void MapScene::reduceLife(); //设置isreduce void MapScene::resetreduce(float dt); void MapScene::enemyrestart(float dt); //实时刷新 void MapScene::update(float dt); //导入MapScene static cocos2d::CCScene* scene(); //处理触摸事件 virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent); //触摸玩家飞机后,发射子弹 void MapScene::resettouch(float dt); //int vmove; //int hmove; //CCSprite* m_tamara; CREATE_FUNC(MapScene); }; #endif
MapScene.cpp
#include "MapScene.h" #include "GamePlayer.h" #include <math.h> using namespace cocos2d; CCScene* MapScene::scene() { CCScene * scene = NULL; do { // 'scene' is an autorelease object scene = CCScene::node(); CC_BREAK_IF(! scene); // 'layer' is an autorelease object MapScene *layer = MapScene::create(); CC_BREAK_IF(! layer); // add layer as a child to scene scene->addChild(layer); } while (0); //CCDirector::sharedDirector()->setDeviceOrientation(CCDeviceOrientationPortrait); // return the scene return scene; } // on "init" you need to initialize your instance bool MapScene::init() { //play music CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background-music.mp3", true); playerlife = 3; stepindex = -1; isreduce = false; CCSize size = CCDirector::sharedDirector()->getWinSize(); //生命图片 life1 = CCSprite::spriteWithFile("life.png"); life2 = CCSprite::spriteWithFile("life.png"); life3 = CCSprite::spriteWithFile("life.png"); life1->setPosition(ccp(20,20)); life2->setPosition(ccp(30,20)); life3->setPosition(ccp(40,20)); this->addChild(life1,1,300); this->addChild(life2,1,301); this->addChild(life3,1,302); //背景图片1 maplayer1 = CCSprite::spriteWithFile("back_img1.png"); //背景图片2 maplayer2 = CCSprite::spriteWithFile("back_img1.png"); maplayer1->setAnchorPoint(ccp(0,0)); maplayer2->setAnchorPoint(ccp(0,0)); maplayer1->setPosition( ccp(0,0) ); maplayer1->setScaleX(2.0); maplayer2->setPosition( ccp(0,512) ); maplayer2->setScaleX(2.0); this->addChild(maplayer1, 0 ,1); this->addChild(maplayer2, 0 ,2); player = new GamePlayer("player.png"); enemy = new GameEnemy("e6.png"); //初始化玩家 //player->setPosition(ccp(122,30)); player->setPosition(ccp(size.width/2-100,30)); //enemy->setPosition(ccp(122,400)); this->addChild((player->getsprite()),2,0); this->addChild((enemy->getsprite()), 2,100); this->addChild((player->getstreak()),1); m_emitter = new CCParticleSystemQuad(); m_emitter->initWithFile("ExplodingRing.plist"); m_emitter->setVisible(false); this->addChild(m_emitter, 10); setTouchEnabled(true); //调用update方法 scheduleUpdate(); //初始化玩家飞机发出的子弹 bullets = CCArray::arrayWithCapacity(10); for(int i = 0;i < bullets->capacity();i ++){ GameBullet * mybullet = new GameBullet("bullet.png"); CCPoint herop = (player->getsprite())->getPosition(); CCSize herosize = (player->getsprite())->getContentSize(); mybullet->setPosition(ccp(herop.x,herop.y + herosize.height)); mybullet->setType(0); (mybullet->getsprite())->setVisible(false); this->addChild((mybullet->getsprite()), 200 + i); bullets->addObject(mybullet); } bullets->retain(); //初始化敌机发出的子弹 enemybullets = CCArray::arrayWithCapacity(20); for(int i = 0;i < enemybullets->capacity();i ++){ GameBullet * mybullet = new GameBullet("bullet3456.png"); (mybullet->getsprite())->setVisible(false); mybullet->setType(1); this->addChild((mybullet->getsprite()), 400 + i); enemybullets->addObject(mybullet); } enemybullets->retain(); return true; } void MapScene::update(float dt) { //调整背景图片,形成循环动态效果 CCSize size = CCDirector::sharedDirector()->getWinSize(); CCPoint maplayer1p = maplayer1->getPosition(); CCPoint maplayer2p = maplayer2->getPosition(); maplayer1->setPosition(ccp(maplayer1p.x,maplayer1p.y - 2)); maplayer2->setPosition(ccp(maplayer2p.x,maplayer2p.y - 2)); if(maplayer2p.y < 0){ //float temp = maplayer2p.y + 512; float temp = maplayer2p.y + size.height; maplayer1->setPosition(ccp(maplayer1p.x,temp)); } if(maplayer1p.y < 0){ //float temp = maplayer1p.y + 512; float temp = maplayer1p.y + size.height; maplayer2->setPosition(ccp(maplayer2p.x,temp)); } //判断飞机是否与敌机子弹碰撞 //首先判断玩家飞机是否无敌状态 if(!isreduce){ for(int i = 0;i < enemybullets->capacity();i ++){ GameBullet * mybullet = (GameBullet *)(enemybullets->objectAtIndex(i)); //如果敌机子弹为可见状态,并且子弹和玩家飞机碰撞 if((mybullet->getsprite())->isVisible() && player->iscollision(mybullet)){ (mybullet->getsprite())->setVisible(false); reduceLife(); } } } //显示敌机子弹,当bullettick == 59时,遍历敌机子弹,并将显示 if(enemy->getState() != -1){ //逻辑主要是处理当敌机不在界面内时,让敌机重新生成 //并且对标志位bullettick,进行计数和清零 enemy->tick(); if(enemy->getBulletTick() == 59){ CCPoint enemyp = (enemy->getsprite())->getPosition(); CCSize enemysize = (enemy->getsprite())->getContentSize(); for(int i = 0;i < enemybullets->capacity();i ++){ GameBullet * mybullet = (GameBullet *)(enemybullets->objectAtIndex(i)); if(! (mybullet->getsprite())->isVisible()){ mybullet->setPosition(ccp(enemyp.x,enemyp.y - enemysize.height)); (mybullet->getsprite())->setVisible(true); break; } } } //如果玩家和敌机碰撞,就爆炸 if(!isreduce && enemy->iscollision(player)){ stepindex = 0; enemy->setDead(); m_emitter = new CCParticleSystemQuad(); m_emitter->initWithFile("ExplodingRing.plist"); m_emitter->setVisible(true); m_emitter->setPosition((enemy->getsprite())->getPosition()); this->addChild(m_emitter, 10); reduceLife(); schedule(schedule_selector(MapScene::enemyrestart), 2.0f); }else{ for(int i = 0;i < bullets->capacity();i ++){ GameBullet * mybullet = (GameBullet *)(bullets->objectAtIndex(i)); //如果敌机和玩家飞机子弹碰撞,也爆炸 if((mybullet->getsprite())->isVisible() && enemy->collisionwithbullet(mybullet)){ enemy->setDead(); (mybullet->getsprite())->setVisible(false); m_emitter = new CCParticleSystemQuad(); m_emitter->initWithFile("ExplodingRing.plist"); m_emitter->setVisible(true); m_emitter->setPosition((enemy->getsprite())->getPosition()); this->addChild(m_emitter, 10); schedule(schedule_selector(MapScene::enemyrestart), 2.0f); } } } } for(int i = 0;i < bullets->capacity();i ++){ GameBullet * mybullet = (GameBullet *)(bullets->objectAtIndex(i)); if((mybullet->getsprite())->isVisible()){ //调整玩家子弹的位置 mybullet->tick(); //如果玩家子弹出了屏幕之外,就不显示 if((mybullet->getsprite())->getPosition().y > size.height){ (mybullet->getsprite())->setVisible(false); } } } for(int i = 0;i < enemybullets->capacity();i ++){ GameBullet * mybullet = (GameBullet *)(enemybullets->objectAtIndex(i)); if((mybullet->getsprite())->isVisible()){ //调整敌机子弹的位置 mybullet->tick(); //如果敌机子弹出了屏幕之外,就不显示 if((mybullet->getsprite())->getPosition().y < 0){ (mybullet->getsprite())->setVisible(false); } } } } void MapScene::reduceLife() { (player->getsprite())->stopAllActions(); switch(playerlife){ case 3: life1->setVisible(false); playerlife --; break; case 2: life2->setVisible(false); playerlife --; break; case 1: life3->setVisible(false); playerlife --; break; } CCActionInterval* action = CCBlink::actionWithDuration(2, 2); (player->getsprite())->runAction(action); schedule(schedule_selector(MapScene::resetreduce), 5.0f); isreduce = true; } //设置isreduce void MapScene::resetreduce(float dt){ isreduce = false; } void MapScene::enemyrestart(float dt) { enemy->restart(); unschedule(schedule_selector(MapScene::enemyrestart)); } void MapScene::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) { CCLog("ccTouchesBegan"); CCSetIterator it = pTouches->begin(); CCTouch* touch = (CCTouch*)(*it); //CCPoint m_tBeginPos = touch->locationInView( touch->view() ); CCPoint m_tBeginPos = touch->getLocation(); //m_tBeginPos = CCDirector::sharedDirector()->convertToGL( m_tBeginPos ); CCPoint herop = (player->getsprite())->getPosition(); CCSize herosize = (player->getsprite())->getContentSize(); //如果按的位置是在玩家飞机的上面 if(m_tBeginPos.x > herop.x - herosize.width/2 && m_tBeginPos.x < herop.x + herosize.width/2 && m_tBeginPos.y > herop.y - herosize.height/2 && m_tBeginPos.y < herop.y + herosize.height/2){ stepindex = -5; xdelta = m_tBeginPos.x - herop.x; ydelta = m_tBeginPos.y - herop.y; //schedule(schedule_selector(MapScene::resettouch), 1.0f); schedule(schedule_selector(MapScene::resettouch), 0.5f); } } //移动的时候,更新玩家飞机的位置 void MapScene::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) { CCLog("ccTouchesMoved"); CCSetIterator it = pTouches->begin(); CCTouch* touch = (CCTouch*)(*it); //CCPoint touchLocation = touch->locationInView( touch->view() ); CCPoint touchLocation = touch->getLocation(); //touchLocation = CCDirector::sharedDirector()->convertToGL( touchLocation ); if(stepindex == -5){ CCPoint herop = (player->getsprite())->getPosition(); CCPoint lastone = ccp(herop.x + xdelta,herop.y + ydelta); CCSize winSize = CCDirector::sharedDirector()->getWinSize(); if(touchLocation.x >= 0 && touchLocation.x <= winSize.width && touchLocation.y >= 0 && touchLocation.y <= winSize.height){ if(lastone.x != touchLocation.x || lastone.y != touchLocation.y){ player->setPosition(ccp(touchLocation.x - xdelta,touchLocation.y - ydelta)); } } } } void MapScene::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) { CCLog("ccTouchesEnded"); if(stepindex == -5){ unschedule(schedule_selector(MapScene::resettouch)); stepindex = -1; } } void MapScene::resettouch(float dt){ CCLog("resettouch"); CCPoint herop = (player->getsprite())->getPosition(); CCSize herosize = (player->getsprite())->getContentSize(); for(int i = 0;i < bullets->capacity();i ++){ GameBullet * mybullet = (GameBullet *)(bullets->objectAtIndex(i)); //玩家飞机发射子弹 if(! (mybullet->getsprite())->isVisible()){ mybullet->setPosition(ccp(herop.x,herop.y + herosize.height)); (mybullet->getsprite())->setVisible(true); break; } } }