Rilevamento collisione con bitmap sulla canvas di SurfaceView in Android

In Android uso un SurfaceView per visualizzare un semplice gioco 2D. Le bitmap (.png) con alpha (che rappresentano gli oggetti di gioco) vengono disegnate sulla canvas.

Ora vorrei fare un semplice ma accurato rilevamento di collisioni. Controllare se queste bitmap si sovrappongono è abbastanza facile.

  • Posizione SDK non trovata. Definire la posizione con sdk.dir nel file local.properties o con una variabile di ambiente ANDROID_HOME
  • Come gettare / sfilare la palla spazzando via con AndEngine?
  • Come faccio a scoprire l'utilizzo della memory della mia applicazione in Android?
  • Android - non aggiornare Google Maps v2 in rotazione
  • BOOT_COMPLETED non funziona Android
  • android come ridimensionare la width e l'altezza del video in vista di superficie per il lettore multimediale
  • Ma come verificare le collisioni quando queste bitmap hanno aree trasparenti? La mia sfida è scoprire se due palle si scontrano o no. Riempiono l'integer bitmap in width e in altezza, ma in tutti e quattro i bordi, naturalmente ci sono aree trasparenti come è un cerchio in un quadrato.

    Qual è il modo più semplice per individuare le collisioni solo se le palle veramente si scontrano, non la scatola bitmap circostante?

    Devo memorizzare le coordinate di tanti punti sul profilo della palla come ansible? O può Android "ignorare" il canale alfa quando si verifica una collisione?

  • Tachimetro Android (ago)
  • Framebuffer FBO rende la texture molto lenta, utilizzando OpenGL ES 2.0 su Android, perché?
  • Disegnare un'image 2D utilizzando OpenGL ES 2.0
  • Problema ritagliato a schermo in un gioco 2-D unitario
  • Rendering di più immagini 2D in OpenGL-ES 2.0
  • Android - Come disegnare un gradiente basato sull'arco
  • 3 Solutions collect form web for “Rilevamento collisione con bitmap sulla canvas di SurfaceView in Android”

    Se si tratta di collisione palla, è ansible eseguire analisi di collisione analitica – sarà molto più veloce rispetto al rilevamento per pixel. Devi solo avere due centri di palline (x1, y1) e (x2, y2) e raggio r1 per la prima palla e r2 per il secondo. Ora se la distanza tra i centri di palla è minore o uguale alla sum del raggio allora le palle si scontrano:

    colide = sqrt((x1-x2)^2+(y1-y2)^2)<=r1+r2 

    ma un modo più veloce è confrontare il quadrato di questo valore:

      colide = (x1-x2)^2+(y1-y2)^2<=(r1+r2)^2 

    Un altro metodo che posso pensare sarà lavorare con oggetti semplici che possono essere costruiti utilizzando Path s.

    Una volta che hai due oggetti i cui confini sono rappresentati da routes, puoi provare a:

     Path path1 = new Path(); path1.addCircle(10, 10, 4, Path.Direction.CW); Path path2 = new Path(); path2.addCircle(15, 15, 8, Path.Direction.CW); Region region1 = new Region(); region1.setPath(path1, clip); Region region2 = new Region(); region2.setPath(path2, clip); if (!region1.quickReject(region2) && region1.op(region2, Region.Op.INTERSECT)) { // Collision! } 

    Una volta che hai gli oggetti come routes, puoi disegnarli direttamente utilizzando drawPath () . È anche ansible eseguire il movimento per trasformare () il path.

    È molto più facile utilizzare una libreria esistente come AndEngine invece di reinventare la ruota. Non sono sicuro se può essere utilizzato con un SurfaceView però. Controlla questo articolo: Pixel Perfect Detection Collision per AndEngine .

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.