Come rilevare collisioni tra sprite e una forma generata dall'utente di qualche tipo?


9

Come rilevare una collisione tra uno sprite e una forma generata dall'utente di qualche tipo.

Per esempio. Ci sono alcuni oggetti sullo schermo. L'utente prende il dito e disegna una forma circolare attorno a un oggetto (la regola di selezione è disegnare un cerchio attorno allo sprite, ma le forme della pittura possono essere diverse). Devo rilevare quale oggetto selezionato, che è proprio come:

(immagini dimostrative): originariamente pubblicato come http://i52.tinypic.com/28h0t1g.png


Puoi spiegare perché il blu è selezionato e non rosso nell'esempio finale? Puoi anche chiarire se la linea deve effettivamente toccare lo sprite? Il terzo esempio non tocca il riquadro rosso ma è indicato come selezionato. Il quinto esempio è molto simile ma non selezionato. Qual è la differenza che stai cercando tra # 3 e # 5?
Romen,

Risposte:


2

Se la forma viene disegnata principalmente con segmenti di linea dell'utente (o curve di Bezier con punti di controllo), è possibile implementare un algoritmo abbastanza diffuso noto come Teorema dell'asse di separazione . In poche parole: se esiste un asse (vettore unitario che rappresenta una direzione) su cui le forme non si sovrappongono (i loro valori proiettati non danno luogo a una differenza positiva), gli oggetti non si sovrappongono. L'ho usato in passato e ha funzionato come un fascino.



0
  • Crea un buffer delle stesse dimensioni dello schermo (o della superficie in cui sono le tue forme). In ogni posizione contiene booleano se c'è sprite; quindi, controlla tutti i "pixel" della forma dell'utente se nella loro posizione è lo sprite (controllando il valore di quel valore booleano). In alternativa, puoi creare più sprite lì memorizzando il loro ID invece che booleano; ma questo era il caso di 1 sprite.
  • Se la forma generata dall'utente può essere rappresentata da una sequenza di linee, è possibile verificare se ciascuna di queste linee attraversa lo sprite. Poiché lo sprite ha una forma rettangolare e la forma dell'utente è una linea, basta cercare "intersezione rettangolo di linea" ... (l'algoritmo di separazione degli assi è un modo per farlo)

Gli approcci dipendono dalle strutture di dati scelte, siano esse bitmap o vettori.

Il primo approccio può gestire forme complesse arbitrarie, è semplice da implementare ma utilizza più memoria. In realtà è possibile ridurre l'overhead della memoria utilizzando la compressione e accelerandola utilizzando le strutture gerarchiche di dati (octrees) ...

Secondo approccio, non è così semplice da implementare ma utilizza più potenza di elaborazione.

In ogni caso misurare se è importante. Vorrei provare a fare il primo perché è più semplice da implementare. In bocca al lupo. :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.