您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx游戏开发——微信打飞机学习笔记(九)——BulletLayer的搭建

2014-08-25 11:55 537 查看
一、创建文件~

BulletLayer.h

BulletLayer.cpp

二、How to do?

(1)实例化BulletLayer方法的实现~

Bullet(PlayerLayer* temp);

~Bullet();

static Bullet* create(PlayerLayer *temp);


大家发现这个bullet类的实例化方法很奇怪~,那是由于小白前面制作PlayerLayer的时候没有把他做成全局变量,所以bulletLayer就访问不到的说~,但是我们必须得到飞机的位置,要不子弹从哪里打出来~~,所以小白我简单粗暴,直接把PlayerLayer传进BulletLayer,但实际上可以用友元的方法进行实现,但是……请原谅小编的C++ premier英文版~ 只看了150多页~,以前看的c++教程有点水,所以。。。反正是个小游戏,先暂时实现吧,后来再来翻工~~~~

Bullet* Bullet::create(PlayerLayer *temp)
{
Bullet *pRet = new Bullet(temp);  //创建一个对象
if (pRet && pRet->init())         //内存申请到,初始化正确,那么就返回对象
{
pRet->autorelease();
return pRet;
}
else
{
delete pRet;
pRet = NULL;                 //否则就删掉~
return NULL;
}
}

Bullet::Bullet(PlayerLayer *temp)         //把playerLayer保存~
{
_player = temp;
}

Bullet::~Bullet()
{

}


(2)初始化子弹的方法

这里采用的是跟初始化敌机一模一样的方法~所以呢~我们就……

void Bullet::initBullet()
{
for (int i = 0; i < BULLET_NUM; i++) //BUllET_NUM就是定义要初始化几个子弹的宏~
{
Sprite* bullet = Sprite::createWithSpriteFrameName("bullet1.png");
bullet->setVisible(false);
this->addChild(bullet);
_bulletsArray.pushBack(bullet);
}
}


(3)发射子弹的方法~

同样是跟发射敌机的方法是一样的,首先就是先得到空闲的子弹~

Sprite* Bullet::getAvailableBulletSprite()
{
for (auto&sp : _bulletsArray)
{
if (!sp->isVisible())
{return sp;
}
}
return nullptr;
}


然后就是发射子弹的方法~

void Bullet::spawBullet(float dt)
{

Vec2 playerPosition = _player->getPlayerPlanePositon();  //这里就是得到玩家飞机的锚点位置。

//大家会发现前面没有实现这个方法~~在这里贴一下


Vec2 PlayerLayer::getPlayerPlanePositon()
{
return _playerplane->getPosition();
}
Size PlayerLayer::getPlayerPlaneContentSize()
{
return _playerplane->getContentSize();
}



auto bulletPosition = Vec2(playerPosition.x, playerPosition.y + _player->getPlayerPlaneContentSize().height / 2);

Sprite* bullet = getAvailableBulletSprite();//得到空闲的子弹~
Size screenSize = Director::getInstance()->getVisibleSize();

if (bullet)
{
bullet->setVisible(true);
bullet->setPosition(bulletPosition);
float moveOffset = screenSize.height + bullet->getContentSize().height / 2 - playerPosition.y;
auto moveBy = MoveBy::create(moveOffset / VELOCITY_OF_BULLET, Vec2(0, moveOffset));
auto toggleVisibility = Hide::create();
auto action = Sequence::createWithTwoActions(moveBy, toggleVisibility);
bullet->runAction(action);
}
//同样跟敌机一样,就是飞出屏幕的时候设置为消失~
}


(4)Init()中调用,并且加入到GameScene中就可以啦。

this->initBullet();

this->schedule(schedule_selector(Bullet::spawBullet), 1.0 / 5);


三、效果图展示~



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐