本篇博客来添加玩家飞机并且让飞机跟随手指的方向移动。首先,我们需要新建一个玩家类,这个类应该继承自Sprite,在初始化函数中,通过调用父类的initWithSpriteFrameName方法,传入一张纹理图片来使我们的玩家飞机有了图片。同时在该类中我们还要封装飞机的动画,下面是具体的代码实现。

#ifndef _PLAYER_H_
#define _PLAYER_H_
#include "cocos2d.h"

USING_NS_CC;

//继承自Sprite
class Player : public Sprite
{
public:
	Player(void);
	~Player(void);
public:
	bool init();
	CREATE_FUNC(Player);
	//飞机的动作
	void flyAction();
};

#endif
#include "Player.h"

Player::Player(void)
{
}

Player::~Player(void)
{
}

bool Player::init()
{
	//先初始化父类的init函数
	if(!Sprite::init())
		return false;

	//调用父类的initWithSpriteFrameName函数,传入framename,这样我们的player就有了图片了,在MainGame中
	//首先要将用到的纹理加载进精灵帧缓存
	this->initWithSpriteFrameName("hero1.png");
	//播放飞机的动画
	this->flyAction();

	return true;
}

//飞机的动画
void Player::flyAction()
{
	//这里使用另一种方式来播放动画
	Vector<SpriteFrame *> vector;
	for(int i=0;i<2;i++)
	{
		auto frameName = __String::createWithFormat("hero%d.png",i+1);
		auto temSpriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName(frameName->getCString());
		vector.pushBack(temSpriteFrame);
	}
	//设置不断播放飞机的动画
	auto animation = Animation::createWithSpriteFrames(vector,0.2f,-1);
	auto animate = Animate::create(animation);
	this->runAction(animate);
}

我们的玩家类就先写到这里,以后需要添加其他的东西再添加代码,在MainGame类中,我们需要将玩家添加到当前的场景中,还有一件更重要的事,就是实现单点触摸的响应,玩家通过触摸屏幕来改变飞机的位置,同时还要保持飞机的位置不能超过边界,以下就是函数的实现。

bool MainGame::init()
{
	if(!Layer::init())
		return false;

	m_size = Director::getInstance()->getWinSize();

	//添加地图层
	auto background = Background::create();
	this->addChild(background);

	//添加android返回键的监听器
	m_listener = EventListenerKeyboard::create();
	m_listener->onKeyReleased = CC_CALLBACK_2(MainGame::onKeyReleased,this);
	Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(m_listener,this);

	//加载精灵帧缓存
	SpriteFrameCache::getInstance()->addSpriteFramesWithFile("shoot.plist");

	//添加玩家飞机
	m_player = Player::create();
	m_player->setPosition(Point(m_size.width/2,m_size.height*0.2));
	this->addChild(m_player);

	//单点触摸的监听器
	m_touchListener = EventListenerTouchOneByOne::create();
	m_touchListener->onTouchBegan = CC_CALLBACK_2(MainGame::onTouchBegan,this);
	m_touchListener->onTouchMoved = CC_CALLBACK_2(MainGame::onTouchMoved,this);
	//设置吞噬触摸
	m_touchListener->setSwallowTouches(true);
	Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(m_touchListener,this);

	return true;
}

//android返回键的监听
void MainGame::onKeyReleased(EventKeyboard::KeyCode keyCode,Event * pEvent)
{
	//切换到开始游戏场景
	Director::getInstance()->replaceScene(StartGame::createScene());
}

//单点触摸的监听函数
bool MainGame::onTouchBegan(Touch * touch,Event * pEvent)
{
	//判断手指点击的区域是否在飞机上
	auto point = touch->getLocation();
	auto rect = m_player->getBoundingBox();
	if(rect.containsPoint(point))
		return true;

	return false;
}
void MainGame::onTouchMoved(Touch * touch,Event * pEvent)
{
	//跟随手指移动飞机的位置
	auto addPoint = touch->getLocation()-touch->getPreviousLocation();
	m_player->setPosition(m_player->getPosition()+addPoint);

	//判断飞机移动的范围,不要超出了边界
	auto size = m_player->getContentSize();
	//如果x方向的坐标小于了它自己宽度的一般,或者是大于了屏幕的宽度减去自己宽度的一半的大小就越界了
	if(m_player->getPositionX() < size.width/2)
	{
		m_player->setPositionX(size.width/2);
	}
	else if(m_player->getPositionX() > m_size.width-size.width/2)
	{
		m_player->setPositionX(m_size.width-size.width/2);
	}
	//y方向根据x方向的判断方法进行类推
	if(m_player->getPositionY() < size.height/2)
	{
		m_player->setPositionY(size.height/2);
	}
	else if(m_player->getPositionY() > m_size.height-size.height/2)
	{
		m_player->setPositionY(m_size.height-size.height/2);
	}
}

使用3.0实现飞机大战——添加玩家飞机

关于添加头文件等的细节没有说明,这里附上每篇博客完成以后的源代码,大家根据自己的需要下载(去下载源代码)。