[cocos2d-x学习笔记][入门基础][塔防]塔防游戏中箭塔旋转并攻击实现

1。 检测炮塔视线范围内距离它最近的敌人。


    int length=0;

    float index=0;

    for (int i=0; i<Game::allEnemy.size(); i++) {

        auto nowEmeny=Game::allEnemy.at(i);

        if (length==0) {

            length=this->getPosition().distance(nowEmeny->getPosition());

        }else

        {

            if (this->getPosition().distance(nowEmeny->getPosition())<length) {

                length=this->getPosition().distance(nowEmeny->getPosition());

                index=i;

            }

        }

    }




2. 如果最近的敌人 nearestEnemy 存在,弓箭则会旋转,所以我们需要计算弓箭旋转的角度和旋转时间。  

炮塔与敌人的之间的角度关系可以表示为: tan a = offY / offX ,而 rotateVector =( offX offY )。
 
getAngle 方法将返回 rotateVector 向量与 X 轴之间的弧度数。但旋转弓箭我们需要的是角度,所以这就需要

把弧度 rotateRadians 转化为角度。 Cocos2d-x 中提供了能把弧度转化为角度的宏
CC_RADIANS_TO_DEGREES  


另外, Cocos2d-x 中规定顺时针方向为正,这显然与我们计算出的角度方向相反,所以转化的时候需要把角
a 变为 -a
speed 表示炮塔旋转的速度, 0.5/ M_PI 其实就是 1 / 2PI ,它表示 1 秒钟旋转 1 个圆。

rotateDuration表示旋转特定的角度需要的时间,计算它用弧度乘以速度

Vec2 rotateVector=Game::allEnemy.at(index)->getPosition()-this->getPosition();

    float rotateRadians=rotateVector.getAngle();

    float rotateDegrees=CC_RADIANS_TO_DEGREES(-1 *rotateRadians);

//    this->ang=rotateDegrees;

    float speed=0.5/M_PI;

    float rotateDuration=fabs(rotateRadians *speed);

    rotateArrow->runAction(Sequence::create(

        RotateTo::create(rotateDuration, rotateDegrees),

        CallFunc::create(CC_CALLBACK_0(TD::shoot, this)), NULL));

}


最后在创建游戏塔的同时定义一个计划函数:

 newtd->schedule(schedule_selector(TD::roateAndShoot),0.5);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值