Hitboxen abfragen

Hallo zusammen,

ich habe einen Level-Editor programmiert, dieser funktioniert schon sehr gut.
Dabei habe ich mir gedacht, das ich die Hitboxen für eine Map auch automatisch mit zeichnen könnte.
Das heißt der Level-Editor zeichnet nicht nur die grafischen Quadrate die die Map darstellen sollen, sondern gleich mit jedem Quadrat eine passende Hitbox.
Das mit den Hitboxen funktioniert auch schon einwandfrei.

Probleme habe ich beim abfragen der Hitboxen.

Wenn ich z.B. 20 Quadrate mit Hitboxen habe, dann reagiert meine Kollisionsabfrage auf nur zwei Hitboxen. Auf die anderen Hitboxen reagiert die Abfrage nicht.
Die abfrage passiert genau bei den letzten zwei Hitboxen ganz am Ende der Map.

Hier mal der Code, indem die Quadrate und Hitboxen gezeichnet werden:

public void render(Graphics g) throws SlickException {
		   
		   int i;
		   int j =0;
		   
		   Image bild = new Image("Block.png");
		  		   
	     for(i<20; i++){
	       for(j=0; j<20; j++){
	     
	         if(array**[j] == 'h'){ //Himmel
	             g.setBackground(Color.pink);
	             g.fillRect(25*j, 25*i, 25, 25);
	             }
	         else if (array**[j] == 'g'){ //Gras
	             g.setColor(Color.green);
	             g.fillRect(25*j, 25*i, 25, 25);
	             }
	         else if (array**[j] == 'w'){ //Wasser
	             g.setColor(Color.blue);
	             g.fillRect(25*j, 25*i, 25, 25);
	             }
	         else if (array**[j] == 'e'){ //Erde
	             g.setColor(Color.red);
	             g.drawImage(bild, 25*j, 25*i);
	             hitbox = new Rectangle(25*j, 25*i, 25, 25);
	             g.draw(hitbox);
	             }
	            }
	           }
	          }

In der anderen Klasse frage ich in der updade-Methode die Kollision mit dem Spieler und der Hitbox des Quadrates ab:

             if(hitbox.intersects(editor.getHitbox())){
		System.out.println("Kollision erkannt!");
		}

Wie kann ich das machen, das er alle Hitboxen abfragt und nicht nur zwei?
Ich habe ewig lange herumprobiert und im Netz nachgelesen, doch leider nichts gefunden.

MfG

in der Schleife schreibst du bis zu 400x die Variable hitBox,
dass nur das letzte Schreiben übrig bleibt ist klar (wieso ‘zwei letzte’ sehe ich nicht)

du könntest die erzeugten hitBoxen in einer Liste speichern, das intersects dann per Schleife mit all denen testen, aber bringt das was?


generell sollte so eine Aufgabe nicht von render abhängen, da gibt es andere Wege,

etwa höhere Objekte im Array, die ihre Position kennen/ bei Änderung (unabhängig von render) updaten,
ob als Rectangle oder einfache int-Variablen zum selber rechnen,

in diesem Fall sind die Positionen anscheinend eh fest:
wenn du nun ‘editor.getHitbox()’ oder was auch immer als Pixelpositoon 234,68 hast,
dann könntest du daraus auch mit Teilung durch 25 und evt. Abzug der Grenzen Arraypostion von z.B. 9/2 ausrechnen
-> nur noch dort im Array nachzuschauen ob von dem Typ, der eine Hitbox hat

bei Verfolgung solcher Wege kann man natürlich viel falsch machen,
zur Sicherheit hier (aber ruhig auch bei der Hitbox-, wie allen Varianten) immer möglichst gegenkontrollieren:
die letzte bestimmte Position beim nächsten Rendern mit einem kleinen Punkt/ Kreis visualisieren,
auch das ausgewählte Array/ die ausgewählte HitBox mit einem extra-dicken Rahmen zeigen usw.

Die Methode heißt nur render, es ist aber nicht die render-Methode die BasicGame mit sich bringt.
Der erste code befindet sich in einer eigenen Klasse.

*** Edit ***

Das mit dem Array habe ich bereits probiert.
Leider hatte ich das Problem, das ich in der Getter-Methode mit der ich dann von der anderen Klasse auf das Array zugreife den gleichen Fehler hatte.
Das Array zu befüllen war kein problem.
Aber dann auf das gesamte Array von einer anderen Klasse aus zugreifen zu können, das habe ich nicht hinbekommen.

Meine Getter schaute so aus:

public Shape getHitboxen(){
    return arrayHitboxen**[j];
}

MfG

jede Methode die in ein Graphics zeichnet sollte allein das tun, keine fachlich-wichtigen Ereignisse verwalten oder auch nur Daten dafür aufbauen,
generell besser keinen Zustand verändern, maximal vielleicht fps-Zähler usw…

Images in Instanzattributen speichern, sie bei jedem Zeichnen neu zu laden kann arg verlangsamen


die getHitboxen()-Methode verstehe ich nicht, was planst du an dieser Stelle?
was ist arrayHitboxen, ein Array von nur wenigen Hitboxen (eindimensional?.., Liste geht auch)
oder das komplette 20x20-Array aller Felder?
was sind i und j, welche Werte sollten sie haben, wahrscheinlich gar nicht als Instanzattribute vorhanden, da nur Code kopiert?

wenn die Hitboxen in einem Array liegen dann gib auch das ganze Array zurück, Rückgabetyp auch Array (eindimensional?.., Liste geht auch) ,
aber natürlich auch vieles andere möglich…,
etwa die Position von außen übergeben und Rückgabe boolean ob was getroffen ist,
Durchlauf der Hitboxen hier in der Methode

Mit der getHitbox Methode möchte ich genau das machen, was Du geschrieben hast.
Ich wollte das gesamte Array zurückgeben.

Wie kann ich das machen?

Warum kann ich nicht einfach nur “return hitbox” machen?

warum nicht eine einzelner Hitbox?
diese Frage stellst du hoffentlich nicht

ein Array von Hitboxen, falls vorhanden, kannst du zurückgeben, return variablenName;, oder was genau hindert dich?,
evtl. Rückgabewert beachten, aber Probleme wohl zahlreich…

Eine Variable züruckgeben kann ich auch, das meinte ich nicht ist jetzt auch egal.

Das mit dem array zurückgeben funktioniert einfach nicht.

return arrayHitboxen… hier erwartet er etwas…;

Mit return arrayHitboxen**[j] gibt man doch kein ganzes array zurück??

Kannst du genau sagen was die Fehlermeldung ist?
und vom welchen typ ist arrayHitboxen?

Hier die Fehlermeldung:

“Sat May 14 15:54:21 CEST 2016 INFO:Slick Build #237
Sat May 14 15:54:22 CEST 2016 INFO:LWJGL Version: 2.9.2
Sat May 14 15:54:22 CEST 2016 INFO:OriginalDisplayMode: 1366 x 768 x 32 @60Hz
Sat May 14 15:54:22 CEST 2016 INFO:TargetDisplayMode: 500 x 500 x 0 @0Hz
Sat May 14 15:54:22 CEST 2016 INFO:Starting display 500x500
Sat May 14 15:54:22 CEST 2016 INFO:Use Java PNG Loader = true
WARNING: Found unknown Windows version: Windows 7
Attempting to use default windows plug-in.
Loading: net.java.games.input.DirectAndRawInputEnvironmentPlugin
Sat May 14 15:54:22 CEST 2016 INFO:Found 0 controllers
Sat May 14 15:54:22 CEST 2016 ERROR:20
java.lang.ArrayIndexOutOfBoundsException: 20
at map2.Editor.getarrayHitboxen(Editor.java:78)
at map2.Hauptfenster.update(Hauptfenster.java:79)
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:663)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
at map2.Hauptfenster.main(Hauptfenster.java:110)
Sat May 14 15:54:22 CEST 2016 ERROR:Game.update() failure - check the game code.
org.newdawn.slick.SlickException: Game.update() failure - check the game code.
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:669)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
at map2.Hauptfenster.main(Hauptfenster.java:110)”

Hier die Klasse wo die Hitboxen und die Map erstellt werden:

package map2;

import org.newdawn.slick.*;
import org.newdawn.slick.geom.Rectangle;
import org.newdawn.slick.geom.Shape;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Editor {
	
	private FileReader filereader;
	private BufferedReader bufferreader;
	private char array[][] = new char[20][20];
	Shape arrayHitboxen[][] = new Shape[20][20];
	Shape hitbox;
	int i, j;
	
	public Editor(){
	}
	
	public void load(String file) throws IOException{
		 
	     String temp;
	 
	     filereader = new FileReader(file);
	     bufferreader = new BufferedReader(filereader);
	 
	     for(int i=0; i<20; i++){
	 
	     temp = bufferreader.readLine();
	     char tempArray[] = temp.toCharArray();
	 
	       for(int j =0; j<20; j++){
	     
	         array**[j] = tempArray[j];
	       }
	     }
	   }
	 
	   public void render(Graphics g) throws SlickException {
		   
		  Image bild = new Image("Block.png");
		  		   
	     for(i=0; i<20; i++){
	       for(j=0; j<20; j++){
	     
	         if(array**[j] == 'h'){ //Himmel
	             g.setBackground(Color.pink);
	             g.fillRect(25*j, 25*i, 25, 25);
	             }
	         else if (array**[j] == 'g'){ //Gras
	             g.setColor(Color.green);
	             g.fillRect(25*j, 25*i, 25, 25);
	             }
	         else if (array**[j] == 'w'){ //Wasser
	             g.setColor(Color.blue);
	             g.fillRect(25*j, 25*i, 25, 25);
	             }
	         else if (array**[j] == 'e'){ //Erde
	             g.setColor(Color.red);
	             g.drawImage(bild, 25*j, 25*i);
	             hitbox = new Rectangle(25*j, 25*i, 25, 25);
	             g.draw(hitbox);
	             arrayHitboxen**[j] = hitbox;
	             }
	        	}
	           }
	   		  }
	   
	  public Shape getarrayHitboxen(){
		   
		  return arrayHitboxen**[j];
	   }
	}

Hier ist die Klasse die von “BasicGame” erbt und somit die update-Methode besitzt.
In der update-Methode steht dann folgendes um die Kollision zu ermitteln:

   if(spielerHitbox.intersects(editor.getarrayHitboxen())){
      System.out.println("Kollision erkannt!");
      }

Die spielerHitbox befindet sich in der “BasicGame” Klasse.

i und j sind von den Schleifen am Ende auf 20,
die Schleifen brechen da richtigerweise schon ab, aber in der getarrayHitboxen()-Methode greifst du nun mit Index 20 zu,
kann natürlich nur schiefgehen

es ist vollkommen ineffizient, auf so einem Level zu reden…,
was arrayHitboxen ist wurde schon lange gefragt, aber nie hast du für nötig befunden, dazu Sätze zu formulieren…,
nun zum Glück am Code zu erkennen,

ein zweites 20x20-Array also, an nur wenigen Stellen eine Hitbox abgelegt, ok, kann man so machen,
allzu schön aber nicht, besser nur EIN 20x20-Array insgesamt, darin aber höhere Objekte etwa einer Klasse Tile/ Feld/ Quadrat,
darin der char, die HitBox und was immer sonst noch in Zukunft hilfreich ist

separat für die Hitboxen wäre denkbar eine Liste zu verwenden, dann dort kein null drin, ca. 20 Einträge, leichter zu verarbeiten, aber kaum mehr Information, welches Ursprungsfeld gemeint ist


und was soll nun passieren? nur ein Element aus dem Hitboxen-Array zurückzugeben ist genauso wie am Anfang die Rückgabe nur einer Variablen (mal abgesehen davon dass wegen i/j im Moment noch neues Problem dazu)

wenn du spielerHitbox mit mehreren Hitboxen intersecten willst, dann brauchst du eine Schleife,
wie schon in der ersten Antwort geschrieben,
aber ist ja auch egal, du versteht nichts, du sprichst über nichts,
du schreibst nur irgendeinen Code und erklärst weder diesen Code noch deine Idee dazu, sondern allein ‘Problem, was nun?’…

entweder in der Klasse Editor die Schleife auf die Hitboxen dort,
oder die Hitboxen insgesamt (das 2D-Array oder eine andere gewählte Struktur) zurückgeben und woanders die Schleife

jeder Schleifendurchlauf wäre ein Vergleich der einen boolean liefert, diese boolean zusammenzufassen wieder eine Aufgabe für sich

  1. Setz dich mal mit der deutschen Rechtschreibung auseinander.
  2. Ich habe das Problem genau beschrieben, nur weil Du nicht in der Lage bist zu lesen kann ich auch nichts dafür.
  3. Ob man nun den Code besser schreiben könnte oder nicht, ist für mich zurzeit nicht relevant. Du diskutierst ewig herum anstatt mir eine schnelle und gute Hilfe zu bieten.
    Ich beschäftige mich damit erst seit vielleicht 1 Monat!
    Ich habe das Problem sehr deutlich erläutert, wenn Du es nicht verstehst, dann ist das halt so.

MfG

wer bisn du hier, der Auto vom Duden, oder nur ein Neuling mit 27 Beiträgen?

ich glaube sehr wohl das slater in der lage ist zu lesen.

das ganze hier nennt man forum. und was er tut ist nicht diskutieren, sondern konstruktive lösungsvorschläge und verbesserungsvorschläge bieten.
wenn du kurze knappe antworten willst geh zu stackoverflow und nicht in ein forum.

dann programmier erst einmal ein Notizbuch oder so, bevor du mit Spielen und Grafik Engines anfängst.

Deine Frage ist die Folgende:

nachdem wir 10 mal nachfragen, wird sichtbar dass da ne aio exception fliegt. (eigentlich auch schon vorher, hatte mir
persönlich den code aber nur kurz angeguckt).
Das Problem ist also erst einmal ein komplett anderes.
Wenn du das nicht verstehst, ist das nicht unser Problem.
Mal abgesehen davon dass dein Ansatz im Grunde genommen totaler Müll ist, und das ist nicht
der letzte Grund wieso Slater dir Vorschlug, wie man das, auch im Hinblick auf deine eigentliche
Frage, verbessern könnte.

@Javaman1991 : Vielleicht kurz erklären, was eine Hitbox im Zusammenhang mit Slick ist - mir leuchtet das nämlich überhaupt nicht ein, was eigentlich stand der Dinge ist und was nicht.

Aber kurz, knapp, allgemein lässt sich folgendes sagen:

Alle “Hitboxen” müssen in einem Array oder einer Liste liegen. Dann können “Hitboxen” (0,1),(0,2),…,(1,2),(1,3) bis (n-1,n) usw. miteinander auf Kollision “überprüft” werden. Das ist der übliche Weg.

DANKE CyborgBeta, genau solche Leute wie du es bist braucht das Forum hier.

Alle „Hitboxen“ müssen in einem Array oder einer Liste liegen. Dann können „Hitboxen“ (0,1),(0,2),…,(1,2),(1,3) bis (n-1,n) usw. miteinander auf Kollision „überprüft“ werden. Das ist der übliche Weg.

Genau das war meine erste Frage.

Meine zweite Frage war, wie ich auf das gesamte Array von einer anderen Klasse aus zugreifen kann?
Mit „arrayHitboxen**[j]“ bekomme ich immer einen Fehler.
Das abfragen einer einzigen Hitbox ohne Array funktioniert einwandfrei.

MfG

[OT]Jo, aber guck mal, ich weiß immer noch nicht, Hitboxen im Zusammenhang mit Slick. Will das ja auch wissen. Im Moment Glaskugel geschaut. …

Slater weiß schon, was er schreibt. Wahrscheinlich treffen zwei Welten aufeinander. 1 Monat Erfahrung gegen > 1 Jahr Erfahrung.

Das er nicht antwortet, immun gegen solche Kritik. mymax hat auch schon versucht, zu erklären / zu schlichten.

Normalerweise ist eine solche OTDiskussion nicht erlaubt. Es wird auch noch eine bestimmte Reaktion geben. [/OT]

Magst du kompletten Quelltext posten? Damit ggf. geholfen werden kann?

Um den Array zurückzugeben:

public Shape[][] getarrayHitboxen(){
    return arrayHitboxen;
}

Von einer anderen Stelle aus verwenden:

Shape[][] dieHitboxenAusDemEditor = dieEditorInstanz.getarrayHitboxen();
machWasMit(dieHitboxenAusDemEditor[3][4]);

LESEN: https://tty1.net/smart-questions_de.html

[OT]

da haben sich zwei gefunden…
[/OT]

[OT][QUOTE=mymaksimus][OT]

da haben sich zwei gefunden…
[/OT][/QUOTE]

Super, ihr habt auch den letzten User vergrault. Javaman schreibt jetzt auf JFO.

Was soll denn diese aufmüpfige, naive provozieren? Und was hab ich damit zu tun?

Jemanden ärgern bringt keinem was…

Wieder mal bin ich an Allem Schuld.[/OT]

Da nun jeder alles gesagt hat ist hier erstmal zu…