Hitbox mit Level-Editor mitzeichnen

Javaman91

Bekanntes Mitglied
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:

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?
 

Javaman91

Bekanntes Mitglied
Ja mache ich:

Java:
 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

Bekanntes Mitglied
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;
    }
   }

In der anderen Klasse frage ich dann mit:

Java:
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

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

Der Sourcecode sieht zurzeit so aus:
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];
   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:
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)
 
Zuletzt bearbeitet:

lant

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

Java:
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.

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

Javaman91

Bekanntes Mitglied
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:

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];
   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:

Java:
@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

Top Contributor
at map2.Hauptfenster.update(Hauptfenster.java:82)
at map2.Hauptfenster.main(Hauptfenster.java:113)

Was hast du denn da stehen ?
 

Javaman91

Bekanntes Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Schräge Hitbox Spiele- und Multimedia-Programmierung 3
L wo sehe ich die Range und die Hitbox im Minecraft Sourcecode? Spiele- und Multimedia-Programmierung 2
H Versetzung der "Hitbox" Spiele- und Multimedia-Programmierung 1
R Hitbox Fix Spiele- und Multimedia-Programmierung 3
R Rectangle Runde Hitbox Spiele- und Multimedia-Programmierung 29
S 2D Sprite Level Editor Konzeptfrage Spiele- und Multimedia-Programmierung 17
N Level abspeichern/erstellen Spiele- und Multimedia-Programmierung 7
M Spielkapitel/-Level erstellen/verwalten Spiele- und Multimedia-Programmierung 6
M Level-Editor Spiele- und Multimedia-Programmierung 13
R 2D Spiel - Level einlesen - Problem mit paint Spiele- und Multimedia-Programmierung 5
Gamer_DLC Map Editor Spiele- und Multimedia-Programmierung 2
L Spiel im Editor testen Spiele- und Multimedia-Programmierung 4
B Fragen zu "Physics-Body-Editor"? Spiele- und Multimedia-Programmierung 0
N Musik-Editor Spiele- und Multimedia-Programmierung 15
J Perfomance Probleme beim eigenen Editor Spiele- und Multimedia-Programmierung 1
R Java Media Framework im Java Editor Spiele- und Multimedia-Programmierung 6
Steev Performancetest: ISO-Editor Spiele- und Multimedia-Programmierung 52
J Suche Java Spiele Editor! Spiele- und Multimedia-Programmierung 2
T Java3D: 3D Model Editor Spiele- und Multimedia-Programmierung 4
S 3d editor gesucht der 3ds files erstellen kann. Spiele- und Multimedia-Programmierung 4

Ähnliche Java Themen


Oben