Frage von gut4fr5g4, 112

LibGDX Intersector nullpointer?

Ich will eine Kollisionserkennung zwischen einem Kreis und einem Rectangle machen, aber folgende codezeile macht probleme:

if(Intersector.overlaps(playerShape, elements[i])){

        }

macht probleme, genauer verursacht die Methode Intersector.overlaps eine nullpointer exception:

at com.badlogic.gdx.math.Intersector.overlaps(Intersector.java:894)

Was kann ich tun, damit dies nicht so ist, bzw wie kann ich die Kollision von einem Kreis mit einem Rectangle prüfen?

LG

Antwort
von Springrbua, 55

Es liegt definitiv am angegebenen Rectangle (elements[i]), welches null ist.

Wenn du dir den Sourcecode von "Intersector" anschaust, steht da folgendes:

public static boolean overlaps (Circle c, Rectangle r) {
    float closestX = c.x;
    float closestY = c.y;
    if (c.x < r.x)       // <----- Wirft die Exception

Da "c.x" bereits zwei Zeile vorher aufgerufen wird, ist "c" sicher nicht Null, ansonsten würde die NullpointerException bereits früher geworfen werden.

Somit bleibt nur mehr "r.x" als Fehlerquelle, was bedeutet, dass das Rectangle "r" null ist. Dieses stammt in deinem Beispiel aus dem elements-Array.

Folglich musst du überprüfen wann und warum dieses Rectangle null ist.

Kommentar von gut4fr5g4 ,

Danke 

Für mich macht es wenig Sinn weil ich vorher einen Setter aufgerufen habe der den Array initialisiert

Der Vorredner hat bereits den ganzen code bekommen wäre nett wenn du da mal reinschreiben könntest

Kommentar von Springrbua ,

Den Kode ohne Unterstützung einer IDE und ohne Debugger zu durchsuchen ist ziemlich aufwändig. Ich empfehle dir das Ganze einfach mal selbst zu debuggen. Die meisten IDEs unterstützen sogenannte "Conditional Breakpoints", welche den Debugger nur Stoppen, wenn die angegebene Bedingung erfüllt ist. Du kannst diesen auf die Zeile mit dem "overlaps" setzen und als Bedingung "elements[i]==null" angeben.

Anschließend könntest du dir das Array "elements" genauer anschauen und untersuchen, warum es an der Stelle "i" null ist.

Kommentar von gut4fr5g4 ,

ich verstehe den debugger nicht, kannst du das für mich machen? :c

als assets kannst du ja irgendwas nehmen :C

Wäre super nett :/

Kommentar von Springrbua ,

Nein, kann ich nicht. Der Debugger ist eines der wichtigsten Werkzeuge. Wenn du damit nicht umgehen kannst, wirst du immer wieder Probleme haben. Wie ich bereits in einem anderen Kommentar erwähnt habe, hättest du ca. die Hälfte der Fragen die du hier gestellt hast mit Hilfe des Debuggers selbst beantworten können.

Schau dir einfach ein paar Videos dazu an, die Basics solltest du relativ einfach lernen können.

Antwort
von jaunel, 88

Du musst dir sicher sein dass bei elements an der Stelle [ i ] auch ein Objekt ist, es darf nicht null sein. Versuche vorher mal System.out.println() den Inhalt von Elements auszugeben, um zu schauen ob es null ist oder nicht.

Kommentar von gut4fr5g4 ,

wie gesagt 

"Intersector.overlaps" verursacht die exception, das habe ich schon getestet

LG

Kommentar von jaunel ,

Das ist mir bewusst, aber was wird ausgegeben wenn du elements[ i ] ausgibst? dann weißt du zumindest dass die exception dadurch verursacht wird

Kommentar von gut4fr5g4 ,

[314.0,1620.0,100.0,100.0]

und das bei jedem Rectangle aus dem Array, nur halt mit anderen Zahlen

Kommentar von jaunel ,

Dann ist playerShape womöglich null

Kommentar von gut4fr5g4 ,

Nein, ich habe ebenfalls playerShape in der Konsole ausgegeben, und es kam folgendes raus: 

910.0,490.0,99.99999

Gibt es noch eine andere möglichkeit der collision detection?

weil der sche*ss funktioniert ja anscheinend nicht...

Kommentar von gut4fr5g4 ,

auch wenn alle elemente des arrays nicht null sind geht das nicht, ich habe es mit einem anderen rectangle getestet und da ging es also muss es an elements liegen, aber da ist doch alles richtig

Kommentar von jaunel ,

könntest du evtl den ganzen Code mal schicken? über pastebin etc

Kommentar von gut4fr5g4 ,
Kommentar von jaunel ,

ich sehe dort keinen code

Kommentar von gut4fr5g4 ,

Wurde gelöscht, sorry.

Hier: http://pastebin.com/HD3641kc

Kommentar von gut4fr5g4 ,

weißt du jetzt den fehler? :c

Kommentar von jaunel ,

Nein leider nicht :/ hatte das Problem auch schon einmal ich kann noch mal gucken ob ich es hinbekomme

Kommentar von gut4fr5g4 ,

Wäre echt geil von dir

Kannst ja den Code kopieren bei dir einfügen und ich schick dir meine assets

Kommentar von jaunel ,

Ok kannst du die mir schicken? über PN als Link vllt?

Kommentar von gut4fr5g4 ,
Kommentar von jaunel ,

Ist es okay wenn ich mich morgen bei dir melde? Weil werde es heute wahrscheinlich nicht mehr hinbekommen

Kommentar von gut4fr5g4 ,

Klar

Antwort
von jaunel, 29

Also ich habe es jetzt getestet und hinbekommen :D.

Das Problem war, dass das rectangle array in der Player Klasse noch null war, jedoch trotzdem darauf zugegriffen wurde. Ein einfacher Test bevor die Collision testest ist schon ausreichend:

if(elements != null && Intersector.overlaps(playerShape, elements[i])){
//Kollision
}

LG jaunel

Kommentar von gut4fr5g4 ,

Danke, aber ich habe immernoch die Selbe exception -.-, kannst du nochmal den ganzen code schicken, den du jetzt hast?

Kommentar von jaunel ,

Ja morgen, aber das ist jetzt echt komisch :c weil ich habe es auf dem Handy getestet und es hat funktioniert. Nur die Blöcke wurden nach kurzer Zeit extrem schnell :DD

Kommentar von gut4fr5g4 ,

ok schickst du?

Kommentar von jaunel ,

Ah sorry habs vergessen aber wie gesagt ich habe eigentlich nichts geändert auser in der Player Klasse nämlich das was ich geschickt habe

Kommentar von gut4fr5g4 ,

oh :c

trotzdem danke! :)

Kommentar von jaunel ,

Und du hast das dann auch so ersetzt? Welche Fehlermeldung kommt denn im Moment? Die gleiche wie vorher an der selben Stelle?

Kommentar von gut4fr5g4 ,

ja :/

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten