J'ai un sprite (image d'une balle) Je peux le déplacer en utilisant le toucher et le mouvement. J'ai également identifié le taux de changement de position (axe des abscisses, axe des y) de ce sprite en fonction de la période de glissement.ipad: comment déplacer un sprite en le faisant glisser et continuer à aller en fonction de la vitesse de glissement
Maintenant, j'ai besoin de continuer ce sprite pour aller selon sa vitesse et sa direction. Voici mon code-
Touch Event
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint location = [touch locationInView: [touch view]];
CGPoint convertedLocation = [[CCDirector sharedDirector] convertToGL:location];
self.touchStartTime = [event timestamp];
self.touchStartPosition = location;
if (YES == [self isItTouched:self.striker touchedAt:convertedLocation]) {
self.striker.isInTouch = YES;
}
return YES;
}
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint location = [touch locationInView: [touch view]];
CGPoint convertedLocation = [[CCDirector sharedDirector] convertToGL:location];
self.touchLastMovedTime = [event timestamp];
self.touchMovedPosition = convertedLocation;
if(self.striker.isInTouch == YES){
self.striker.position = self.touchMovedPosition;
}
}
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint location = [touch locationInView: [touch view]];
CGPoint convertedLocation = [[CCDirector sharedDirector] convertToGL:location];
self.touchEndTime = [event timestamp];
self.touchEndPosition = location;
if(self.striker.isInTouch == YES
&& (self.touchEndTime - self.touchLastMovedTime) <= MAX_TOUCH_HOLD_DURATION)
{
float c = sqrt(pow(self.touchStartPosition.x - self.touchEndPosition.x, 2)
+ pow(self.touchStartPosition.y - self.touchEndPosition.y, 2));
self.striker.speedx = (c - (self.touchStartPosition.y - self.touchEndPosition.y))
/((self.touchEndTime - self.touchStartTime) * 1000);
self.striker.speedy = (c - (self.touchStartPosition.x - self.touchEndPosition.x))
/((self.touchEndTime - self.touchStartTime) * 1000);
self.striker.speedx *= 4;
self.striker.speedy *= 4;
self.striker.isInTouch = NO;
[self schedule:@selector(nextFrame) interval:0.001];
}
}
Scheduled Method to move Sprite
- (void) nextFrame {
[self setPieceNextPosition:self.striker];
[self adjustPieceSpeed:self.striker];
if(abs(self.striker.speedx) <= 1 && abs(self.striker.speedy) <= 1){
[self unschedule:@selector(nextFrame)];
}
}
SET next Position
- (void) setPieceNextPosition:(Piece *) piece{
CGPoint nextPosition;
float tempMod;
tempMod = (piece.position.x + piece.speedx)/SCREEN_WIDTH;
tempMod = (tempMod - (int)tempMod)*SCREEN_WIDTH;
nextPosition.x = tempMod;
tempMod = (piece.position.y + piece.speedy)/SCREEN_HEIGHT;
tempMod = (tempMod - (int)tempMod)*SCREEN_HEIGHT;
nextPosition.y = tempMod;
piece.position = nextPosition;
}
Set new Speed
- (void) adjustPieceSpeed:(Piece *) piece{
piece.speedx =(piece.speedx>0)? piece.speedx-0.05:piece.speedx+0.05;
piece.speedy =(piece.speedy>0)? piece.speedy-0.05:piece.speedy+0.05;
}
Bien, je suis actuellement en utilisant la technique statique réglage de la vitesse, mais j'espère le rendre dynamique en fonction de la vitesse initiale (j'apprécie une idée)
des informations plus loin, s'il vous plaît laissez-moi savoir – Sadat