applyForce不顺畅

时间:2015-01-26 07:52:39

标签: ios objective-c sprite-kit game-physics skphysicsbody

希望有人可以提供帮助。我一直把头发拉出来!下面是我的Sprite Kit游戏中的一些控制垫代码,它使用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];
 }

以上只是我课程的一部分。我可以提供更多代码和/或任何日志。请告诉我。感谢。

修改

Per Epic Byte的评论我不应该在移动的触摸中调用applyForce(并且在Apple Docs中阅读:“加速应用于单个模拟步骤(一帧)”),我已将其移至更新环。我现在在移动的触摸中设置moveByX和moveByY浮动属性,然后在更新循环的每个步骤中在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;
}

0 个答案:

没有答案