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

13»

Réponses

  • CeetixCeetix Membre
    21:15 modifié #62
    Oui c'est ça, il faut modifier ton cercle qui sera redessiner par la méthode drawRect.
  • apocaalypsoapocaalypso Membre
    21:15 modifié #63
    Oulah, je viens d'avoir un problème plus grave.
    Quand je teste le simulator en 3.0, Xcode m'affiche 122 erreurs alors qu'en 2.2.1 et inférieur tout marche sans problème.
    Voici les erreurs :
    http://paste.ideaslabs.com/show/iIK9NyrHUG

    Quelqu'un pourrait-il savoir d'où viennent ces erreurs ?
  • Philippe49Philippe49 Membre
    21:15 modifié #64
    Autant d'erreurs, peut-être un framework non inclus/mal inclus
  • apocaalypsoapocaalypso Membre
    21:15 modifié #65
    C'est à  quoi j'ai pensé en premier.
    J'ai donc supprimer tous les Framework un par un et re-inclus ceux de la 3.0 mais rien ne change.
  • apocaalypsoapocaalypso Membre
    21:15 modifié #66
    J'ai finit par recréer un projet sous Xcode et retransférer tous les fichier dans celui-ci.

    Il ne me reste maintenant plus qu'un problème : gérer correctement le mouvement de la balle (CGRect). En effet, elle rebondit bien sur les bords mais d'une manière non-normal d'un point de vue physique (elle cogne le bord droit en venant du haut et au lieu de repartir vers le bas repart vers le haut). Elle effectue aussi quelquefois un soubresaut.
    Voici ma fonction qui est appeller toutes les 0.05 secondes :
    // Make the circle move randomly<br />-(void)randomMove<br />{<br />	<br />	// Make the ball move<br />	blushBall = CGRectMake(blushBall.origin.x+speed, blushBall.origin.y+speed, CIRCLE_DIAM, CIRCLE_DIAM);<br /><br />	<br />	// Make the ball bounces on the screen edges<br />	if((blushBall.origin.x+CIRCLE_RAYON+15) &gt;= 320)<br />	{<br />		blushBall.origin.x = 320 - CIRCLE_RAYON - 15;<br />		speed = -speed;<br />		NSLog(@&quot;speed = %f&quot;, speed);<br />	}<br />	<br />	// Make the ball bounces on the screen edges<br />	if((blushBall.origin.x+CIRCLE_RAYON+15) &lt;= 0)<br />	{<br />		blushBall.origin.x = 0 + CIRCLE_RAYON + 10;<br />		speed = -speed;<br />		NSLog(@&quot;speed = %f&quot;, speed);<br />	}<br />	<br />	if((blushBall.origin.y+CIRCLE_RAYON+15) &gt;= 480)<br />	{<br />		blushBall.origin.y = 480 - CIRCLE_RAYON - 1;<br />		speed = -speed;<br />	}<br />	<br />	if((blushBall.origin.y+CIRCLE_RAYON+15) &lt;= 0)<br />	{<br />		blushBall.origin.y = 0 + CIRCLE_RAYON + 1;<br />		speed = -speed;<br />	}<br />	<br />	// Refreshing the drawRect:<br />	[self setNeedsDisplay];<br />}
    


    Mon drawRect: (me semble correct) :
    -(void)drawRect:(CGRect)rect<br />{	<br />	CGContextRef context = UIGraphicsGetCurrentContext();<br />	<br />	// Settings for the glow effect<br />	float glowWidth = 20.0;<br />	<br />	// Choosing between two colors to choose<br />	//NSInteger colorRand =&nbsp; 1 + arc4random() % 2;<br />	<br />	// Color for a blue-violet color<br />	float colorValues&#91;] = { 0.67058824, 0.51764706, 0.98431373, 1.0 };<br />		<br /><br />	CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();<br />	CGColorRef glowColor = CGColorCreate(colorSpace, colorValues);<br />	CGContextSetShadowWithColor(context, CGSizeMake(0.0, 0.0), glowWidth, glowColor);<br /><br />	// Fill with a clear violet-blue color<br />	CGContextSetRGBFillColor(context, 0.67058824, 0.51764706, 0.98431373, 1.0);<br />	<br />	CGContextFillEllipseInRect(context, blushBall);<br />	CGContextFillPath(context);<br />}
    


    Le morceau intéressant de mon awakeFromNib :
    // Generate random numbers which will be the coordonates of the circle at start<br />	NSInteger wx =&nbsp; 20 + arc4random() % 100;<br />	NSInteger wy =&nbsp; 20 + arc4random() % 200;<br />	<br />	speed = 2;<br />	<br />	CGPoint center = {wx, wy};<br />	float radius = CIRCLE_DIAM * 0.5;<br />	<br />	// We init the first circle<br />	blushBall = CGRectMake(center.x-radius, center.y - radius, CIRCLE_DIAM, CIRCLE_DIAM);<br />		<br />	[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(randomMove) userInfo:nil repeats:YES];<br />
    


    Je ne sais absolument pas comment faire rebondir ce CGRect (ici blushBall) correctement. Avec une UIImageView il suffisait de donner à  la coordonnée sa valeur opposée mais là  je ne sais absolument pas.

    Si quelqu'un aurait une petite astuce ou pourrait m'éclairer je lui en serait vraiment très reconnaissant.

    Encore merci,

    Guillaume
  • apocaalypsoapocaalypso Membre
    21:15 modifié #67
    J'ai fait une vidéo pour mieux vous montrer comment les mouvements de mon CGRect sont :
    http://mistralh.servhome.org/cgrect-bounce-problem.mov

    Ils ne rebondissent pas normalement.

  • schlumschlum Membre
    21:15 modifié #68
    C'est le cas de le dire... il y a un gros problème d'algorithmie là .

    C'est exactement le même principe qu'avec une image, et tout aussi facile, voire plus pourtant.
    - On touche un bord vertical -> le signe de l'abscisse du vecteur vitesse s'inverse
    - On touche un bord horizontal -> le signe de l'ordonnée du vecteur vitesse s'inverse
  • apocaalypsoapocaalypso Membre
    21:15 modifié #69
    J'ai trouvé la solution. J'ai bien suivi ton conseil et j'ai re-re-vu le (très bon) tuto de Ceetix : http://ceetix.wayfarer.fr/?p=75 et j'ai introduit le CGPoint coordonnees et inverser leur valeur pour mouvoir mes balles et elles rebondissent bien comme il le faut !

    Bon ben c'est triste à  dire mais je pense que mon problème est définitivement résolu.

    Merci beaucoup à  tous ceux qui m'ont aidé  ;)
Connectez-vous ou Inscrivez-vous pour répondre.