Autore Topic: Collisione tra bitmap  (Letto 2755 volte)

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Collisione tra bitmap
« il: 28 Novembre 2014, 16:39:54 CET »
0
Ciao a tutti, ho trovato questo codice per verificare la collisione tra due oggetti:
Codice (Java): [Seleziona]
public static boolean isCollisionDetected(Bitmap run2, int x1, int y1,
                        Bitmap kinfe, int x2, int y2) {

                Rect bounds1 = new Rect(x1, y1, x1+run2.getWidth(), y1+run2.getHeight());
                Rect bounds2 = new Rect(x2, y2, x2+kinfe.getWidth(), y2+kinfe.getHeight());

                if (Rect.intersects(bounds1, bounds2)) {
                        Rect collisionBounds = getCollisionBounds(bounds1, bounds2);
                        for (int i = collisionBounds.left; i < collisionBounds.right; i++) {
                                for (int j = collisionBounds.top; j < collisionBounds.bottom; j++) {
                                        int bitmap1Pixel = run2.getPixel(i-x1, j-y1);
                                        int bitmap2Pixel = kinfe.getPixel(i-x2, j-y2);
                                        if (isFilled(bitmap1Pixel) && isFilled(bitmap2Pixel)) {
                                                return true;
                                        }
                                }
                        }
                }
                return false;
        }

        private static Rect getCollisionBounds(Rect rect1, Rect rect2) {
                int left = (int) Math.max(rect1.left, rect2.left);
                int top = (int) Math.max(rect1.top, rect2.top);
                int right = (int) Math.min(rect1.right, rect2.right);
                int bottom = (int) Math.min(rect1.bottom, rect2.bottom);
                return new Rect(left, top, right, bottom);
        }

        private static boolean isFilled(int pixel) {
                return pixel != Color.TRANSPARENT;
        }

e funziona perfettamente ma avrei bisogno di utilizzare una variabile di tipo float perchè ho dei numeri con la virgola. Se provo a cambiare questa parte
Codice (Java): [Seleziona]
public static boolean isCollisionDetected(Bitmap run2, int x1, int y1,
                        Bitmap kinfe, int x2, int y2)
mettendo float al posto di int ottengo un errore su "Rect".
Qualcuno può aiutarmi?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Collisione tra bitmap
« Risposta #1 il: 28 Novembre 2014, 18:59:35 CET »
0
In codice è molto inefficiente, se lo fai in float diventa ancora di più inefficiente. Se hai la coordinata in float convertirla in un intero con un cast e usa il codice che hai.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Collisione tra bitmap
« Risposta #2 il: 28 Novembre 2014, 19:00:30 CET »
0
Puoi farmi un esempio? Grazie

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Collisione tra bitmap
« Risposta #3 il: 28 Novembre 2014, 19:12:01 CET »
0
Programmare sotto Android bisogna conoscere molto bene il linguaggio Java. Il cast di una variabile float in intero è molto semplice "(int)f" dove "f"  è una variabile float point.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Collisione tra bitmap
« Risposta #4 il: 28 Novembre 2014, 20:04:38 CET »
0
Ok grazie. Perché dici che è inefficiente?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Collisione tra bitmap
« Risposta #5 il: 28 Novembre 2014, 20:43:31 CET »
0
È lentissima 2 loop annidati, con la chiamata a getPixel, sono operazioni lente in Java e anche in altri linguaggi.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Collisione tra bitmap
« Risposta #6 il: 28 Novembre 2014, 20:44:27 CET »
0
Quale funzione potrei usare? Scusa ma se faccio un cast di una variabile float non perdo la parte decimale?
« Ultima modifica: 28 Novembre 2014, 20:50:29 CET da davix10 »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Collisione tra bitmap
« Risposta #7 il: 28 Novembre 2014, 20:58:27 CET »
0
Non esiste una funzione, il codice per fare quelli che vuoi viene di solito scritto in assembler con istruzioni SIMD o nel caso più estremo viene fatto elaborare dalla GPU direttamente. Il codice dello sprite collision di solito si trova in librerie specializzate per video giochi chiamate game engine.

Inviato dal mio Nexus 5 utilizzando Tapatalk
« Ultima modifica: 30 Novembre 2014, 01:47:28 CET da iceweasel »
adb logcat | tee /tmp/logcat | grep TAG

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Collisione tra bitmap
« Risposta #8 il: 28 Novembre 2014, 21:03:18 CET »
0
Invece per la parte del cast, se lo trasformo in intero perdo la parte decimale che a me serve

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Collisione tra bitmap
« Risposta #9 il: 29 Novembre 2014, 00:34:18 CET »
0
Le coordinate della bitmap sono per forza degli interi, basta che fai il cast quando passi le coordinate al metodo precedente.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Collisione tra bitmap
« Risposta #10 il: 29 Novembre 2014, 17:21:02 CET »
0
Io vorrei utilizzare questa fuzione:
Codice (Java): [Seleziona]
canvas.drawBitmap(run2, sx/16,  (float) (up*sy/4), null);
                                if(isCollisionDetected(run2, sx/16, up*sy/4, kinfe,kspeed,15*sy/18)==true && coll==false)

nella prima riga riesco mentre nella seconda non riesco...c'è un modo?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Collisione tra bitmap
« Risposta #11 il: 29 Novembre 2014, 18:40:47 CET »
0
Domanda incomprensibile.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Collisione tra bitmap
« Risposta #12 il: 29 Novembre 2014, 18:44:41 CET »
0
Up è una variabile float che riesco ad utilizzare per disegnare la bitmap con dei numeri con la virgola. Nel secondo caso, ossia quello della collisione, non riesco ad utilizzare la variabile float. Sono stato più chiaro?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Collisione tra bitmap
« Risposta #13 il: 30 Novembre 2014, 00:11:35 CET »
+1
Vediamo di inquadrare il problema, ti ricordo di riportare sempre l'esatto errore senza interpretazioni o omissioni.

La programmazione sotto Android implica una ottima conoscenza del linguaggio Java. In Java non esiste la conversione del tipo in automatico quando si perde di precisione. Una variabile float non può essere passata come parametro a un metodo se è dichiarato come intero. Devi esplicitamente fare la conversione con un cast, come ti è stato detto in precedenza.

Ad esempio il metodo "void pippo(int i)  {... };" se si vuole passare come argomento una variabile float "f"  devi fare: "pippo((int)f);".
   

Inviato dal mio Nexus 5 utilizzando Tapatalk
« Ultima modifica: 30 Novembre 2014, 01:48:24 CET da iceweasel »
adb logcat | tee /tmp/logcat | grep TAG

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS7
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Collisione tra bitmap
« Risposta #14 il: 30 Novembre 2014, 10:24:01 CET »
+1
Scusate l'intromissione:

Che ti importa dei decimali? La frazione di pixel neanche la vedi (i pixel sono discreti), fare videogiochi è un insieme di approssimazioni. Se non è un gioco puzzle game di incastri la collisione può essere approssimata anche di svariati pixel. Chi si accorge se in un gioco a 60fps il missile lungo 30 pixel, ti colpisce 4 o 5 pixel prima? Probabilmente esso viagga a 10 pixel a frame...
Solitamente non si fa nemmeno la collisione pixel a pixel, è sufficiente la collisione a primitive: Circle e box... se un oggetto è più complesso un area di collisione può essere composta da più primitive...
Ovviamente questo richiede una complessità maggiore a livello di editor di giochi (le aree di collisione vanno definite).

Riassunto: lascia stare i decimali, la collisione che usi è già fin troppo definita...

Ciao.