J'ai fait un programme de peinture. Tout fonctionne comme je m'y attendais. Mais en dessinant, parfois certaines choses étranges se produisent.
i Exécutez l'application et appuyez sur le bouton gauche de la souris sur l'image. Il devrait dessiner le point de code: p> au point où j'appuie. p> C'était premier problème. Le deuxième problème est que lorsque je peint avec elle (faites glisser la souris enfoncée), des points apparaissent parfois où ils ne sont pas dessinés. Image: p> p> Quand je continue la traînée . Après que certains traînés, cela apparaisse à nouveau et disparaisse à nouveau. Etc. Image: P> p> Des idées pourquoi il pourrait arriver? Je posterai le code ci-dessous: p> souris down: p> souris glissé: p> MouseDown Code> Registres MouseDown Situation, la convertit à NSValue, envoie au tableau, puis avant de dessiner, j'entraîne NSValue sur CGPoint et envoyez-la à GLFLOOt afin qu'il puisse être tiré par GLDRAWARRAIS. Mais peu importe où je clique sur la souris sur l'image, il tire le point aux coordonnées (0,0). Après cela, tout fonctionne bien. Voir l'image: p>
- (void) drawing {
int count = [vertices count] * 2;
NSLog(@"count: %d", count);
int currIndex = 0;
GLfloat *GLVertices = (GLfloat *)malloc(count * sizeof(GLfloat));
for (NSValue *locationValue in vertices) {
CGPoint loc = locationValue.pointValue;
GLVertices[currIndex++] = loc.x;
GLVertices[currIndex++] = loc.y;
}
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, brushTextura);
glPointSize(100);
glVertexPointer(2, GL_FLOAT, 0, GLVertices);
glDrawArrays(GL_POINTS, 0, count);
glDisableClientState(GL_VERTEX_ARRAY);
}
3 Réponses :
Les arguments des GLDRAWARRAIS sont définis comme (GLENUM MODE, GLINT GLINT, COMPTE GLSIZEI). P>
Les deuxièmes arguments définissent le premier index des attributs Vertex utilisés lors du dessin. Vous passez 1 en tant que premier index qui rend votre Vertex Coordonnées inégalée. Je suppose que tu veux 0 là-bas. P>
http://www.opengl.org/sdk/docs/ Man / XHTML / GLDRAWARRAIS.XML P>
Vous définissez votre Le dernier argument à variable code> variable (celle utilisée dans
GLDRAWARRAYA code>) sur
[nombre de sommets] * 2 code>, qui semble étrange. < / p>
GLDRAWARRAAILES code> est le nombre de sommets à dessiner, alors que dans votre code, il semble que vous définissez cela pour doubler le nombre (vous avez peut-être pensé que c'était le nombre de flotteurs?), qui signifie que vous attrapez simplement des ordures après le premier
compter code> sommets. p>
Si je le change en [Les sommets comptent] code>, il se casse lorsque je commence à dessiner. Peu de points étant dessinés OK, et après cela, il montrait une erreur:
thread 1: exc_bad_access (code = 13, adresse = 0x0) code> au
GLDRAWARRAY (GL_POOTS, 0, Compte); CODE> Ou à
NSValue * EmplacementValue = [Nsvalue Valuewithpoint: Vieta]; Code> Erreur
Fil 1: Signal SIGABRT code>. Une erreur une fois une erreur, une autre erreur d'autre erreur. Je ne sais pas pourquoi, mais l'erreur n'est pas la même tout le temps
Et parfois à la casse, il affiche un message dans la console: OGL (896,0x7FF79C93960) MALLOC: *** Erreur pour l'objet 0x100151A98: CheckSum incorrect pour objet libéré - objet a probablement été modifié après avoir été libéré. *** Définir un point d'arrêt dans malloc_error_break pour déboguer code>
@ Juliuspetraška La raison est probablement que vous l'utilisez également dans le MALLOC code> pour
GLVERTIS code>, de sorte que le tableau Vertex est trop petit et que vous lisez une fois de plus trop de sommets (seulement ceci temps entraînant un crash). Bien sûr, les grevices code> code> doivent avoir une taille de
[nombre de sommets] * 2 code>, car il contient 2 flotteurs pour chaque sommet. Mais alors vous devez seulement dessiner
[nombre de sommets] code> des sommets complets dans
GLDRAWARRAIS code>.
Merci beaucoup P.S. Je ne peux pas vous adorez avec Bounty maintenant. Il dit que je dois attendre 23 heures
Le fait que les sommets ne sont pas rendus dans l'emplacement exact que vous avez cliqué sur ON doivent être un indice de problème que vous n'avez pas déterminé correctement le point de frappe dans la vue.
Votre code a: P> xxx pré>
qui indique la vue de convertir le point de ses coordonnées (auto) vers les coordonnées de la même vue (auto), même si le point est réellement relativement à la fenêtre. P>
Pour convertir le point de la fenêtre des coordonnées de la fenêtre en vue, modifiez cette ligne ci-dessous: P>
location = [self convertPoint: [event locationInWindow] fromView: nil];