Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe gestern ewig lange versucht, bei meinem Level-Editor die Hitboxen mit den einzelnen Blocks mitzeichnen zu lassen.
Das war mein erster Gedanke:
Java:
else if (array[i][j] == 'e'){ //Boden zeichnen
hitbox = new Rectangle(25*j, 25*i, 25, 25);
g.drawImage(bild, 25*j, 25*i);
g.draw(hitbox);
}
Leider reagiert der Spieler nur auf genau zwei Blöcke ganz am Ende des Levels.
Die restlichen Blöcke reagieren nicht auf eine Kollision mit dem Spieler.
Aber warum zeichnet er nicht einfach für jeden Block eine eigene Hitbox?
Ich bin jetzt drauf gekommen, das er doch alle Hitboxen zeichnet.
Ich habe das nur nicht gesehen, da die Hitboxen in Grau gezeichnet werden und das Image ebenfalls Grau ist.
Das heißt, das funktioniert schon mal, es scheint an der Abfrage zu liegen.
Sorry, der Sourcecode von Beitrag #3 ist der Falsche!!
Java:
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];
private Shape hitbox;
private int i;
private int 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[i][j] = tempArray[j];
}
}
}
public void render(Graphics g) throws SlickException {
Image bild = new Image("Block.png");
int i;
int j =0;
for(i=0; i<20; i++){
for(j=0; j<20; j++){
if(array[i][j] == 'h'){ //Himmel
g.setBackground(Color.pink);
g.fillRect(25*j, 25*i, 25, 25);
}
else if (array[i][j] == 'g'){ //Gras
g.setColor(Color.green);
g.fillRect(25*j, 25*i, 25, 25);
}
else if (array[i][j] == 'w'){ //Wasser
g.setColor(Color.blue);
g.fillRect(25*j, 25*i, 25, 25);
}
else if (array[i][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);
}
}
}
}
public Shape getHitbox(){
return hitbox;
}
}
Damit ich jetzt das gesamte Array mit Hilfe einer Schleife aus der anderen Klasse aus mit "intersects" abfragen kann, muss ich auf das gesamte Array in der Editor-Klasse zugreifen können.
Auf das Array zugreifen kann man ja mit einer getter-Methode:
Java:
public Shape getarrayHitboxen(){
return arrayHitboxen[i][j];
}
}
Nur mit
Java:
return arrayHitboxen[i][j];
würde ich ja theoretisch nur auf das letzte Feld des Arrays zugreifen.
Leider wird aber beim Ausführen des Codes ein Fehler geworfen.
Meine Frage lautet, wie kann ich von der anderen Klasse aus auf das gesamte Array zugreifen??
Der Fehler lautet:
Sun May 15 17:51:46 CEST 2016 INFO:Slick Build #237
Sun May 15 17:51:46 CEST 2016 INFO:LWJGL Version: 2.9.2
Sun May 15 17:51:46 CEST 2016 INFO:OriginalDisplayMode: 1366 x 768 x 32 @60Hz
Sun May 15 17:51:46 CEST 2016 INFO:TargetDisplayMode: 500 x 500 x 0 @0Hz
Sun May 15 17:51:47 CEST 2016 INFO:Starting display 500x500
Sun May 15 17:51:48 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
Sun May 15 17:51:48 CEST 2016 INFO:Found 0 controllers
Sun May 15 17:51:48 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)
Sun May 15 17:51:48 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)
Danke vielmals für die Hilfe.
Genau das habe ich gesucht.
Leider funktioniert das ganze noch nicht so richtig.
Beim Code wird schon mal nichts rot unterstrichen, doch beim Ausführen des Programms wird das Fenster geöffnet und gleich wieder geschlossen.
Leider kann ich die Fehler beschreibung nicht ganz Entschlüsseln:
Mon May 16 19:00:07 CEST 2016 INFO:Slick Build #237
Mon May 16 19:00:07 CEST 2016 INFO:LWJGL Version: 2.9.2
Mon May 16 19:00:07 CEST 2016 INFO:OriginalDisplayMode: 1366 x 768 x 32 @60Hz
Mon May 16 19:00:07 CEST 2016 INFO:TargetDisplayMode: 500 x 500 x 0 @0Hz
Mon May 16 19:00:08 CEST 2016 INFO:Starting display 500x500
Mon May 16 19:00:08 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
Mon May 16 19:00:08 CEST 2016 INFO:Found 0 controllers
Mon May 16 19:00:08 CEST 2016 ERROR:null
java.lang.NullPointerException
at org.newdawn.slick.geom.Shape.intersects(Shape.java:493)
at org.newdawn.slick.geom.Rectangle.intersects(Rectangle.java:180)
at map2.Hauptfenster.update(Hauptfenster.java:82)
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:113)
Mon May 16 19:00:08 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:113)
Ich bin gestern am Abend noch draufgekommen was der Fehler ist.
Ich Idiot habe ja nur den unteren Teil des Array befüllt.
Aber der rest blieb Frei, daher sind die restlichen Felder ja Null.
Deshalb bekomme ich eine NullPointerException.