核心代码:
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;
}
}
}