cocos2d-x学习(4)---游戏实例开发:一个简单的射击游戏三

核心代码:

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;
		  }
	   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hfreeman2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值