1

このスレッドで選択した回答を使用して、SKScene にズーム/ピンチを実装しました。

一貫性のないSKNodeのズーム

ピンチまたはズーム アクション中にヒーロー キャラクターを (スムーズに) 中央に配置しようとしています。そうしないと、heroNode が画面からすぐに消えてしまいます。必要なときに呼び出すことができる centerHero メソッドがあり、非常にうまく機能しますが、ピンチ ハンドラーの最後でこのメソッドを呼び出すと、効果が非常にぎくしゃくします。ピンチ ハンドラは次のとおりです。

- (void)handlePinch:(UIPinchGestureRecognizer *) recognizer
{
    [map runAction:[SKAction scaleBy:recognizer.scale duration:0]];
    recognizer.scale = 1;

    // While zooming/pinching, make sure hero is centered:
    [self centerHero];
}

そして、ここにセンターヒーローメソッドがあります:

- (void)centerHero
{
    CGFloat centerX = self.view.bounds.size.width/2;
    CGFloat centerY = self.view.bounds.size.height/2;

    CGFloat heroX = [self.heroNode parent].position.x;
    CGFloat heroY = [self.heroNode parent].position.y;

    CGPoint heroPoint = CGPointMake(heroX, heroY);
    CGPoint newHeroPoint = [self convertPoint:heroPoint fromNode:map];

    CGFloat newHeroX = newHeroPoint.x;
    CGFloat newHeroY = newHeroPoint.y;

    CGFloat xDiff = centerX - newHeroX;
    CGFloat yDiff = centerY - newHeroY;

    SKAction *moveBy = [SKAction moveByX:xDiff y:yDiff duration:5];
    [map runAction:moveBy];
}

この「自動センタリング」をスムーズにする方法について何か提案はありますか?

4

1 に答える 1

1

シーン自体ではなく、マップ ノードをスケーリングしているように見えます。ノードをスケーリングすると、単に表示領域の中心にズームインするのではなく、そのノードのアンカー ポイントにズームします。

シーン自体をスケーリングする場合は、すべてを適切にスケーリングする必要があります。たとえば、次のようになります。

[self runAction:[SKAction scaleBy:recognizer.scale duration:0]];

SKScene 内からこのアクションを実行していると仮定します。あなたも試すことができます:

[map.scene runAction:[SKAction scaleBy:recognizer.scale duration:0]];

...これは、マップが属する親シーンも指します。

于 2013-11-21T04:38:04.100 に答える