2011-05-24 5 views
5

Mi sto strappando i capelli cercando di capire quello che sembra essere un problema molto facile. So che molte di queste cose sono state discusse in modo tangenziale, quindi scuse se questo calca su un terreno ben coperto, ma non riesco a trovare nulla di specifico per la mia soluzione (credetemi, ho guardato).iOS - Trascinando gli oggetti lungo i percorsi curvi

Fondamentalmente voglio trascinare un oggetto/sprite lungo un percorso curvo predefinito (non solo spostarlo, ma DRAG IT). Pensa alla cosa "Slide to unlock" dell'iPhone, ma invece di trascinare il cursore da sinistra a destra, rendi il percorso un arco o una linea ondulata.

Il mio pensiero di base era:

  • definire un tracciato Bezier, impostare l'oggetto nel punto di partenza.
  • se l'oggetto viene toccato, controllare la rilevazione del colpo sul percorso di Bezier in ToccaMolti (o qualche funzione simile). se i tocchi rimangono sul percorso, fai avanzare lo sprite lungo il percorso fino a che il percorso non termina (nel qual caso, l'attività è finita) o il dito dell'utente si allontana dal percorso (nel qual caso, l'oggetto dovrebbe tornare all'inizio).

Niente di tutto questo è banale (almeno, è così che sembra). Ad esempio:

  • Fare il rilevamento di un colpo su un percorso di Bezier è un dolore reale poiché è effettivamente necessario farlo sulla porzione segnata, non sulla porzione di riempimento. E anche allora, non riesco a trovare un modo per farlo su un percorso di qualsiasi larghezza - solo sul percorso di 1 punto di punto di Bezier.
  • Lo spostamento di un oggetto parzialmente lungo un percorso non sembra nemmeno possibile: tutti i metodi di animazione spostano lo sprite lungo il percorso INTERO. Inoltre, per fare ciò è necessario trovare il punto sul percorso più vicino al tocco dell'utente, il che, se lo si è mai visto, implica una matematica incredibilmente complicata.
  • Ho pensato di usare corpi rigidi per occupare tutto lo spazio, TRANNE il percorso, quindi l'oggetto può muoversi solo nel percorso. Tuttavia, ciò richiede la definizione di corpi rigidi curvi, alcuni dei quali devono essere concavi. Senza uscita.

Sto rendendo questo troppo difficile? Non sembra così complicato. Non ho bisogno di una soluzione completa, solo un nuovo modo di pensare a questo e dare il via nella giusta direzione. Qualsiasi aiuto sarebbe molto apprezzato.

+0

So che questo è stato chiesto molto tempo fa, ma mi sto imbattendo in qualcosa di molto simile in questo momento e mi stavo chiedendo se avessi capito fuori e potrebbe essere in grado di aiutarmi a orientarmi lungo il percorso corretto. – gikygik

risposta

1

Che ne dici di questo?

  • Considera l'asse X del tuo bezier percorso.
  • Ogni volta che l'utente tocca o interagisce con lo schermo, guarda la porzione x del tocco.
  • Mappa che X coordina con il tuo percorso e sposta l'oggetto nella giusta posizione.
+0

Questa soluzione funzionerebbe se la curva attraversasse lo stesso punto sull'asse X più di una volta? Ad esempio, cosa succede se la curva è semplicemente la lettera "S". Lo stesso punto X può verificarsi più volte per diversi punti Y sulla curva ... – johnnysports

+0

No, non lo farebbe. Quello che puoi fare è usare l'asse Y per decidere quale punto della curva dovresti regolare su – arclight

0

Sì, lo stai rendendo troppo difficile.

Prendere la semplificazione suggerito in precedenza (o lungo un cerchio, la linea, ecc) se funziona, o se si vuole veramente farlo contro una curva di Bézier, considerare quanto segue:

  1. sguardo al definizione della curva di Bézier
  2. Quello che stai cercando è definire una nuova posizione dell'oggetto P 'da una posizione attuale P e un cambiamento nella posizione di tocco D.
  3. Se riformulare la P originale (x, y) in termini di t (curve di Bézier sono parametrici), allora il problema diventa trovare quanto i t offset da aggiungere in base a D.
  4. Qualcosa che coinvolge il differenziale del bezier FN in P potrebbe essere un buon modo per farlo. Cioè, quanto sarebbe stato aggiunto se la curva fosse stata una linea retta proveniente dal punto P lungo la curva.

EDIT: transizione tra i segmenti: Se ogni segmento ha t in [0,1), allora si può rilevare t> = 1 e passare al segmento successivo, l'impostazione P alla fine del precedente segmento, e valutare il movimento di nuovo in relazione a quel punto. Potrebbero esserci delle euristiche se hai un sacco di piccoli punti, ecc.

+0

Andrew, grazie per la tua risposta. Per favore, sopportami perché sto davvero cercando di capirlo, ma mi sta ancora sfuggendo. Penso che le tue e le soluzioni di arclight potrebbero non funzionare per percorsi più complicati. Credo (correggimi se sbaglio) che la tua soluzione funzionerà se la mia curva è una curva più semplice. Tuttavia, se costruisco un percorso costituito da più segmenti, alcuni diritti, alcune curve quad, alcuni archi (che l'SDK consente), ho bisogno di capire quale segmento sono attivo e quindi calcolare la nuova posizione. Vedi cosa sto dicendo? – johnnysports

+0

Vedere sopra per un possibile modo di gestirlo. –

+0

So che tutto questo è stato chiesto molto tempo fa, ma sto cercando di fare qualcosa di simile ora e mi chiedevo se potessi rispondere a questa domanda. Sto volendo trascinare lungo un'ellissi che ho disegnato usando un percorso beizer. C'è un modo per ottenere tutti i punti nell'ellisse in modo da poter fare ciò che hai raccomandato sopra? – gikygik