这是电脑短时间内帧率低,无法满足游戏配置的帧率引起的。
解决方法:
第一种:
1.打开AppDelegate.cpp文件
2.把director->setAnimationInterval(1.0 / 60);改为 director->setAnimationInterval(1.0 / 50);或者更低一点。
这样游戏性能会有些许的下降,就是游戏会变的卡一点,但是物体不会乱跳,在真机上运行,我相信不会出现乱跳的情况。所以等开发完后再把帧率调回来。
第二种:
把setPosition里面的参数都用变量的形式表示,不要直接用常量,用变量比较稳定,亲试可行。
用常量表示其实是非常不好的,因为如果改变屏幕分辨率,就会造成混乱,最好是用屏幕尺寸的几分之几来表示。
第三种:
用简单的精灵节点来代替节点加子节点的形式,亲试可行。
Sprite::init();
setTexture("s_1.png");
setScale(0.2);
setPhysicsBody(PhysicsBody::createBox(this->getContentSize()));
第四种:
在有接触的实例物理对象的初始化方法init()中加上这几句
getPhysicsBody()->getShape(0)->setFriction(0); //使此刚体的摩擦力为0
getPhysicsBody()->getShape(0)->setRestitution(0); //使此刚体的弹性为0
之前在有接触的两个刚体之间,我只在其中一个的初始化方法init()中加上这两句,结果还是会突然跳一下,后来我在两个有接触的刚体之间都加上这两句,就没有突然跳一下,很稳。
第五种(非常有效):
在主角的init方法中把刚体属性设置成
getPhysicsBody()->setDynamic(true); //是动态刚体,可以产生碰撞事件
getPhysicsBody()->setGravityEnable(false); //不受重力影响
然后再定义一些动作,这些动作等价于以前是靠重力实现的动作,只是现在我们用最普通的动作来代替它们,像JumpTo,MoveTo,Blink等等代替_hero->getPhysicsBody()->setVelocity(Vec2(0, 400));
//停止之前的所有动作
this->stopAllActions();
//sprite->stopAllActions();
//把帧动画变成跳跃的纹理
this->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->runAction(Sequence::create(jump, call, NULL));
这种方法让主角不会受物理世界重力的影响,运行起来非常稳定,一些主角跑出边界的问题也不存在了。