0

車を0からオフスクリーンまで移動させようとしています。しかし、車が動いている間、ディスプレイに明らかな問題があることがわかります。私が何をしているかをお見せしましょう:

私は @property (nonatomic,strong) CCSprite カーを持っています。

init メソッドでは、次のことを行います。

self.car=[CCSprite spriteWithFileName:@"car.png"];
CGSize *windowSize=[[CCDirector sharedDirector] winSize];
CGSize carSize=car.contentSize;
car.position=ccp(0-carSize.width/2,windowSize.height/2);
[selp addChild:car];
[self schedule:@selecor(tick:) interval:0.5];

tick メソッドは次のとおりです。

-(void)tick:(ccTime)time{
 [[self.car runAction:MoveBy actionWithDuration:time position:ccp(100,0)];
}

ご覧のとおり、これは単純なテスト アプリです。画像「car.png」のサイズは64x128です。AppDelegate.m では、フレーム レートは 30 FPS に設定されています。

4

2 に答える 2

1

あなたのティックメソッドでは、新しいアクションを実行する前に、移動中のアクションを停止します。また、アクション期間に「time」を使用する代わりに、.5fを使用します。時間は、このティックで実際に得られた時間であり、おそらく.5からいくらかずれています(推測する必要がある場合は+/- 1/60秒)。より多くのオブジェクトが画面に表示され、ユーザーアクションと相まって、スケジュールされたメソッドで受信される「時間」はよりランダムになります。私は個人的にそれを使用して、スケジュールされたメソッドによって処理される2つのメタイベント間の経過時間を計算します。

于 2012-06-18T12:41:52.883 に答える
1

まず、スプライトを画面の境界から外したいだけの場合は、0.5秒ごとに新しいアクションを開始せずに1つのアクションを使用しないのはなぜですか?単一のアクションを作成できます。また、あなたのような方法では、遅れの場合に問題が発生します。たとえば、アプリに何らかの理由で2秒の遅延がある場合、スプライトはX軸で100ポイントずつゆっくりと移動します。これは、時間パラメーターとして常に0.5を受け取るという保証がないためです。2秒遅れの場合、時間=2を受け取ります。

ある種の更新メソッドでスプライトを本当に移動したい場合は、アクションではなく、setPositionを使用してスプライトの位置を変更することをお勧めします。たとえば、スプライトの表示位置を物理的な世界(b2Worldなど)での位置と同期させたい場合に便利です。または、ある種の複雑な動きの場合。たとえば、式sin(t)、またはアルキメデスの螺旋を使用した移動の場合。

于 2012-06-18T07:52:54.360 に答える