applyForce不顺畅(applyForce is not smooth)

2019-10-21 17:12发布

希望有人可以提供帮助。 我一直在拉我的头发就这一个! 下面是一些从我的雪碧套件游戏中使用的控制键盘码的applyForce移动英雄船。 我喜欢控制和运动的感觉,它得到了一些漂亮的漂移,等等......不过,我对动画/运动,它产生不一致的结果。 有时(大约一半时间)动画是完全光滑,看起来是正确的。 时间剩下的船舶运动动画断断续续在不同的强度。

在游戏中的怪物和皮卡上的各种路径运行SKAction 。 当问题发生的英雄船,我通常会看到它有一个卖60.0 FPS在调试,这让我觉得这是不是一个丢帧问题发生的动画不吃亏。 我的内存使用情况是一致的,我看不出有什么大的尖峰。

当错误发生总是从场景的开始明显(它从未开始发生后,我开始用平稳的运动 - 让我想起了一次与初始力或多方力量的东西),并继续发生,直到我重新启动水平或暂停和取消暂停游戏,在这一点上,我既得到完美流畅的动画效果,或出问题的动画的一个新的行为。

我的画和节点是相当有地图集优化和预加载,甚至当我打开大部分都在游戏中关闭(一切,但船舶和控制盘)我仍然遇到此问题与applyForce船上。

我已经注意到,我这个更经常遇到,当插入Xcode中,很多时候当我登录(但不总是),尤其是在运行仪器。

我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];
 }

以上只是我的课件。 我可以提供更多的代码和/或任何事物日志。 只是让我知道。 谢谢。

编辑

每史诗字节的评论,我不应该叫applyForce在触摸移动,(在苹果文档阅读:“加速应用于单个模拟步骤(一帧)”),我把它移动到更新循环。 现在我设置movedByX和movedByY上移动触摸在游戏场景中漂浮的属性,然后在更新循环的每个步骤中使用它们applyFoce。 当我使用他们,我将它们设置为零,所以当你松开停止施加力和船舶漂移触摸。

我仍然遇到不一致的平滑度。 半是完美的时候,另一半的动画口吃。 我在iPad 2,不知是否测试它更强大的设备上会告诉我什么。 我的内存使用率较低。

/* 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;
}
文章来源: applyForce is not smooth