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
 

  • Delicious
  • Twitter
  • Facebook
  • Meneame
  • WordPress
  • Digg
  • Google Reader
  • Google Bookmarks
  • Slashdot
  • Share/Bookmark

One Comment

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. :D

Leave a Comment