applyForce不顺畅

希望有人能帮助。 我一直在这一个拉我的头发! 下面是我的Sprite Kit游戏中的一些控制板代码,它使用applyForce来移动英雄船。 我喜欢控制和运动的感觉,它有一些漂亮的漂移等等。但是我对它产生的animation/运动有不一致的结果。 有时(大约一半的时间)animation是非常顺利,看起来是正确的。 剩下的时间,船只animation以不同的强度结尾。

游戏中的怪兽和皮卡在SKAction各种path上SKAction 。 当英雄船发生问题时,他们的animation不会受到影响,我通常会在debugging中看到它以每秒60.0 fps的速度发生,这使我认为这不是一个帧丢失问题。 我的记忆使用是一致的,我没有看到任何大的峰值。

当这个错误发生的时候,从现场开始总是很明显的(在我开始平稳的运动之后,它就不会发生了 – 让我想起它的初始力量或者多重力量),并且一直持续到我重新开始等级或暂停和不停止游戏,在这一点上,我得到了一个完美的stream畅的animation或毛刺的animation的新行为。

我的绘图和节点都是使用地图集和预加载进行优化的,甚至当我将游戏中的大部分内容都closures(除了船和控制台之外的所有东西),我仍然在船上遇到了这个问题。

我注意到,当我插入Xcode时经常遇到这种情况,通常是在logging时(但不是总是),特别是在运行仪器时。

我的ControlPad用一个委托回到游戏场景

 /* Game Scene */ @interface GameScene () <SKPhysicsContactDelegate, ControlPadDelegate> ... - (void)createHero { self.heroShip = [Hero createHeroInFrame:self.frame]; [self.gameObject addChild:self.heroShip]; self.heroShip.position = CGPointMake(self.heroShip.size.width, self.frame.size.height / 2); } // Move Hero By X And Y - (void)moveHeroByX:(float)moveByX andY:(float)moveByY { [self.heroShip.physicsBody applyForce:CGVectorMake(moveByX, moveByY)]; } /* Control Pad Class */ static float const sensitivity = 10; static float const maxMove = 10; @interface ControlPad() // Touch Points @property (nonatomic) CGPoint navPadTouchPrevious; @property (nonatomic) CGPoint navPadTouchCurrent; // Touch Instances @property (nonatomic) UITouch * navPadTouchInstance; @implementation ControlPad - (id)initWithSize:(CGSize)size { ... } // Touches Began - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // Loop through touches for (UITouch * touch in touches) { CGPoint location = [touch locationInNode:self]; SKNode * node = [self nodeAtPoint:location]; // Navigation Pad Touched if (node == self.navigationPad) { self.navPadTouchInstance = touch; // Assign Touch Instance self.navPadTouchPrevious = location; self.navPadTouchCurrent = location; } } } // Touches Moved - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { // Loop Through Touches for (UITouch * touch in touches) { CGPoint location = [touch locationInNode:self]; CGPoint previous = [touch previousLocationInNode:self]; SKNode * node = [self nodeAtPoint:location]; // Move Nav Pad if (touch == self.navPadTouchInstance) { if (node == self.navigationPad) { self.navPadTouchPrevious = previous; self.navPadTouchCurrent = location; // Move Hero [self moveHero]; } } } } // Move Hero - (void)moveHero { // Calculate Delta Move float moveByX = self.navPadTouchCurrent.x - self.navPadTouchPrevious.x; float moveByY = self.navPadTouchCurrent.y - self.navPadTouchPrevious.y; // Throttle Move moveByX = moveByX >= 0 ? MIN(moveByX, maxMove) : MAX(moveByX, -maxMove); moveByY = moveByY >= 0 ? MIN(moveByY, maxMove) : MAX(moveByY, -maxMove); // Add Sensitivity moveByX = moveByX * sensitivity; moveByY = moveByY * sensitivity; // Move Hero [self.delegate moveHeroByX:moveByX andY:moveByY]; } 

以上只是我的课程的一部分。 我可以提供更多的代码和/或任何东西的日志。 请让我知道 谢谢。

编辑

每Epic Byte的评论,我不应该在移动的触摸调用applyForce(和阅读苹果文件:“加速应用于一个单一的模拟步骤(一帧)”),我已经把它移动到更新循环。 我现在设置了moveByX和movedByY浮动属性在触摸移动游戏场景,然后在applyFoce在更新循环的每一步中使用它们。 在我使用它们之后,我将它们设置为零,所以当你释放触摸时,它将停止施加力量和船舶漂移。

我仍然遇到不一致的光滑度。 有一半是完美的,另一半是animation片断。 我在iPad 2上,想知道是否在更强大的设备上testing会告诉我什么。 我的内存使用率很低。

 /* Game Scene */ -(void)update:(NSTimeInterval)currentTime { ... [self moveHero]; ... } - (void)moveHero { [self.heroShip.physicsBody applyForce:CGVectorMake(self.moveByX, self.moveByY)]; self.moveByX = 0; self.moveByY = 0; } // Called from control pad class - (void)moveHeroByX:(float)moveByX andY:(float)moveByY { self.moveByX = moveByX; self.moveByY = moveByY; }