Touch Sample (simple touch)
Hoy toca algo sencillo con el touch, de momento y para no complicarnos nos vamos a olvidar que tenemos un cacharro MultiTouch … asi que vamos a darle caña solo con un dedito
Crear un Proyecto OpenGL
Como siempre vamos a empezar desde 0 y es creando un proyecto en OpenGL Es, abrimos el XCode vamos a File > New Proyect y seleccionamos un proyecto “OpenGL ES Application“, pulsamos el botón choose y le damos el nombre que nos interese:
Nuestra Clase GL
Por ahora no vamos a aportar nada nuevo a nuestra clase GL para dibujar sprites, asi que os toca copiar los pasos que ya hicimos en nuestro capitulo Sprites en OpenGL os recuerdo que ahi solamente vamos a definir la clase GL.m vamos a agregar el Framework CoreGraphics.Framework, y vamos a añadir un nuevo archivo grafico a los resources del proyecto.
También deberemos copiar todas las modificaciones que hicimos a la clase EAGLView.m, los metodos inicializar, setupView, clearBuffer y swapBuffer que agregamos.
.. y mas recopilaciones, en el anterior capitulo UIAccelerometer Sample vimos como meter Labels en pantalla sin pasar por el Interface Builder .. de ahi nos traemos ese metodo.
Asi resumimos a saco y este ejemplo nos vamos a centrar en el Touch
Touching
Vamos a empezar por EAGLView.h, por un lado aqui tenemos las variables para la interfaz
| C | | copy code | | ? |
| 1 | |
| 2 | UILabel *myLabel; |
| 3 | GLuint textureid; |
| 4 | GLfloat posx,posy; |
| 5 | bool touching; |
| 6 | GLfloat touchx, touchy; |
y por aquí los métodos que vamos a implementar
| C | | copy code | | ? |
| 1 | |
| 2 | - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; |
| 3 | - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; |
| 4 | - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; |
Y pasamos a la implementación en EAGLView.m,
En primer lugar buscamos el metodo initWithCoder y creamos nuestra label
| C | | copy code | | ? |
| 1 | |
| 2 | myLabel = [self newLabelWithOffset:(self.frame.origin.y + 25) numberOfLines: 1]; |
| 3 | myLabel.text = @"Touch Sample"; |
| 4 | [self addSubview:myLabel]; |
seguimos con nuestro metodo inicializar
| C | | copy code | | ? |
| 1 | |
| 2 | -(void)inicializar |
| 3 | { |
| 4 | // Cargamos la unica textura que vamos a usar |
| 5 | textureid = [GL loadTexture:@"4Sprites.png"]; |
| 6 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
| 7 | |
| 8 | touching = false; |
| 9 | } |
Implementamos los 3 metodos del Touch
| C | | copy code | | ? |
| 01 | |
| 02 | // Este metodo se llama cada vez que se inicia un evento |
| 03 | // Touch con la pantalla, nos da como parametro un array de Touchs |
| 04 | // |
| 05 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event |
| 06 | { |
| 07 | // Sacamos uno de los touchs, el primero |
| 08 | UITouch *touch = [[event allTouches] anyObject]; |
| 09 | |
| 10 | // y lo convertimos a las coordenadas en 2D segun la vista |
| 11 | CGPoint location = [touch locationInView:touch.view]; |
| 12 | |
| 13 | touching = true; |
| 14 | touchx = location.x - 160; |
| 15 | touchy = location.y - 240; |
| 16 | myLabel.text = [NSString stringWithFormat:@"touchesBegan = (%1.1f,%1.1f) ", touchx, touchy]; |
| 17 | } |
| 18 | |
| 19 | // Este evento se llama cada vez que alguno de los Touchs se mueve |
| 20 | - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event |
| 21 | { |
| 22 | UITouch *touch = [[event allTouches] anyObject]; |
| 23 | CGPoint location = [touch locationInView:touch.view]; |
| 24 | |
| 25 | touching = true; |
| 26 | touchx = location.x - 160; |
| 27 | touchy = location.y - 240; |
| 28 | myLabel.text = [NSString stringWithFormat:@"touchesMoved = (%1.1f,%1.1f) ", touchx, touchy]; |
| 29 | } |
| 30 | |
| 31 | // |
| 32 | // |
| 33 | - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event |
| 34 | { |
| 35 | touching = false; |
| 36 | myLabel.text = [NSString stringWithFormat:@"touchesEnded"]; |
| 37 | } |
| 38 | |
| 39 | - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event |
| 40 | { |
| 41 | touching = false; |
| 42 | myLabel.text = [NSString stringWithFormat:@"touchesCancelled"]; |
| 43 | } |
| 44 |
Bien, de un vistazo rápido, tenemos 4 métodos para el Touch:
touchesBegan
Este evento se lanza cuando algún dedo toca la pantalla, lo único que hacemos es pillar un touch cualquiera del array que nos pasa y sacar sus coordenadas X e Y, como nuestra pantalla tiene el eje de coordenadas <0,0> centrado en pantalla le restamos ese desfase a las coordenadas que nos de el Touch. Además marcamos una variable booleana a True para saber que estamos moviendo los deditos por la pantalla.
touchesMoved
Este evento funciona exactamente igual que el anterior, pero se va a lanzar cada vez que alguno de los Touchs se mueva. Hacemos lo mismo que hacíamos en el Began.
touchesEnded y touchesCancelled
Ambos eventos se lanzan cuando uno de los touchs termina, pero solo he podido reproducir el Ended .. no se cuando se lanza el Cancelled, pero ahí lo dejamos por si acaso.
Como veis en todos estos métodos actualizamos el texto del Label, así estamos informados en todo momento de lo que pasa
drawView
| C | | copy code | | ? |
| 01 | |
| 02 | |
| 03 | - (void)drawView |
| 04 | { |
| 05 | |
| 06 | if(touching) |
| 07 | { |
| 08 | posx += (touchx - posx) * 0.5f; |
| 09 | posy += (touchy - posy) * 0.5f; |
| 10 | } |
| 11 | else |
| 12 | { |
| 13 | posx -= posx * 0.1f; |
| 14 | posy -= posy * 0.1f; |
| 15 | } |
| 16 | |
| 17 | [self clearBuffer]; |
| 18 | glLoadIdentity(); |
| 19 | |
| 20 | glPushMatrix(); |
| 21 | [GL setSprite:textureid frame:1]; |
| 22 | glTranslatef(posx,posy,0); |
| 23 | [GL drawSprite:-64 y1:-64 x2:64 y2:64]; |
| 24 | glPopMatrix(); |
| 25 | |
| 26 | [self swapBuffer]; |
| 27 | } |
| 28 |



juanmiguelrr on January 12th, 2009
¡Vaya! Parece que vas avanzando con esta web… A ver si por fin sale el nuevo iMac y aprendo un poquillo siguiendo los tutoriales y no tengo que empezar de cero.