cocos2dx:重力加速度,自由落体:利用update()就能快速实现精灵自由落体运动

40 篇文章 1 订阅
36 篇文章 0 订阅

cocos2dx:重力加速度,自由落体:利用update()就能快速实现精灵自由落体运动

设备/引擎:Mac(11.6)/cocos

开发工具:Xcode(13.0)

开发需求:拖动精灵移动,在松手的时候让精灵以自由落体的形态下落到指定物品上

最近刚做完一个房屋装饰类的小玩法,里面有涉及到如何让精灵实现自由落体,一开始卡在了如何用引擎自带的功能,发现并没有,主要是相关的一些方法实现效果并不明显,索性就自己写一个,在这里分享一下。

1.重力加速度
根据中学物理的知识可知,重力加速度公式:

#define GRAVITY 9.8
float height = 0.0; //下落高度,距离你要落得目标的距离
float speed  = 2*GRAVITY*height

以上可知,想要获得精灵当前高度的下落速度时,就需要知道当前的高度,如上公式可求。

2.工程中进行演化
在工程中,精灵的下落高度不止取决于一个目标,目标较多时也会造成代码判断过多过于复杂,容错降低,所以就换了个思路,其实不论哪个目标物体,我只需要每个时间点(update())对精灵的纵轴坐标进行更新即可,所呈现的效果也就是自由落体效果。代码如下

#define GRAVITY 9.8
float dtCount;//计时器
void GameLayer::update(float dt){
	 CCSprite* ItemSpr =  (CCSprite*)this->getChildByTag(/); //获取正在拖动的精灵
     if (ItemSpr != NULL) {
         ItemSpr->dtCount += dt;
         float sprV = ItemSpr->dtCount*GRAVITY*2;	//每个时间点的下落距离
         ItemSpr->setPosition(ccp(ItemSpr->getPosition().x, ItemSpr->getPosition().y-sprV));  //更新精灵位置
         if (this->判断是否碰撞到底部的函数(ItemSpr)) {
           		this->removeObject(ItemSpr)	 //移出掉操作的精灵,以此来停止下落
            }
}

3.判断是否碰撞到底部
此部分来判断是否已经落到最底部,来决定是否继续下落。碰撞检测部分可以用boundingBox().intersectsRect来进行判断,一定要注意拖动的精灵与要接触的精灵的区域,以防判断错误。

4.触底反弹效果:让自由落体更逼真
在碰撞检测判断为true时,我们需要加一个小的往上弹的效果,来更生动的实现自由下落。此部分比较简单,我们使用jumpBy方法即可,主要代码如下

……
CCJumpBy* jumpBy = CCJumpBy::create(0.3, ccp(0.0, 0.0), jumpHeightVal, 1);
this->runAction(jumpBy);
……

以上就可以很好的实现自由下落的效果,简单好用,代码也不易出问题,即使有问题也容易修改,特别注意的是碰撞检测部分,一定要把区域搞对了,不然也是会很麻烦

希望能给大家带来帮助!!!有什么问题需要讨论的可以评论私信欢迎讨论~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GameTomato

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值