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

本文探讨了如何在游戏塔防御中检测炮塔视线范围内距离最近的敌人,并通过计算角度和旋转时间实现自动瞄准。利用Cocos2d-x引擎的特性,通过遍历所有敌人,计算与炮塔的距离,找到最近的敌人。接着,运用几何原理计算出与X轴之间的角度关系,通过弧度到角度的转换和正负判断调整射击方向。最后,通过设定旋转速度和计算旋转时间,实现在合适的时间内准确瞄准并发射箭矢。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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=(offXoffY)。
 
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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值