cocos2dx3.0 + vs2013 简单打飞机游戏
本文地址:http://www.jb51.cc/article/p-kzfawcay-wk.html
游戏资源,借用了微信打飞机的图库
初版源码地址:https://github.com/doctording/cocos2dx_plane_cpp
滚动背景问题:
持续按键,执行动作
例如:需要移动时,若一直按着A键,那么飞机将一直往左移动
解决方案:
设置一个变量,标识A键是否被按下,在update()方法中执行左移动作
// 键盘事件
auto listenerKeyPad @H_404_22@= EventListenerKeyboard::create();
listenerKeyPad@H_404_22@->onKeyPressed @H_404_22@= CC_CALLBACK_2(Bg::onKeyPressed,this);
listenerKeyPad@H_404_22@->onKeyReleased @H_404_22@= CC_CALLBACK_2(Bg::onKeyReleased,this);
_eventDispatcher@H_404_22@->addEventListenerWithSceneGraPHPriority(listenerKeyPad,this);
// 按键是否按下
isAdown @H_404_22@= false;
// 按键 按下
void Bg::onKeyPressed(EventKeyboard::KeyCode keycode,cocos2d::Event *event)
{
switch (keycode)
{
case EventKeyboard::KeyCode::KEY_A:
//Director::getInstance()->pause();
//this->planeLayer->moveLeftOrRight('A');
isAdown = true;
break;
//...
}
}
//按键 释放
void Bg::onKeyReleased(EventKeyboard::KeyCode keycode,cocos2d::Event *event)
{
switch (keycode)
{
case EventKeyboard::KeyCode::KEY_A:
isAdown = false;
break;
//...
}
}
void Bg::update(float delta)
{
// 如果A键出于按下状态,则一直左移
if (isAdown)
this->planeLayer->moveLeftOrRight('A');
//...
}
关于子弹,敌方飞机的管理
显然要自己定义子弹(Bullet) 和 敌机(Enemy)类,(Bullet,Enemy可以继承Sprite 和 Node)
因为将会有很多子弹和敌机,必须建立管理类,
为 碰撞 和 销毁对象
管理类 采用 单例模式,头文件如下
#include "cocos2d.h"
#include "Bullet.h"
#include "Enemy.h"
USING_NS_CC;
class Manager {
public:
static Manager * getInstance();// 得到实例
static void Manager::freeInstance(void);//销毁实例
public:
static Manager * m_manager;
Manager();
bool init();
public:
Vector<Bullet *> m_bulletVector;
Vector<Bullet *> & getBulletVector(){ return m_bulletVector; };
Vector<EnemyBase *> m_enemyVector;
Vector<EnemyBase *> & getEnemyVector(){ return m_enemyVector; };
};
采用Vector Array等数据结构存储所有的对象,当碰撞,出界等时,从中删除,
帧动画,各种动作(move,blink),碰撞检测,定时器等等基础知识问题
参考文章
http://blog.csdn.net/column/details/jackyairplane.html
http://www.zaojiahua.com/add-bullets-and-manager.html