Comment faire bouger des formes (cercles, carrés, triangles, ...) aléatoirement

apocaalypsoapocaalypso Membre
03:16 modifié dans API UIKit #1
Bonjour,

Je voudrais faire bouger des formes (cercles, carrés, triangles, etc...) préalablement déclarés dans la fonction drawRect: dans ma vues et en faire disparaà®tre une lorsque l'utilisateur appuie sur dessus.

Comment pourrais-je faire ?

merci d'avance pour votre aide,

@pocalyps0
«13

Réponses

  • CeetixCeetix Membre
    03:16 modifié #2
    il te faut utiliser les fonctions suivantes :

    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

    -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;


    Tu fais varier la positon x et y de tes objets en fonction de la position de ton doigt. A chaque changement de coordonnée sur fait un setNeedsDisplay de ta class où tu drawRect afin de redessiner tes objet à  leur nouvelle position.
  • apocaalypsoapocaalypso Membre
    03:16 modifié #3
    Désolé mais je n'ai pas bien compris comment il fallait faire, je suis nouveau dans la programmation iPhone.
  • CeetixCeetix Membre
    03:16 modifié #4
    ah merde j'avais pas vu le aléatoirement ^^.

    Eh bien à  tu fais une fonction rafraà®chissement qui s'appelle à  intervalle régulier (NSTimer) et tu fais un random sur x et y tout en oubliant pas le setNeedDisplay avant de quitter la fonction.
  • CeetixCeetix Membre
    03:16 modifié #5
    Fait voir déjà  comment tu dessines dans drawRect . Juste ton code.
  • apocaalypsoapocaalypso Membre
    03:16 modifié #6
    Pour l'instant mon code ne fait que tracer un petit cercle :
    // Draw shape in the current view<br />- (void)drawRect:(CGRect)rect {<br />	<br />	CGContextRef context = UIGraphicsGetCurrentContext();<br />		<br />	[[UIColor whiteColor] setStroke];<br />	CGContextDrawPath(context, kCGPathFillStroke);<br />	<br />	CGContextSetRGBStrokeColor(context, 0, 0, 0.153, 1);<br />	CGContextStrokeEllipseInRect(context, CGRectMake(10, 90, 36, 36));<br />}
    

  • CeetixCeetix Membre
    03:16 modifié #7
    Ok.
    Dans ton point h mets ca :

    <br />...<br />CGFLoat x;<br />CGFLoat y;<br /><br />}<br /><br />@property(nonatomic,assign) CGFLoat x;<br />@property(nonatomic,assign) CGFLoat y;<br />
    



    dans ton .m

    <br />@implementation ...<br />@synthetize x,y;<br />
    



    et tu remplaces

    CGContextStrokeEllipseInRect(context, CGRectMake(10, 90, 36, 36));

    par

    CGContextStrokeEllipseInRect(context, CGRectMake(x, y, 36, 36));



    A toi de voir pour la suite ;)
  • apocaalypsoapocaalypso Membre
    mars 2009 modifié #8
    Il me dit que mes GLFloat ne sont pas déclarés :
    #import &lt;UIKit/UIKit.h&gt;<br />#import &lt;Foundation/Foundation.h&gt;<br /><br />@class MainView;<br />@class EAGLView;<br /><br />@interface GameView : UIView {<br />	IBOutlet MainView *mainView;<br />	IBOutlet EAGLView *glView;<br />	UIAlertView *usageAlertView;<br /><br />	CGFLoat x;<br />	CGFLoat y;<br />}<br /><br />@property(nonatomic,assign) CGFLoat x;<br />@property(nonatomic,assign) CGFLoat y;<br /><br /><br />@end
    


    EDIT: C'est juste le L de CGFloat qui était en majuscule.
  • CeetixCeetix Membre
    03:16 modifié #9
    Oui en effet j'ai mal tapé sorry.
  • apocaalypsoapocaalypso Membre
    03:16 modifié #10
    Tu n'as pas à  t'excuser pour ça, tu m'aides c'est déjà  énorme !

    Je vais me référé à  ton post sur ton blog pour faire bouger une boule, c'est vraiment très pratique, un grand merci !

    Mais par contre, comment puis-je faire pour faire disparaitre ma forme ou ma boule quand l'utilisateur la touche ?
    Merci !
  • CeetixCeetix Membre
    03:16 modifié #11
    Sauf que de mon tuto je la bouge grace a une image, je n'ai pas besoin de refresh.
  • CéroceCéroce Membre, Modérateur
    03:16 modifié #12
    dans 1236638638:

    Mais par contre, comment puis-je faire pour faire disparaitre ma forme ou ma boule quand l'utilisateur la touche ?


    Ton problème est très similaire à  celui exposé ici:
    http://www.objective-cocoa.org/forum/index.php?topic=3361.0

    Pour faire disparaà®tre la forme, qui est stockée comme les autres dans un NSMutableArray, il suffit de la retirer du NSMutableArray:
    [formesArray removeObject:laFormeTouchee];
  • apocaalypsoapocaalypso Membre
    03:16 modifié #13
    Merci !
    Mais je voudrais détecter la position du doigt de l'utilisateur, vérifié si elle est sur la position de la balle et si oui la faire disparaà®tre. C'est surtout la première étape sur laquelle je bloque.
  • CeetixCeetix Membre
    03:16 modifié #14
    Je t'ai donné les méthode tout en haut pour retirer les coordonnées de ton doigt sur l'écran. Tu compares ces coordonnée à  celles de ton objet. Si c'est inclus dedan soit tu le delete de ton tableau soit tu mets ton alpha à  0.
  • apocaalypsoapocaalypso Membre
    03:16 modifié #15
    J'ai fait ça mais ça n'a pas l'air de marcher :
    // Function called when the user begin to touch the screen<br />- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event<br />{<br />	UITouch *touch = [touches anyObject];<br />	CGPoint location = [touch locationInView:[touch view]];<br />		<br />	if(location.x == coordonnees.x &amp;&amp; location.y == coordonnees.y)<br />	{<br />		[self setBackgroundColor:[UIColor clearColor]];<br />	}<br />} <br />
    

  • CeetixCeetix Membre
    03:16 modifié #16
    C'est normal. Ton doigt c'est un tres gros curseur. Quand tu le mets sur ton objet, ce n'est pas précis du tout. Faut vraiment avoir de la cha*** pour tomber sur les coordonnées exactes ^^.

    <br />// Function called when the user begin to touch the screen<br />- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event<br />{<br />	UITouch *touch = [touches anyObject];<br />	CGPoint location = [touch locationInView:[touch view]];<br />		<br />	if(location.x &lt;=(coordonnees.x + rayon) &amp;&amp; location.x &gt;=(coordonnees.x - rayon)&nbsp; &amp;&amp; location.y &gt;= (coordonnees.y - rayon) &amp;&amp; location.y &lt;= (coordonnees.y + rayon) )<br />	{<br />		[self setBackgroundColor:[UIColor clearColor]];<br />	}<br />} <br />
    


    Essai ça. Ici je suppose que ton objet a ses coordonnée (0,0) en son centre. Sinon dans la plus part des cas c'est en haut a gauche. donc :
    <br />/ Function called when the user begin to touch the screen<br />- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event<br />{<br />	UITouch *touch = [touches anyObject];<br />	CGPoint location = [touch locationInView:[touch view]];<br /><br />if(location.x &gt;= coordonnees.x &amp;&amp; location.x &lt;=(coordonnees.x + rayon)&nbsp; &amp;&amp; location.y &gt;= coordonnees.y &amp;&amp; location.y &lt;= (coordonnees.y + rayon) )<br />	{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  [self setBackgroundColor:[UIColor clearColor]];<br />	}<br />} <br />
    
  • apocaalypsoapocaalypso Membre
    03:16 modifié #17
    Ca ne marche toujours pas. Pour info, j'utilise iPhone Simulator, peut-être que le problème vient de la.
    Voici le code de ma page en entier, ça peut toujours servir :
    #define CIRCLE_RAYON 35<br /><br />@implementation GameView<br /><br />// Function called when the view is loaded<br />-(void)awakeFromNib<br />{	<br />	// The squared-transparent image<br />	UIImage *squared = [UIImage imageNamed:@&quot;squared-bg.png&quot;];<br />	// We clear the view to add the squared-transparent background<br />	[self setBackgroundColor:[UIColor clearColor]];<br />	// We add the squared-transparent background<br />	[self setBackgroundColor:[UIColor colorWithPatternImage:squared]];<br />	<br /><br />	/*// Adding a random background image<br />	NSArray *circlePat = [[NSArray alloc] initWithObjects:@&quot;blue-circle.png&quot;, @&quot;yellow-circle.png&quot;, @&quot;violet-circle.png&quot;, nil];<br />	NSUInteger backgroundIndex = arc4random() % [circlePat count];<br />	NSString *circlePattern = [circlePat objectAtIndex:backgroundIndex];<br />	<br />	[circle setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:circlePattern]]];*/<br />	<br />	// Generate random numbers which will be the coordonates of the circle at start<br />	NSInteger wx =&nbsp; 1 + arc4random() % 20;<br />	NSInteger wy =&nbsp; 1 + arc4random() % 30;<br />	<br />	coordonnees = CGPointMake(wx,wy);<br />	[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(randomMove) userInfo:nil repeats:YES];<br />}<br /><br /><br />/*<br />// Draw shape in the current view<br />- (void)drawRect:(CGRect)rect {<br />	<br />	CGContextRef context = UIGraphicsGetCurrentContext();<br />	<br />	[[UIColor whiteColor] setStroke];<br />	CGContextDrawPath(context, kCGPathFillStroke);<br />	<br />	CGContextSetRGBStrokeColor(context, 0, 0, 0.153, 1);<br />	CGContextStrokeEllipseInRect(context, CGRectMake(x, y, 36, 36));<br />}*/<br /><br /><br />// Function called when the user begin to touch the screen<br />- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event<br />{<br />	UITouch *touch = [touches anyObject];<br />	CGPoint location = [touch locationInView:[touch view]];<br />		<br />	if(location.x &gt;= coordonnees.x &amp;&amp; location.x &lt;=(coordonnees.x + CIRCLE_RAYON)&nbsp; &amp;&amp; location.y &gt;= coordonnees.y &amp;&amp; location.y &lt;= (coordonnees.y + CIRCLE_RAYON) )<br />	{<br />		[self setBackgroundColor:[UIColor clearColor]];<br />	}<br />} <br /><br /><br />// Make the circle move randomly<br />-(void)randomMove<br />{<br />	NSLog(@&quot;randomMove:&quot;);<br />	<br />	// Initalizing the circle<br />	circle.center = CGPointMake(circle.center.x+coordonnees.x, circle.center.y+coordonnees.y);<br />	<br />	// Changing the circle direction when hiting the edges of the screen<br />	if((circle.center.x)-20 &lt; 0.0 || (circle.center.x)+20 &gt; 320.0)<br />	{<br />		coordonnees.x = -coordonnees.x;<br />		NSLog(@&quot;coordonnees.x = -coordonnees.x;&quot;);<br />	}<br />	if((circle.center.y)-20 &lt; 0.0 || (circle.center.y)+20 &gt; 460.0)<br />	{<br />		coordonnees.y = -coordonnees.y;<br />		NSLog(@&quot;coordonnees.y = -coordonnees.y;&quot;);<br />	}<br />}<br /><br />@end
    
  • CeetixCeetix Membre
    03:16 modifié #18
    Je pense qu'il faut mettre le touchesBegan etc dans ton Controller.
    Il est bizar ton code (c'est personnel).
  • apocaalypsoapocaalypso Membre
    03:16 modifié #19
    En quoi il est bizarre ?
    En même temps je viens de débuter alors je voudrais bien savoir où il l'est ^^
  • apocaalypsoapocaalypso Membre
    03:16 modifié #20
    En fait, je viens de me rendre compte que c'est la condition qui foire.
    Je l'ai remplacée par
    if(location.x &gt;= (coordonnees.x + CIRCLE_RAYON) &amp;&amp; location.y &gt;= (coordonnees.y + CIRCLE_RAYON))<br />
    


    Mais là  la condition se vérifie partout sur l'écran...
  • CeetixCeetix Membre
    03:16 modifié #21
    C'est normal. Regarde dans ta condition....
    Je te l'ai fait plus haut et tu t'en sers même pas  :'(
    enfin ca devrai marcher quand meme mais tu pourra cliquer ailleur que sur ta balle pour que ca marche lol
  • AliGatorAliGator Membre, Modérateur
    03:16 modifié #22
    Quitte à  ne faire qu'un test de contenance rectangulaire (point à  Â± n pixels du centre en x comme en y), il est plus simple de créer un CGRect adéquat et de tester CGRectContainsPoint

    [tt]if (CGRectContainsPoint(CGRectMake(coordonnees.x-rayon,coordonnees.y-rayon,2*rayon,2*rayon) , location)) { ... }[tt]

    Ou sinon si on veut un test de contenance circulaire, si les balles sont circulaires par exemple, bah il suffit de vérifier si la distance entre le point du toucher et le centre est inférieur au rayon (via pythagore bien sûr)
  • CeetixCeetix Membre
    03:16 modifié #23
    Bon sur le principe j'avais bon, après c'est sûr que tes méthodes est plus rapide ali  ::)
  • apocaalypsoapocaalypso Membre
    03:16 modifié #24
    Merci Ali, j'ai essayé avec ça :
    UITouch *touch = [touches anyObject];<br />	CGPoint location = [touch locationInView:[touch view]];<br />		<br />	if(location.x &lt; (coordonnees.x+35) &amp;&amp; location.y &lt; (coordonnees.y+35))<br />
    

    J'étais persuadé que ça allait marcher et pourtant non. Je ne comprend pas, normalement l'aspect mathématique est vérifié !
  • CeetixCeetix Membre
    03:16 modifié #25
    Tu affiches la position de ton doigt ?

    Genre fait :

    <br /><br />UITouch *touch = [touches anyObject];<br />CGPoint location = [touch locationInView:[touch view]];<br /><br />NSLog(@&quot;X =%f | Y =%f&nbsp; ||&nbsp; DoigtX =%f | DoigtY =%f&quot;,coordonnee.x,coordonnee.y,location.x,location.y);<br /><br />	if(location.x &lt; (coordonnees.x+35) &amp;&amp; location.y &lt; (coordonnees.y+35))<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;Rentre dans if&quot;);<br /><br />
    


    Si ca fait bien tout ca alors le probleme est ailleur.
  • AliGatorAliGator Membre, Modérateur
    03:16 modifié #26
    Je ne comprend pas apocaalypso pourquoi tu ne testes qu'une partie de l'écran ? que si c'est inférieur au X et Y de la boule ? Au lieu de vérifier que ton point est dans une zone autour de ta balle ?!
  • CeetixCeetix Membre
    03:16 modifié #27
    J'avais même pas vu ^^.
    Ca fait la n ieme fois (bon 3 fois en fait) que je lui dis mais ça n'a pas l'air de vouloir rentrer . Lui meme s'aperçoit en plus que "ça balaye tout l'écran" ...
  • apocaalypsoapocaalypso Membre
    03:16 modifié #28
    dans 1236715992:

    Je ne comprend pas apocaalypso pourquoi tu ne testes qu'une partie de l'écran ? que si c'est inférieur au X et Y de la boule ? Au lieu de vérifier que ton point est dans une zone autour de ta balle ?!


    J'ai essayé ta condition mais elle ne fonctionne pas.
    Voici la réponse du NSLog (j'ai essayé de cliquer sur la balle) :
    X =-3.000000 | Y =24.000000  ||  DoigtX =83.000000 | DoigtY =289.953613
  • CeetixCeetix Membre
    03:16 modifié #29
    C'est bizar, avant de faire ton action (de rentrer dans le if) ta balle à  une position x de -3 c'est dire en dehors de l'ecran. Enfin si tu me dis que tu mets ton doigt sur ton objet ya un gros soucis vu que les coordonnées sont totalement différents.
  • apocaalypsoapocaalypso Membre
    03:16 modifié #30
    J'utilise le iPhone Simulator, alors pour toucher la balle c'est plus dur avec le trackpad.
    Un deuxième essai :
    X =-14.000000 | Y =9.000000  ||  DoigtX =79.000000 | DoigtY =324.953613

    Ce que je trouve bizarre aussi c'est qu'il y a une énorme différence entre les coordonnées de la balle et celle du clic.
  • CeetixCeetix Membre
    03:16 modifié #31
    .......  ;D

    Tu es bien plus précis avec une souris (trackpad ici) qu'avec un doigt voyons. Moi j'ai pas d'iphone et je fais tout avec le simulateur. Tu es de mauvais foie là  quand même. Admettons que c soit dur avec le trackpad, tu n'aurais quand même pas de telle différence de coordonnée ...
Connectez-vous ou Inscrivez-vous pour répondre.