2

慣性スクロールをドラッグしてシミュレートする必要があるオブジェクトがあります。

これは私がこれまでに持っていたもので、動作が遅いです。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInNode:self];

    self.lastTouch = touchLocation;
    self.lastTimestamp = event.timestamp;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint currentLocation = [touch locationInNode:self];

    // how much it scrolled vertically (it is a table view, no need to scroll horizontally)
    CGFloat deltaY = currentLocation.y - self.lastTouch.y;

    // move the container (that is the object I want to implement the inertial movement)
    // to the correct position
    CGPoint posActual = self.container.position; 
    posActual.y = posActual.y + deltaY;
    [self.container setPosition:posActual];


    // calculate the movement speed
    NSTimeInterval deltaTime = event.timestamp - self.lastTimestamp;
    self.speedY = deltaY / deltaTime;

    self.lastTouch = currentLocation;
    self.lastTimestamp = event.timestamp;

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGFloat tempoDecay = 0.4f;

    CGPoint finalPosition = self.container.position;
    finalPosition.y = finalPosition.y + (self.speedY * tempoDecay);

    // move the object to the final position using easeOut timing...

}

これが私が見るものです:私はそれをスワイプします。指を離すと加速して急に止まる。speedY 値をログに記録しましたが、その値は 720 のように計り知れません! (毎秒720ピクセル?)

Apple が提供する UIScrollView やその他のメソッドを使用できません。それ自体が慣性でスクロールしなければならないオブジェクトです。ありがとう。

4

2 に答える 2

5

シーンの更新メソッドに「慣性ブレーキ」を追加することにより、この慣性スクロール (垂直スクロール選択をシミュレートするために垂直に多くのスプライトで満たされた SKSpriteNode オブジェクト) を実装します。

// add the variables as member variables to your class , setup with initial values on your init 
  SKSpriteNode *mList // this is the sprite node that will be our scroll object
  mTouching = NO;         // BOOL
  mLastScrollDist = 0.0f; // float

touchesBegan で、 mTouching を YES に変更し、タッチが有効であることを示します。

touchesMoved で、 mLastScrollDist = previousLocation.y - currentlocation.y を計算し、それを mList の y 位置に追加します (mList.y += mLastScrollDist)

あなたの touchesEnded で、 mTouching を NO に変更します

最後に、シーンの更新メソッドで、制動慣性効果を計算します

- (void)update:(NSTimeInterval)currentTime
{
    if (!mTouching)
    {
        float slowDown = 0.98f;

        if (fabsf(mLastScrollDist) < 0.5f)
            slowDown = 0;

        mLastScrollDist *= slowDown;
        mList.y += mLastScrollDist; // mList is the SKSpriteNode list object
    }
}
于 2015-08-03T07:13:22.830 に答える
1

touchesスワイプ中に何度も通話を移動しました。また、各呼び出しの 2 点間の距離は 15 ~ 30 ピクセルです。スワイプが 0.5 秒続き、メソッドが 10 回呼び出されるとします。速度Y = 30/0.05 = 600.

また、最後の「touchesMoved speed」のみが考慮されます。たぶん、平均速度を計算する必要がありますか?

于 2013-09-17T10:39:34.410 に答える