1

私はトップダウンのタイルベースのゲームを作っています(GameBoyの古いポケモンとゼルダのゲームを考えてください)。キャラクターのスムーズな動きに問題があります。問題は、アクションを終了してから新しいアクションを開始するまでの遅延だと思います。

コードは次のようになります。

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {CGPoint touchCoor = [自己coordinateForTouch:touch];

// If the character was touched, open their dialogue
if (CGPointEqualToPoint(touchCoor, ebplayer.coordinate)) {
    [[CCDirector sharedDirector] replaceScene:
     [CCTransitionMoveInR transitionWithDuration:1.0 scene:[HelloWorldLayer scene]]];
}
else // otherwise, move the character
{
    activeTouch = [self directionForPoint:[touch locationInView:[touch view]]];
    [self movePlayer:nil inDirection:activeTouch];
}

return YES;

}

//画面のディメンションポイントで指定//すべての動きの基本的な動き関数です-(void)movePlayer:(NSString *)pid toPosition:(CGPoint)position {CGPoint playerCoordinate = [self CoordinateForPositionPoint:position];

// if we're not already moving, and we can move, then move
if(!isAnimating && [self coordinateIsOnMap:playerCoordinate] && [self isPassable:playerCoordinate]){
    id doneAction = [CCCallFuncN actionWithTarget:self selector:@selector(finishedAnimating)];
    id moveAction = [CCMoveTo actionWithDuration:WALK_DURATION position:position];
    id animAction = [CCAnimate actionWithAnimation: [ebplayer animateDirection:activeTouch withDuration:WALK_DURATION]];
    id walkAndMove = [CCSpawn actionOne:moveAction two:animAction];
    id action = [CCSequence actions: walkAndMove, doneAction, nil];
    isAnimating = YES;
    [player runAction:action];

    ebplayer.coordinate = playerCoordinate;
    [self setViewpointCenter:position Animated:YES];
}

// if it's not passable, just run the animation
if(!isAnimating){
    id doneAction = [CCCallFuncN actionWithTarget:self selector:@selector(finishedAnimating)];
    id animAction = [CCAnimate actionWithAnimation: [ebplayer animateDirection:activeTouch withDuration:WALK_DURATION]];
    id action = [CCSequence actions: animAction, doneAction, nil];
    isAnimating = YES;
    [player runAction: action];
}

}

次に、そのアクションが終了したら、もう一度起動してみてください。

  • (void)finishedAnimating {isAnimating = NO; [self movePlayer:nil inDirection:activeTouch]; }
4

1 に答える 1

0

複数のCCMove*アクションをシーケンス処理すると、常に1フレームの遅延が発生します。

何が起こるかは次のとおりです。

  • フレーム0-100:移動アクションが実行され、スプライトが移動しています
  • フレーム101:移動アクションが終了し、CCCallFuncが実行されます
  • フレーム102:新しい移動アクションが開始されます

この1フレームの遅延は、移動アクションの順序付けの主な問題の1つであり、ゲームプレイの目的で移動アクションを使用することをお勧めしない理由です。

別の方法は、オブジェクトの位置を変更することにより、スケジュールされた更新メソッドでオブジェクトを手動で移動することです。CCMove*アクションコードをベースとして使用できます。

于 2012-12-14T12:44:45.830 に答える