Redessiner une UIView sur demande

allianallian Membre
20:28 modifié dans API UIKit #1
Bonjour,
dans mon pacman, je me penche maintenant sur le "mangeage" de boules  :)
Les boules sont dessinées à  partir d'un tableau tout comme mon labyrinthe d'ailleurs. Du coup je sais pas trop comment m'y prendre pour que le pacman les mangent.

Dois-je redessiner par dessus une boule noire ou dois je rappeler ma UIView avec un tableau mis à  jour ?

J'ai essayé de me créer une propriété qui est un tableau que je mettais à  jour mais j'avais des erreurs de pointeur que je n'ai pas réussi à  résoude.

Merci  o:)

Réponses

  • allianallian Membre
    20:28 modifié #2
    Pour le moment je fais ça :

    int laby2[20][30] = {<br />{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},<br />{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},<br />{1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1},<br />{1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1},<br />{1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1},<br />{1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1},<br />{1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,0,1,1,1,1,0,1},<br />{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},<br />{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}<br />};<br /><br />- (id)initWithFrame:(CGRect)frame {<br />&nbsp; &nbsp; if (self = [super initWithFrame:frame]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Initialization code<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return self;<br />}<br /><br /><br />- (void)drawRect:(CGRect)rect {<br />&nbsp; &nbsp; // Drawing code<br /><br />	/*UIImageView *blah = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@&quot;background.jpg&quot;]];<br />	[self addSubview:blah];<br />	[self sendSubviewToBack:blah];<br />	[blah release];*/<br />	<br />	CGFloat x,y;<br />	int i, j = 0;<br />	<br />	UIColor *currentColor = [UIColor lightGrayColor];<br />	CGContextRef context = UIGraphicsGetCurrentContext();<br />	CGContextSetLineWidth(context, 2.0);<br />	CGContextSetStrokeColorWithColor(context, currentColor.CGColor);<br />	CGContextSetFillColorWithColor(context, currentColor.CGColor);<br />	<br />	for (i = 0; i &lt;= 20; i = i + 1)<br />	{<br />		for (j = 0; j &lt;= 30; j = j + 1)<br />		{<br />			if (laby2[i][j] == 0)<br />			{<br />				x = 16 * j;<br />				y = 16 * i;<br />				CGRect currentRect = CGRectMake(x, y, 5, 5);<br />				CGContextAddEllipseInRect(context, currentRect);<br />				CGContextDrawPath(context, kCGPathFillStroke);<br />			}<br /><br />		}<br /><br />	}<br /><br />	<br /><br /><br />}
    


    Ceci dans ma UIView.

    J'obtiens cette erreur "subscribed value is neither pointer nor array" à  la ligne if (laby[c][l] == 0)

    Voici ma déclaration :

    @interface Labirynthe : UIView {<br /><br />	int laby2;<br /><br />}<br /><br />@property(nonatomic, readwrite) int laby2;<br />@end
    


    Après j'aimerais accéder à  ce tableau pour le modifier et ainsi rappeler le drawRect avec setNeedsDisplay afin de redéssiner la vue.
    Une idée ??
  • CéroceCéroce Membre, Modérateur
    mai 2009 modifié #3
    Tu déclares laby2 en int. Ce n'est pas un tableau et c'est ce que signale le compilateur.

    Je vais tenter de t'expliquer le problème.
    Ce que tu fais actuellement, c'est déclarer un tableau global et l'initialiser avec des valeurs lors de sa création. Pour faire ce que tu veux, il te faudrait un tableau par instance, mais si tu déclares

    @interface Labirynthe : UIView {<br /><br />	int laby2[20][30];<br /><br />}
    


    Alors il te faudra remplir ce tableau dans la méthode -init, ce qui s'avère compliqué:

    laby2[0][0] = 1;
    laby2[0][1] = 0;
    etc.

    Tu pourrais écrire une fonction qui copie ton tableau global (constant) vers le tableau de la variable d'instance.

    Par ailleurs, le labyrinthe devrait faire partie de la couche modèle du paradigme MVC, et pas d'une vue.



    P.S.: j'espère que tu n'appelles pas
    UIImageView *blah = UIImageView alloc] initWithImage:[UIImage imageNamed:@&quot;background.jpg&quot;;
    dans drawRect:

    Sinon, tu m'étonnes que c'est lent ! Fais-le dans la méthode d'init.
  • allianallian Membre
    mai 2009 modifié #4
    Non je ne déclare pas UIIMageView dans drawRect, c'est un commentaire qui trainait.

    EDIT : j'ai bien compris ce que tu me dis, je devrais déclarer mon tableau global dans mon UIVIewController et ensuite le recopier dans une var d'instance dans la méthode init de ma UIView mais je ne sais pas comment faire cela. Y a t il moyen d'avoir ce tableau global accessible depuis ma UIView autrement que par une propriété ?


    Je suis un peu confus..

    Il faudrait que je puisse passer un nouveau tableau à  ma classe Labyrinthe à  chaque fois que mon pacman se déplace sur une nouvelle case afin que la UIView se redessine avec le bon tableau.

    Comme j'ai dit précédemment j'ai donc essayer de déclarer une propriété dans ma classe Labyrinthe qui serait de ce type int lab[20][30]; mais sans succés j'ai toujours des erreus de pointeurs, incompatibilité, bref je ne m'en sors pas.

    Je vais essayer de mieux m'expliquer.

    j'ai 3 classes :
    BleekerViewController qui crée une instance de la classe Bleeker (mon pacman) et qui appelle aussi ma classe UIView Labyrinthe qui déssine les boules.

    J'aimerais donc dans ma classe Bleeker pouvoir accéder à  ma classe Labyrinthe afin de lui passer un nouveau tableau et lui dire aussi setNeedsDisplay afin qu'elle se redessine.

    Mais la je ne sais plus quoi essayer...
    Une âme charitable pour m'aiguiller svp

    Un peu de code :

    ma classe Bleeker

    #import &quot;MyBleeker.h&quot;<br />#import &quot;Labirynthe.h&quot;<br /><br /><br />@implementation MyBleeker<br />@synthesize isBad, myBleeker, x, y, dest, myTimer, isStoped, monTimer, theLab;<br /><br /><br />//labirynthe 480 * 320 avec des cases de 16 * 16 ca fait 30 cases en horizontale et 20 en vertical<br />//&nbsp; &nbsp; &nbsp;  y&nbsp; &nbsp; x<br />int laby[20][30] = {<br />{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},<br />{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},<br />{1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1},<br />{1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1},<br />{1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1},<br />{1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1},<br />{1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,0,1,1,1,1,0,1},<br />{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},<br />{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}<br />};<br /><br />int balls[20][30] = {<br />{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},<br />{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},<br />{1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1},<br />{1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1},<br />{1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1},<br />{1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1},<br />{1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,0,1,1,1,1,0,1},<br />{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},<br />{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}<br />};<br /><br /><br />int l = 1;<br />int c = 1;<br /><br /><br /><br />-(void)init:(bool)theBool {<br />	if (theBool == YES)<br />	{<br />		isBad = YES;<br />		myBleeker.image = [UIImage imageNamed:@&quot;pac.jpg&quot;];	<br />	}<br />	else<br />	{<br />		isBad == NO;<br />		myBleeker.image = [UIImage imageNamed:@&quot;pac.jpg&quot;];<br />	}<br />	<br />}<br /><br />-(void)move {<br /><br />	<br />	if (isStoped == YES) {}<br />	else <br />	{<br />	<br />	CGFloat dx = dest.x - x;<br />	CGFloat dy = dest.y - y;<br /><br />	if ( (abs((int)dx) &gt; abs((int)dy)) &amp; (dx &lt; 0) &amp; (laby[l][c-1] == 0)) <br />	{<br />		c -= 1;<br />		balls[l][c] = 1;<br />	}<br />	<br />	else if ( (abs((int)dx) &gt; abs((int)dy)) &amp; (dx &gt; 0) &amp; (laby[l][c+1] == 0)) <br />	{<br />		c += 1;<br />		balls[l][c] = 1;<br />	}<br />		<br />	else if ( (abs((int)dx) &lt; abs((int)dy)) &amp; (dy &lt; 0) &amp; (laby[l-1][c] == 0)) <br />	{<br />		l -= 1;<br />		balls[l][c] = 1;<br />	}<br />	else if ( (abs((int)dx) &lt; abs((int)dy)) &amp; (dy &gt; 0) &amp; (laby[l+1][c] == 0)) <br />	{<br />		l += 1;<br />		balls[l][c] = 1;<br />	}<br />		<br />	else if ( (abs((int)dx) &lt; abs((int)dy)) &amp; (dx &lt; 0) &amp; (laby[l][c-1] == 0)) <br />	{<br />		c -= 1;<br />		balls[l][c] = 1;<br />	}<br />		<br />	else if ( (abs((int)dx) &lt; abs((int)dy)) &amp; (dx &gt; 0) &amp; (laby[l][c+1] == 0)) <br />	{<br />		c += 1;<br />		balls[l][c] = 1;<br />	}<br />		<br />	else if ( (abs((int)dx) &gt; abs((int)dy)) &amp; (dy &lt; 0) &amp; (laby[l-1][c] == 0)) <br />	{<br />		l -= 1;<br />		balls[l][c] = 1;<br />	}<br />	else if ( (abs((int)dx) &gt; abs((int)dy)) &amp; (dy &gt; 0) &amp; (laby[l+1][c] == 0)) <br />	{<br />		l += 1;<br />		balls[l][c] = 1;<br />	}<br />				<br />	CGFloat x2 = 16 * c;<br />	CGFloat y2 = 16 * l;<br />		<br />	x = x2;<br />	y = y2;<br />		<br /><br />	CGPoint currentPosition = CGPointMake(x,y);<br />	self.view.center = currentPosition;<br /><br />	}<br />	<br />}<br /><br />-(void)destination:(CGPoint)theDestination {<br />	<br />	dest = theDestination;<br />	if(monTimer == NO) {<br />	myTimer = [NSTimer scheduledTimerWithTimeInterval:0.12 target:self selector:@selector(move) userInfo:nil repeats:YES];<br />	}<br />	monTimer = YES;<br />}<br /><br /><br /><br />/*<br />// The designated initializer. Override to perform setup that is required before the view is loaded.<br />- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {<br />&nbsp; &nbsp; if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Custom initialization<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return self;<br />}<br />*/<br /><br />/*<br />// Implement loadView to create a view hierarchy programmatically, without using a nib.<br />- (void)loadView {<br />}<br />*/<br /><br /><br />// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.<br />- (void)viewDidLoad {<br />	self.view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@&quot;pac.jpg&quot;]];<br /><br />	//centrage de la vue<br />	CGPoint monCentre = CGPointMake(x, y);<br />	self.view.center = monCentre;<br />	<br />	self.view.userInteractionEnabled = YES;<br />	<br />&nbsp; &nbsp; [super viewDidLoad];<br />}<br /><br /><br />/*<br />// Override to allow orientations other than the default portrait orientation.<br />- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {<br />&nbsp; &nbsp; // Return YES for supported orientations<br />&nbsp; &nbsp; return (interfaceOrientation == UIInterfaceOrientationPortrait);<br />}<br />*/<br /><br />- (void)didReceiveMemoryWarning {<br />&nbsp; &nbsp; [super didReceiveMemoryWarning]; // Releases the view if it doesn&#39;t have a superview<br />&nbsp; &nbsp; // Release anything that&#39;s not essential, such as cached data<br />}<br /><br /><br />- (void)dealloc {<br />&nbsp; &nbsp; [super dealloc];<br />}<br /><br /><br />@end<br />
    


    ma classe labyrinthe :

    #import &quot;Labirynthe.h&quot;<br /><br /><br />@implementation Labirynthe<br />//@synthesize lab;<br /><br /><br />int lab[20][30] = {<br />{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},<br />{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},<br />{1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1},<br />{1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1},<br />{1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1},<br />{1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1},<br />{1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,0,1,1,1,1,0,1},<br />{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},<br />{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}<br />};<br /><br /><br />- (id)initWithFrame:(CGRect)frame {<br />&nbsp; &nbsp; if (self = [super initWithFrame:frame]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Initialization code<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return self;<br />}<br /><br /><br />- (void)drawRect:(CGRect)rect {<br />&nbsp; &nbsp; // Drawing code<br /><br />	/*UIImageView *blah = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@&quot;background.jpg&quot;]];<br />	[self addSubview:blah];<br />	[self sendSubviewToBack:blah];<br />	[blah release];*/<br />	<br />	CGFloat x,y;<br />	int i, j = 0;<br />	<br />	UIColor *currentColor = [UIColor lightGrayColor];<br />	CGContextRef context = UIGraphicsGetCurrentContext();<br />	CGContextSetLineWidth(context, 2.0);<br />	CGContextSetStrokeColorWithColor(context, currentColor.CGColor);<br />	CGContextSetFillColorWithColor(context, currentColor.CGColor);<br />	<br />	for (i = 0; i &lt;= 20; i = i + 1)<br />	{<br />		for (j = 0; j &lt;= 30; j = j + 1)<br />		{<br />			if (lab[i][j] == 0)<br />			{<br />				x = 16 * j;<br />				y = 16 * i;<br />				CGRect currentRect = CGRectMake(x, y, 5, 5);<br />				CGContextAddEllipseInRect(context, currentRect);<br />				CGContextDrawPath(context, kCGPathFillStroke);<br />			}<br /><br />		}<br /><br />	}<br /><br />	<br /><br /><br />}<br /><br /><br />- (void)dealloc {<br />&nbsp; &nbsp; [super dealloc];<br />}<br /><br /><br />@end<br />
    


    le viewDidLoad de mon UIViewController, BleekerViewController :

    - (void)viewDidLoad {<br />	<br />	self.title = @&quot;Bleeker&quot;;<br />	<br />	Labirynthe *myLabi = [[Labirynthe alloc] init];<br />	self.view = myLabi;<br />	<br />	self.view.backgroundColor = [UIColor clearColor];<br />	<br />	monBleeker = [[MyBleeker alloc] init];<br />	//monBleeker.theLab = myLabi;<br />	monBleeker.isBad = NO;<br />	monBleeker.x = 16.0;<br />	monBleeker.y = 16.0;<br /><br />	[self.view insertSubview:monBleeker.view atIndex:1];<br />	<br />	self.view.userInteractionEnabled = YES;<br />	[super viewDidLoad];<br />	<br />}
    



    MERCIIIII
  • allianallian Membre
    20:28 modifié #5
    Personne ne sait comment créer une propriété d'un tableau d'entiers svp ? Je bataille depuis hier et je coince !
  • CéroceCéroce Membre, Modérateur
    20:28 modifié #6
    Pour séparer le modèle de la vue, on crée un nouvelle classe:

    <br />//&nbsp; Labyrinthe.h<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />#define CASES_LARGEUR	20<br />#define	CASES_HAUTEUR	30<br /><br /><br />@interface Labyrinthe : NSObject<br />{<br />	int murs[CASES_LARGEUR][CASES_HAUTEUR];<br />	int boules[CASES_LARGEUR][CASES_HAUTEUR];<br />}<br /><br />@property (readonly) int murs*;<br />@property (readonly) int balles*;<br /><br />- (void) initWithLevel:(unsigned int) level;<br /><br />@end<br /><br />
    


    <br />//&nbsp; Labyrinthe.m<br /><br />#import &quot;Labyrinthe.h&quot;<br /><br />const int MursLevel0[CASES_LARGEUR][CASES_HAUTEUR] = {<br />{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},<br />{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},<br />{1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1},<br />{1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1},<br />{1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1},<br />{1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1},<br />{1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,0,1,1,1,1,0,1},<br />{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},<br />{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}<br />};<br /><br />int BoulesLevel0[CASES_LARGEUR][CASES_HAUTEUR] = {<br />{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},<br />{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},<br />{1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1},<br />{1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1},<br />{1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1},<br />{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1},<br />{1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1},<br />{1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1},<br />{1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,0,1,1,1,1,0,1},<br />{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},<br />{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}<br />};<br /><br /><br />@implementation Labyrinthe<br /><br />- (void) initWithLevel:(unsigned int) level<br />{<br />	self = [super init];<br />	if(self == nil)<br />		return nil;<br />	<br />	int *sourceMurs;<br />	int *sourceBoules;<br />	<br />	// Choisir les tableaux selon le niveau<br />	switch(level)<br />	{<br />		case 0:<br />			sourceMurs = MursLevel0;<br />			sourceBoules = BoulesLevel0;<br />			break;<br />		default:<br />			sourceMurs = NULL;<br />			sourceMurs = NULL<br />			NSLog(@&quot;niveau inconnu !&quot;);<br />			break;<br />	}<br />	<br />	// Copier les tableaux dans les variables d&#39;instance<br />	int colonne;<br />	int ligne;<br />	for(colonne = 0; colonne &lt; CASES_LARGEUR; colonne++)<br />	{<br />		for(ligne = 0; ligne &lt; CASES_HAUTEUR; ligne++)<br />		{<br />			murs[colonne][ligne] = sourceMurs[colonne][ligne];<br />			boules[colonne][ligne] = sourceBoules[colonne][ligne];<br />		}<br />	}<br />	<br />	return self;<br />}<br /><br />@synthesize murs;<br />@synthesize boules;<br /><br />@end<br /><br />
    


    Je n'ai pas vérifié que ça compilait, mais voilà  l'idée.
    Tu instancies un Labyrinthe dans ta vue et récupères les pointeurs sur les tableaux.

  • allianallian Membre
    20:28 modifié #7
    Merci beaucoup !
    J'avais réussi à  trouver une solution qui ressemblait à  la tienne, du coup j'ai fait un mélange des deux.

    Ca y est mon pacman, mange des boules, meurt lorsqu'il touche les ennemis, gagne lorsqu'il a tout mangé et voila.

    Me reste plus qu'à  gerer les bonus qui apparaissent et apres à  moi les niveaux et les finitions avant/apres partie.

    Merci beaucoup :adios!:
  • NigokiNigoki Membre
    20:28 modifié #8
    Je me permet de remonter ce topic car je n'y ai pas trouvé mon bonheur  :why?:

    Sur clic d'un bouton, j'appel un webservices et j'aimerai que pendant le temps de traitement et d'envoi/réponse HTTP, placer une UIView à  fond noir avec transparence sur ma view principale.

    Rien de bien compliqué jusque là  :
    <br />UIView *vBlack = [[UIView alloc] initWithFrame:self.view.frame];<br />vBlack.backgroundColor = [UIColor blackColor];<br />vBlack.alpha = 0.6;<br /><br />[self.view addSubview:vBlack];<br />[self.view setNeedsDisplay];<br />
    


    Excepté que la view se redéssine pas sur le setNeedsDisplay mais à  la fin de l'action, qui se trouve être, la fin du traitement de l'information.

    Du coup j'ai ma vue noire qui apparait à  la fin du traitement  :'(
  • zoczoc Membre
    20:28 modifié #9
    L'appel à  ton webservice est synchrone ou asynchrone (avec passage d'un delegate dont les méthodes vont être appelées pendant l'évolution de la requête) ?

    Parce que si c'est un appel synchrone, c'est normal que la vue ne se redessine pas...
  • NigokiNigoki Membre
    20:28 modifié #10
    Oui c'est synchrone. J'avais bien peur de ça...

    Pour faire de l'asynchrone, faudrait par exemple que je lance un Thread qui s'occupe de la requet HTTP et du traitement ? Ce n'est pas un appelle bloquant ?
  • AliGatorAliGator Membre, Modérateur
    20:28 modifié #11
    Ca dépend comment tu interroges ton service : tu as NSURLConnection qui te permet de faire des requêtes web de façon asynchrone par exemple.
    Sinon les classes NSInvocationOperation (que je suis en ce moment en train d'utiliser de plus en plus tellement je commence à  trouver ça pratique) te permettent de lancer des méthodes (des tâches en fait) de manière asynchrone en les installant sur une NSOperationQueue...
  • zoczoc Membre
    20:28 modifié #12
    dans 1244735927:

    Pour faire de l'asynchrone, faudrait par exemple que je lance un Thread qui s'occupe de la requet HTTP et du traitement ?


    Pas obligatoirement, cela dépend de ce que tu utilises pour effectuer la requête au webservice. Dis-nous en plus (classes/méthodes utilisées) et on pourra t'aider.
  • NigokiNigoki Membre
    juin 2009 modifié #13
    J'utilise NSURLConnection comme ceci :

    <br />NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSISOLatin1StringEncoding]];<br />	NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:5.0];<br />	<br />	NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:err];<br />	NSString *result = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];<br />
    


    J'ai regardé NSULRConnection avant de répondre ici sur l'aspect asynchrone :

    On éxécute la requete avec  connectionWithRequest:delegate:, on recupère le résultat avec  connection:didReceiveData:  et l'erreur si besoin avec connection:didFailWithError:, ai je bon ?

    Par contre je ne trouve pas le protocol à  utiliser comme il faut faire généralement avec un delegate. De plus, une fois la réponse HTTP reçu, je fais un traitement dessus, et j'aimerai que cet emsemble soit asynchrone, pas juste la requete.

    Pour NSInvocationOperation, je comprends pas bien le truc.
    -avec initWithTarget:selector:object: tu définie la méthode à  invoquer d'accord, tu la lances ensuite quand besoin avec la méthode invocation mais en quoi c'est asynchrone ? Il me faudrai qqchose pour lancer le traitement sans que ce soit bloquant pour noircir ma view. Et de recevoir un évènement quand le traitement est fini pour la rendre normal.
  • zoczoc Membre
    20:28 modifié #14
    dans 1244792858:

    J'ai regardé NSULRConnection avant de répondre ici sur l'aspect asynchrone :

    On éxécute la requete avec  connectionWithRequest:delegate:, on recupère le résultat avec  connection:didReceiveData:  et l'erreur si besoin avec connection:didFailWithError:, ai je bon ?
    Un truc comme ça oui (au boulot je n'ai pas de Mac malheureusement, et donc pas la doc de Cocoa à  disposition).

    Par contre je ne trouve pas le protocol à  utiliser comme il faut faire généralement avec un delegate.
    Parce que NSURLConnection utilise un protocol informel (car elle date de l'époque où les protocoles avec méthodes optionnelles n'existaient pas), donc déclaré comme une catégorie de NSObject.
  • AliGatorAliGator Membre, Modérateur
    20:28 modifié #15
    dans 1244792858:
    Pour NSInvocationOperation, je comprends pas bien le truc.
    -avec initWithTarget:selector:object: tu définie la méthode à  invoquer d'accord, tu la lances ensuite quand besoin avec la méthode invocation mais en quoi c'est asynchrone ? Il me faudrai qqchose pour lancer le traitement sans que ce soit bloquant pour noircir ma view. Et de recevoir un évènement quand le traitement est fini pour la rendre normal.
    Pour faire court, laisse tomber les NSInvocationOperations alors. Si tu utilises NSURLConnection, tu as déjà  tout ce qu'il faut pour faire des requêtes de manière asynchrone, et tu as l'air d'avoir compris le principe de comment faire.

    Maintenant pour ton information, les NSInvocationOperation (et NSOperation en général, dont NSInvocationOperation hérite) sont à  rajouter dans une NSOperationQueue (qui est une "pile de tâches à  exécuter de manière asynchrone"). Dès que tu rajoutes une NSOperation à  une NSOperationQueue, après c'est la NSOpQueue qui se charge de démarrer la NSOperation (dès qu'elle peut, en fonction des éventuelles dépendances de cette NSOperation avec les autres NSOps de la NSOpQueue, etc).
    Typiquement c'est pratique pour demander à  Cocoa de faire des tâches "quand t'as le temps", pour empiler des tâches à  faire et le laisser se débrouiller avec (surtout s'il y a des dépendances entre les tâches)... ou pour rendre asynchrone les méthodes qui ne le sont pas, en écoutant (via KVO) la clé "isFinished" pour être informé quand l'opération est terminée et en récupérer le résultat.


    Mais bon pour en revenir à  ton problème, si tu utilises NSURLConnection pour ta connection, c'est 10x plus simple (et plus logique !) d'utiliser NSURLConnection en mode asychrone, donc oublie NSInvocationOperation, qui n'est pas le plus adapté à  ton contexte finalement.
  • NigokiNigoki Membre
    20:28 modifié #16
    Merci à  vous deux pour vos explications et votre aide !

    Ali comme toujours merci pour ta patience et tes réponses complète  o:)
Connectez-vous ou Inscrivez-vous pour répondre.