跳转到主要内容

关于Cocos2d-x中物理世界的物体乱跳的问题的解决

demi 提交于

这是电脑短时间内帧率低,无法满足游戏配置的帧率引起的。

解决方法:

<strong>第一种:</strong>

1.打开AppDelegate.cpp文件

2.把director-&gt;setAnimationInterval(1.0 / 60);改为 director-&gt;setAnimationInterval(1.0 / 50);或者更低一点。

这样游戏性能会有些许的下降,就是游戏会变的卡一点,但是物体不会乱跳,在真机上运行,我相信不会出现乱跳的情况。所以等开发完后再把帧率调回来。

<strong>第二种:</strong>

把setPosition里面的参数都用变量的形式表示,不要直接用常量,用变量比较稳定,亲试可行。

用常量表示其实是非常不好的,因为如果改变屏幕分辨率,就会造成混乱,最好是用屏幕尺寸的几分之几来表示。

<strong>第三种:</strong>

用简单的精灵节点来代替节点加子节点的形式,亲试可行。

Sprite::init();
setTexture("s_1.png");
setScale(0.2);
setPhysicsBody(PhysicsBody::createBox(this-&gt;getContentSize()));

<strong>第四种:</strong>

在有接触的实例物理对象的初始化方法init()中加上这几句

getPhysicsBody()-&gt;getShape(0)-&gt;setFriction(0); //使此刚体的摩擦力为0
getPhysicsBody()-&gt;getShape(0)-&gt;setRestitution(0); //使此刚体的弹性为0

之前在有接触的两个刚体之间,我只在其中一个的初始化方法init()中加上这两句,结果还是会突然跳一下,后来我在两个有接触的刚体之间都加上这两句,就没有突然跳一下,很稳。

<strong>第五种(非常有效):</strong>

在主角的init方法中把刚体属性设置成

getPhysicsBody()-&gt;setDynamic(true); //是动态刚体,可以产生碰撞事件
getPhysicsBody()-&gt;setGravityEnable(false); //不受重力影响

然后再定义一些动作,这些动作等价于以前是靠重力实现的动作,只是现在我们用最普通的动作来代替它们,像JumpTo,MoveTo,Blink等等代替_hero-&gt;getPhysicsBody()-&gt;setVelocity(Vec2(0, 400));

//停止之前的所有动作
this-&gt;stopAllActions();
//sprite-&gt;stopAllActions();

//把帧动画变成跳跃的纹理
this-&gt;setTexture(jump);

startPosition = size.height / 4;
JumpTo *jump = JumpTo::create(1, Vec2(200, startPosition), startPosition, 1);
//回调函数把状态重新设置成行走,执行程序时跳过这个函数,这个函数处于等待被调用的状态,直到有人用它的时候才调用
CallFunc *call = CallFunc::create([this](){
  setState(0);
});
//设置动作队列,先跳跃,再回去调用call,变成行走的动作
this-&gt;runAction(Sequence::create(jump, call, NULL));

这种方法让主角不会受物理世界重力的影响,运行起来非常稳定,一些主角跑出边界的问题也不存在了。

来源:博客园 -<a href="http://www.cnblogs.com/HangZhe/p/5719656.html"&gt; 杭者</a>