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


    一、创建文件~

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

    三、效果图展示~

    image

  • 相关阅读:
    关于HTTP以及TCP
    .NetCore表单提交文件
    C# Out变量
    .NET Core 网络数据采集 -- 使用AngleSharp做html解析
    C# 根据Url下载文件/获取文件流
    C# 模拟表单提交
    C# 获取Url路径的参数信息
    C# 采集页面数据
    .net core 3.1 设置可跨域
    C# json字符串转化成Dictionary
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/3934634.html
Copyright © 2020-2023  润新知