Deplacement fluide d'une image

allianallian Membre
23:21 modifié dans API UIKit #1
Bonjour alors aujourd'hui j'attaque une nouvelle appli !!
Et oui ils sont gourmands les boss..

Je vous expose mon soucis, je dois faire un espèce de pacman qui bougerait à  l'endroit où l'utilisateur toucherais l'écran.

Pour cela j'ai donc crée une classe qui s'occupe de mon pacman, pour le moment j'arrive à  la redessiner à  l'endroit ou l'on touche l'écran l'étape suivant est donc de faire bouger ce dernier d'un endroit à  l'autre sans "disparaitre" comme par magie, de bouger quoi.

Je ne vois pas trop comment m'y prendre, dois je faire appel à  Quartz ou Open GL ? ou y a t il une méthode plus simple ?

Merci de votre aide  :)

Réponses

  • AliGatorAliGator Membre, Modérateur
    mai 2009 modifié #2
    CoreAnimation.

    Si en plus ton déplacement est sensé être en ligne droite (et pas "contourner des murs" par exemple), t'as même pas à  préciser le CGPath qu'il doit suivre, il va directement déplacer ton objet (ta UIView représentant ton PacMan) de l'ancienne à  la nouvelle position.

    Donc pour ça le plus simple c'est juste d'encadrer ton changement de position ([tt]pacmanview.center = newPosition[/tt]) d'un [tt][UIView beginAnimations:nil context:NULL][/tt] avant et d'un [tt][UIView commitAnimations][/tt] après. Et hop, ça devrait marcher comme par magie :)
  • allianallian Membre
    23:21 modifié #3
    J'avais déjà  fait cela et ça marche, mon pacman en faite suit mon doigt et si je retire mon doigt il s'arrete.
    Voila mon code :

    -(void)move {<br />	if (isStoped == YES) {}<br />	else <br />	{<br />	<br />	CGFloat speed = 2;<br />	CGFloat dx = dest.x - x;<br />	CGFloat dy = dest.y - y;<br />	<br />	if ( abs((int)dx) &gt; abs((int)dy)) <br />	{<br />		<br />		if (dx &lt;= 0) <br />		{<br />			x-=speed;<br />		}<br />		else x+=speed;<br />	}<br />	else <br />	{<br />			if (dy &lt;= 0) <br />			{<br />				y-=speed;<br />			}<br />			else y+=speed;<br />	}<br />	<br />	CGPoint currentPosition = CGPointMake(x,y);<br />	self.view.center = currentPosition;<br />	<br />	<br />	//if (self.view.center.x == currentPosition.x &amp;&amp; self.view.center.y == currentPosition.y) [myTimer invalidate];<br />	}<br />	<br />}<br /><br />-(void)destination:(CGPoint)theDestination {<br />	<br />	dest = theDestination;<br />	if(monTimer == NO) {<br />	myTimer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(move) userInfo:nil repeats:YES];<br />	}<br />	monTimer = YES;<br />}<br />
    


    Ceci étant appelé la :

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {<br />	<br />	UITouch* touch = [touches anyObject];<br />	monBleeker.isStoped = NO;<br />	CGPoint currentPosition = [touch locationInView:self.view];<br />	[monBleeker destination:currentPosition];<br />	<br />}<br /><br />-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {<br />	UITouch* touch = [touches anyObject];<br />	monBleeker.isStoped = NO;<br />	CGPoint currentPosition = [touch locationInView:self.view];<br />	if (monBleeker.x != currentPosition.x &amp;&amp; monBleeker.y != currentPosition.y)<br />	{<br />		[monBleeker destination:currentPosition];<br />	}<br />}<br /><br />- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {<br />	//UITouch *touch = [touches anyObject];<br />	monBleeker.isStoped = YES;<br />	monBleeker.monTimer = NO;<br />	[monBleeker.myTimer invalidate];<br />	<br />}
    


    ça fait bien ce que je voulais mais surement qu'avec CoreAnimation ça doit être plus fluide mais je sais pas trop comment m'y prendre.

    La je planche sur la matrice contenant mes 0 ou 1 représentant mes murs ou couloirs.
    D'ailleurs comment on déclare une matrice en Objective-c... :-\\
  • AliGatorAliGator Membre, Modérateur
    23:21 modifié #4
    dans 1242394039:
    ça fait bien ce que je voulais mais surement qu'avec CoreAnimation ça doit être plus fluide mais je sais pas trop comment m'y prendre.
    Bah... exactement comme je t'ai dit, il suffit d'encadrer ton "self.view.center = currentPosition" qui est à  la fin de ta méthode "move" par un [tt][UIView beginAnimations:nil context:NULL][/tt] avant et un [tt][UIView commitAnimations][/tt] après.

    Ou (j'ai un doute là ) sinon de ne pas modifier le center de ta view mais de son layer associé : [tt]self.view.layer.center = currentPosition[/tt]... (au pire tu testes les 2, vu que c'est juste une ou 2 lignes à  rajouter dans ton code c'est quand même pas la mort ;D)
  • allianallian Membre
    23:21 modifié #5
    Merci pour ton aide, j'ai testé avec CoreAnimation et le résultat est presque le même qu'avec mon code, la seule différence vient du fait que comme le pacman doit suivre le mouvement du doigt et aller aussi vers un simple clic tant que le doigt ne bouge pas, au mouvement l'animation ne prend pas en compte le setDuration et se fait instantanément du coup j'ai gardé mon code qui fonctionne très bien.

    J'ai d'ailleurs presque réussi à  faire déplacer mon pacman en respectant mes murs (matrice à  deux dimensions remplie de 0 et 1), j'ai juste quelques soucis d'algo je dirais, je dois m'embrouiller entre les lignes et colonnes ou vice versa bref c'est une question de logique.

    Mais j'ai presque réussi.Merci
  • NseaProtectorNseaProtector Membre
    mai 2009 modifié #6
    Peut-être que cette exemple te sera utile.
    Note: c'est un des exemples du podcast de Stanford University disponible gratuitement sur iTunes.
  • allianallian Membre
    23:21 modifié #7
    Merci merci j'ai réussi à  faire ce que je voulais :D
Connectez-vous ou Inscrivez-vous pour répondre.