左から右に永久に移動するボール (CCSprite) があります。画面に触れたらボールを止めたい。問題は、スプライトの継続時間が速すぎると、停止するまでに 1 ミリ秒の遅延時間が発生するため、少し「異なる」位置に触れても停止位置がほぼ同じ値になることです。
CGSize winSize = [[CCDirector sharedDirector] winSize];
self.ball = [CCSprite spriteWithFile:@"ball.png"];
self.ball.position = ccp(0, 156);
CGPoint destinationPoint = self.ball.position;
destinationPoint.x = winSize.width;
CGPoint startPoint = self.ball.position;
startPoint.x = 0;
float speed = 0.8f;
[self.ball runAction:[CCRepeatForever actionWithAction:
[CCSequence actions:
[CCMoveTo actionWithDuration:speed position:destinationPoint],
[CCMoveTo actionWithDuration:0.f position:startPoint],
nil]
]];
次に、画面に触れたときにスプライトを停止し、ボールの位置を記録します。
-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
[self.ball stopAllActions];
NSLog(@"Ball x y: %f %f\n", self.ball.position.x, self.ball.position.y);
// Then repeat again the movement of the ball
}
そのため、中央に触れると、停止するまでに 1 ミリ秒の遅延があります。繰り返しますが、私が触れると、ミリ秒遅れて(ボールがまだ動いている)、停止します。たとえば、位置 x 240 をクリックすると x 240,1122 で停止し、位置 x 230 をクリックすると 239,222 で停止します。触れたらすぐに止まらない。
ここに私が触れた位置のサンプルログがあります。
Ball x y: 240.211624 156.000000
Ball x y: 240.369995 156.000000
Ball x y: 240.291992 156.000000
Ball x y: 219.913574 156.000000
Ball x y: 260.425598 156.000000
Ball x y: 260.004364 156.000000
Ball x y: 239.953186 156.000000
見る?停止時の x 位置は常に「20 で割り切れる」です。
- 240,240,240,239
- 219
- 260,260
位置 x 235、230、245、250、またはそのパターンを除外する値をクリックしたことがあると確信しています。しかし、私が言ったように、ボールがまだ動いている間に遅延時間があり、その後停止します。
たとえば、速度を 2.8f (またはそれ以上) に変更すると、ボールはすぐに停止し、ボールの xy は、タッチした最後の位置の正確な位置になります。CCMoveTo 速度の持続時間が速すぎるためだと思います。
スケジュールセレクター方式で試してみました。ただし、スケジュールの時間は、CCMoveTo のように速すぎることはできません。そのため、スケジュールを使用した移動は、持続時間が長すぎる 1 ピクセルから 1 ピクセルになります。
これに対する解決策はありますか?または、これを実装する方法はありますか?どうもありがとう!