Aloha, ich komme nun langsam aber sicher an den Punkt an welchem ich eine Kollisionsabfrage implementieren möchte,
Erstmal zum aktuellen stand,
um mich näher mit dem Zeichnen unter Swing und Spiellogik / loops auseinanderzusetzen habe ich das Projekt so einfach wie möglich gehalten.
Hier noch ein kleiner Überblick, ich bin mir auch noch nicht ganz sicher ob der ansatz so vollkommen richtig ist.
zzt. besteht das Projekt aus folgenden relevanten Klassen
Tile
TileMap
Field
Player
Hud
die Map welche dargestellt wird parse ich in der Klasse TilePmap aus einer solchen Datei
das sieht dann folgendermaßen aus:
Wie man hier auch schön erkennen kann bewegt sich der Player noch unabhängig von der Map auf welcher er gezeichnet wird ( Ignoriert einfach den falschen Satzbau auf der Grafik , keine Ahnung was mich da geritten hat ^^ )
Ich übergebe dem Player im Konstruktor die map auf welcher er sich bewegen soll, so habe ich die abfrage der Position zzt. implementiert.
nun war mein Ansatz, mal abgesehen davon das ich mich noch darum kümmern muss das die Aktuelle Position auf der Map hochgezählt wird, das ich der hier auskommentierten Methode checkCollision() bei jedem Update die aktuelle Position des Players übergebe, und dort anhand der Bounds des Players, der hier ja zzt. nur ein Rechteck ist, und der einzelnen Tiles ( hierzu komme ich gleich noch) geprüft wird ob der Typ des Tiles entweder NORMAL oder BLOCKED ist und ob sich ggf. die kooridinaten überschneiden und dementsprechend dann die Position ggf. zurücksetzen.
Hier ist aber auch schon der jetzige Knackpunkt, ich habe die Klasse Tile zzt. folgendermaßen umgesetzt
und Frage mich jetzt ob es nicht dafür ggf. schlauer wäre hier ein BufferedImage zu halten, welche die einzelnen Tiles repräsentiert.
im Moment setze ich die TileMap so um das nur anhand des Typs der Tiles welche sich in einem 2Dim - Tile Array befinden unterschiedliche Farben für die Rechtecke gezeichnet werden, die Größe der einzelnen Tiles wird hier über die Frame bzw. Imagegröße errechnet auf dem dann beim rendern gezeichnet wird.
Hier nochmal die Klasse TileMap
Wäre super wenn mal jemand drüber schauen würde und mir sagt ob es so Sinn macht, oder ob es einen Sinnvolleren Weg gibt / der oben erwähnte Ansatz Sinn macht.
:rtfm:
Erstmal zum aktuellen stand,
um mich näher mit dem Zeichnen unter Swing und Spiellogik / loops auseinanderzusetzen habe ich das Projekt so einfach wie möglich gehalten.
Hier noch ein kleiner Überblick, ich bin mir auch noch nicht ganz sicher ob der ansatz so vollkommen richtig ist.
zzt. besteht das Projekt aus folgenden relevanten Klassen
Tile
TileMap
Field
Player
Hud
die Map welche dargestellt wird parse ich in der Klasse TilePmap aus einer solchen Datei
Code:
20
20
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
das sieht dann folgendermaßen aus:
Wie man hier auch schön erkennen kann bewegt sich der Player noch unabhängig von der Map auf welcher er gezeichnet wird ( Ignoriert einfach den falschen Satzbau auf der Grafik , keine Ahnung was mich da geritten hat ^^ )
Ich übergebe dem Player im Konstruktor die map auf welcher er sich bewegen soll, so habe ich die abfrage der Position zzt. implementiert.
Java:
public void update(){
if (left) {
nextX -= moveSpeed;
if (nextX < 0) {
nextX = 0;
}
}
else if (right){
nextX += moveSpeed;
if (nextX > map.width - width) {
nextX = map.width - width;
}
}
if (jumping) {
nextY = jumpStart;
jumping = false;
falling = true;
}
if (falling) {
nextY += gravity;
if (nextY > 0) {
nextY = 0;
falling = false;
}
}
// check collision
//checkCollision((int)nextX, (int)nextY);
}
nun war mein Ansatz, mal abgesehen davon das ich mich noch darum kümmern muss das die Aktuelle Position auf der Map hochgezählt wird, das ich der hier auskommentierten Methode checkCollision() bei jedem Update die aktuelle Position des Players übergebe, und dort anhand der Bounds des Players, der hier ja zzt. nur ein Rechteck ist, und der einzelnen Tiles ( hierzu komme ich gleich noch) geprüft wird ob der Typ des Tiles entweder NORMAL oder BLOCKED ist und ob sich ggf. die kooridinaten überschneiden und dementsprechend dann die Position ggf. zurücksetzen.
Hier ist aber auch schon der jetzige Knackpunkt, ich habe die Klasse Tile zzt. folgendermaßen umgesetzt
Java:
public class Tile {
final static int NORMAL = 0;
final static int BLOCKED = 0;
private int type;
public Tile(int type) {
this.type = type;
}
public int getType() {return this.type;}
}
und Frage mich jetzt ob es nicht dafür ggf. schlauer wäre hier ein BufferedImage zu halten, welche die einzelnen Tiles repräsentiert.
im Moment setze ich die TileMap so um das nur anhand des Typs der Tiles welche sich in einem 2Dim - Tile Array befinden unterschiedliche Farben für die Rechtecke gezeichnet werden, die Größe der einzelnen Tiles wird hier über die Frame bzw. Imagegröße errechnet auf dem dann beim rendern gezeichnet wird.
Hier nochmal die Klasse TileMap
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class TileMap {
Tile[][] tileMap;
int xPosition;
int yPosition;
int width;
int height;
int numRows;
int numCols;
int tilesAcross;
int tileSize;
public TileMap() {}
public void loadMap(String path){
InputStreamReader in;
BufferedReader reader;
try {
in = new InputStreamReader(getClass().getResourceAsStream(path));
reader = new BufferedReader(in);
numRows = Integer.parseInt(reader.readLine());
numCols = Integer.parseInt(reader.readLine());
tileSize = Field.WIDTH / numRows;
tilesAcross = numRows;
width = numRows * tileSize;
height = numCols * tileSize;
tileMap = new Tile[numRows][numCols];
for (int row = 0; row < numRows; row++) {
String line = reader.readLine();
String delimiter = "\\s+";
for (int col = 0; col < numCols; col++) {
String[] tokens = line.split(delimiter);
tileMap[row][col] = new Tile(Integer.parseInt(tokens[col]));
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void update() {}
public void draw(Graphics g){
for (int row = 0; row < numRows; row++) {
for (int col = 0; col < numCols; col++) {
if (tileMap[row][col].getType() == Tile.NORMAL) {
g.setColor(Color.WHITE);
}
else{
g.setColor(Color.BLACK);
}
g.fillRect(col * tileSize, row * tileSize, tileSize, tileSize);
}
}
}
public int getX() {return this.xPosition;}
public int getY() {return this.yPosition;}
}
Wäre super wenn mal jemand drüber schauen würde und mir sagt ob es so Sinn macht, oder ob es einen Sinnvolleren Weg gibt / der oben erwähnte Ansatz Sinn macht.
:rtfm:
Zuletzt bearbeitet: