# Hitbox mit Level-Editor mitzeichnen



## Javaman91 (11. Mai 2016)

Hallo,

ich habe gestern ewig lange versucht, bei meinem Level-Editor die Hitboxen mit den einzelnen Blocks mitzeichnen zu lassen.

Das war mein erster Gedanke:


```
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?


----------



## dayaftereh (11. Mai 2016)

Incrementist du i und j ?


----------



## Javaman91 (11. Mai 2016)

Ja mache ich:


```
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.gray);
    //g.fillRect(25*j, 25*i, 25, 25);
    g.drawImage(bild, 25*j, 25*i);
    }
   }
  }
 }
```

MfG


----------



## Javaman91 (12. Mai 2016)

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!!


```
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;
    }
   }
```

In der anderen Klasse frage ich dann mit:


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

die Kollision ab.
Wie gesagt reagiert er aber nur auf die letzten zwei Hitboxen am Ende der Map.


----------



## Javaman91 (12. Mai 2016)

Ich bitte euch um Hilfe, da ich nicht weiß wie ich die ganzen Hitboxen abfragen kann??


----------



## Javaman91 (15. Mai 2016)

Mittlerweile weiß ich das ich ein Array für meine Hitboxen brauche.

Der Sourcecode sieht zurzeit so aus:

```
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[i][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[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.blue);
    g.drawImage(bild, 25*j, 25*i);
    hitbox = new Rectangle(25*j, 25*i, 25, 25);
    g.draw(hitbox);
    arrayHitboxen[i][j] = hitbox;
    }
   }
  }
}

    public Shape getarrayHitboxen(){

      return arrayHitboxen[i][j];
    }
   }
```

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:

```
public Shape getarrayHitboxen(){

      return arrayHitboxen[i][j];
    }
   }
```


Nur mit

```
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
> ...


----------



## lant (16. Mai 2016)

Du könntest dir zwei Zahlen übergeben lassen, welchen dann die Stelle im Array repräsentieren.
So könntest du dann auf jedes der Boxen zugreifen.


```
public Shape getarrayHitboxen(int i, int j){
      return arrayHitboxen[i][j];
}
```

Andernfalls könntest du auch das ganze Array zurückgeben und in der anderen Klasse verarbeiten.


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


----------



## Javaman91 (16. Mai 2016)

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.

Hier mein Code:


```
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[i][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[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.blue);
    g.drawImage(bild, 25*j, 25*i);
    hitbox = new Rectangle(25*j, 25*i, 25, 25);
    g.draw(hitbox);
    arrayHitboxen[i][j] = hitbox;
    }
   }
  }
 }
     
    public Shape[][] getarrayHitboxen(){
       
      return arrayHitboxen;
    }
   }
```

Hier die Abfrage in der update-Methode:


```
@Override
   public void update(GameContainer gc, int arg1) throws SlickException {
     
     if(in.isKeyDown(in.KEY_W)){
       ypos -= 1;
       animieren = 1;
     }
     else if(in.isKeyDown(in.KEY_S)){
       ypos += 1;
       animieren = 1;
     }
     
     else if(in.isKeyDown(in.KEY_D)){
       xpos += 1;
       animieren = 1;
     }
     
     else if(in.isKeyDown(in.KEY_A)){
       xpos -= 1;
       animieren = 1;
     }
     else
       animieren = 0;
     
     for(int i=0; i<editor.getarrayHitboxen().length; i++){
       for(int j=0; j<editor.getarrayHitboxen().length; j++){
     
         if(spielerHitbox.intersects(editor.getarrayHitboxen()[i][j])){
             System.out.println("Kollision erkannt!");
         }   
       }
     }
   }
```

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)


----------



## Cromewell (17. Mai 2016)

_at map2.Hauptfenster.update(Hauptfenster.java:82)
at map2.Hauptfenster.main(Hauptfenster.java:113)
_
Was hast du denn da stehen ?


----------



## Javaman91 (17. Mai 2016)

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.

MfG


----------

