2012-04-19 4 views
10

Sto creando un puzzle 2D per iOS e attualmente sto cercando di implementare lo zoom e lo scorrimento con UIPinchGestureRecognizer.Zoom e scorrimento con OpenGL ES

Lo zoom è fatto in questo modo: ho un vettore 2D di destinazione che è un "punto di zoom". Il codice è:

glTranslatef(target.x, target.y, 0); 
glScalef(scale, scale, 0); 
glTranslatef(-target.x, -target.y, 0); 

bersaglio viene selezionato con il gesto riconoscitore in questo modo:

-(void)handlePinchGesture:(UIPinchGestureRecognizer*)recognizer 
{ 
    if (UIGestureRecognizerStateBegan == [recognizer state]) 
    { 
     view->setTarget([recognizer locationInView:self]); 
    } 
    // Rest of the code omitted 
} 

Tutto funziona bene.

Inizialmente il gioco è stato progettato per iPAD, ma voglio che funzioni anche su iPhone e iPOD. Ma iPhone e iPOD hanno proporzioni diverse. Per mantenere le proporzioni iniziali dell'immagine ho deciso di rendere la scala Y un po 'più grande. Anche questo ha reso possibile scorrere il campo di gioco su e giù con il fattore di zoom iniziale. Il codice è:

glTranslatef(target.x, target.y, 0); 
glScalef(scale, scale * aspectRatio, 0); 
glTranslatef(-target.x, -target.y, 0); 

Questo funziona bene se il campo di gioco è "centrato" lo schermo (per esempio quando ci sono lo stesso spazio in direzioni bot magnetiche (su e giù).). Ma se si fa scorrere il campo verso l'alto o verso il basso e si inizia il gesto di pizzicare, il campo di gioco salta nuovamente al centro.

Capisco che ho bisogno di tradurre la posizione del gesto di qualche offset, ma non riesco a capire come esattamente per 3 giorni.

+0

Non ho ottenuto esattamente lo zoom e il codice in movimento, ma sembra che tu non prenda in considerazione la nuova posizione della scena dopo lo spostamento e con quello zoom con la vecchia posizione come centro dello zoom. È necessario ricordare in quale posizione è attualmente la scena e ridimensionare e tradurre concat. –

+0

Non gestisco la posizione della scena - solo scala "target", che può essere ovunque sullo schermo e non può essere invocata su :( – riens

+0

Piuttosto trovare e ricalibrare la funzione "glOrthof" quindi ridimensionare con alcune proporzioni .. –

risposta

1

Salva la quantità di traduzione eseguita a scorrimento, quindi dopo ogni chiamata a handlePinchGesture, applica la traduzione che avevi salvato a scorrimento.

Spero che aiuti.