0

現在、内部NSArrayに大量の座標があります。x選択したパスに沿って移動するために各ポイントに移動する必要があるスプライトがあります。for ループを使用してみましたが、これは非常に連続して行われるため、最終目的地にテレポートしているように見えます。セレクターを試してみましたが、それらを機能させることもできません。誰でもこれを行う方法を知っていますか?

4

2 に答える 2

0

NSTimer を使用する必要があります

@implementation whatever
{
int count;
NSTimer *myTimer;
CCSprite *mySprite;
NSArray *locationArray;
}

そして、どこかからタイマーを開始します...

 count=0
 //1.0 is one second, so change it to however long you want to wait between position changes
 myTimer =   [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(movealong) userInfo:nil repeats:YES];

そして、すべてのオブジェクトを通過するまでこれを呼び出します

-(void)movealong{

//assuming array is full of CGPoints...
//mySprite.position = [locationArray objectAtIndex:count];
//try this then
CGPoint newPoint = [locationArray objectAtIndex:count];
mySprite.position = ccp(newPoint.x,newPoint.y);
//I think maybe THIS is what you need to do to make it work... 
//if you want it to not jump directly there
//you can also use CCMoveTo 
/*//  under actionWithDuration: put the same amount of time or less of what you had
  //  under scheduledTimerWithTimeInterval in your NSTimer
    CCFiniteTimeAction *newPos = [CCMoveTo actionWithDuration:1.0 position:[locationArray objectAtIndex:count]];
    [mySprite runAction:newPos];
*/
count++;
if(count >= locationArray.count){
    [myTimer invalidate];
    myTimer = nil;
}
}
于 2012-09-30T14:44:31.483 に答える
0

スプライトを位置配列のインデックス (_i など) に配置するメソッドを作成します。そして、このメソッドの最後で、CCDelayTime および CCCallFunc アクションを順番に使用して、遅延を指定して再度呼び出します。また、インデックスをインクリメントすることを忘れないでください。みたいな

// somewhere in code to start move
_i = 0;
[self setNewPosition];

// method that will set the next position
- (void) setNewPosition
{
    sprite.position = // get position at index _i from your array here
    _i++;

    BOOL needSetNextPosition = // check if _i is inside bounds of your positions array
    if( needSetNextPosition )
    {
        id delay = [CCDelayTime actionWithDuration: delayBetweenUpdate];
        id callback = [CCCallFunc actionWithTarget: self selector: @selector(setNewPosition)];
        id sequence = [CCSequence actionOne: delay two: callback];
        [self runAction = sequence];
    }

}

これは単なる例ですが、ニーズに合わせて調整できることを願っています。

于 2012-09-30T18:14:16.740 に答える