JAVA - Tile map

0

Witam. Piszę klase MapSingle1 to prostej gry 2D.Potrzebuję pomocy przy "rysowaniu" danego obrazka w danym kafelku.
Tutaj kod:

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.Image;

public class Map {
	private static final int CLEAR = 0;
	private static final int BLOCKED = 1;
	private static final int GRASS = 2;
	private static final int WATER = 2;
	private static final int SAND = 2;
	private static final int GRASAN = 2;
	private static final int WATSAN = 2;
	private static final int WIDTH = 1000;
	private static final int HEIGHT = 1000;
	public static final int TILE_SIZE = 32;
	private int[][] data = new int[WIDTH][HEIGHT];
	public Map() {
				for (int y=0;y<HEIGHT;y++) {
			data[0][y] = BLOCKED;
		}
		for (int x=0;x<WIDTH;x++) {
			if ((x > 0) && (x < WIDTH-1)) {
				data[x][10] = CLEAR;
			}
			if (x > 2) {
				data[x][9] = BLOCKED;
			}
			data[x][0] = BLOCKED;
			data[x][HEIGHT-1] = BLOCKED;
		}
		data[4][9] = GRASS;
	}
	public void paint(Graphics2D g) {
		for (int x=0;x<WIDTH;x++) {
			for (int y=0;y<HEIGHT;y++) {
				if (data[x][y] == GRASS) {
					Image grass = Toolkit.getDefaultToolkit().getImage("grass.png");
			     	g.drawImage(grass, 0, 0, null); // <<<<<========   	
				}
				g.fillRect(x*TILE_SIZE,y*TILE_SIZE,TILE_SIZE,TILE_SIZE);
				g.drawRect(x*TILE_SIZE,y*TILE_SIZE,TILE_SIZE,TILE_SIZE);
			}
		}
	}
	public boolean blocked(float x, float y) {
		return data[(int) x][(int) y] == BLOCKED;
	}
}

A więc, jeśli np. data[4][9] = jest równa GRASS chcę aby został narysowany obrazek grass.png w punkcie 0,0 konkretnego kafelka! (a nie w punkcie 0, 0 ogólnym)

if (data[x][y] == GRASS) {
					Image grass = Toolkit.getDefaultToolkit().getImage("grass.png");
			     	g.drawImage(grass, 0, 0, null); // <<<<<========   

Powyżej w zaznaczonym wierszu ma być rysowanie, lecz jak już wspomniałem nie wiem jak wskazać punkt 0,0 kafelka oraz jaki obiekt ma rysować kafelek.

Pozdrawiam i liczę na pomoc
Skatty

0

Pierwszy podstawowy błąd: wczytywanie obrazka przed każdym narysowaniem. Wiesz jak HDD cierpi?

Wczytaj najpierw wszystkie obrazki do tablicy, tym bardziej że wszystkie przypadki masz w intach rozłożone (oczywiście każdemu przydziel inną wartość, bo teraz kilka ma 2)

Image tils[]={
Toolkit.getDefaultToolkit().getImage("clear.png"),
Toolkit.getDefaultToolkit().getImage("blocked.png"),
Toolkit.getDefaultToolkit().getImage("grass.png"),
Toolkit.getDefaultToolkit().getImage("water.png")
};

Nie wiem tylko czy Toolkit może być tak użyty poza metodami niestatycznymi, jak nie, to inaczej to wczytaj.

Potem przy rysowaniu dla danego x'a i y'ka:

g.drawImage(tils[data[x][y]], x*TILE_SIZE, y*TILE_SIZE, null);

Dla bezpieczeństwa możesz sprawdzić, czy data[x][y] nie jest <0, lub większy od ilości załadowanych obrazków.

Do przesuwania możesz też używać Graphics2D (rzutujesz Graphics do Graphics2D): masz tam metodę translate, która może się przydać.

0

Ok, ale w linijce :

g.drawImage(tils[data[x][y]], x*TILE_SIZE, y*TILE_SIZE, null);

Nie ma uwzględnionego obrazka, gdzie mam go wrzucić?

0

Jak to nie, pierwszy argument to obrazek (tils jest tablicą Image, gdzie jedna komórka = jeden obrazek, a indeks komórki to typ pola), drugi i trzeci to współrzędne, a czwarty niepotrzebny.

0

Przy testowaniu wszystko jest ok oprócz rysunków. Nie ma ani 1 tilesa narysowanego. Images są tablicą ale wywołanie tils[data[x][y]] nie wskazuje konkretnej komórki. jeśli np. data[2][3] = GRASS to g nie wie jaki obrazek narysować

0
Skatty napisał(a)

Przy testowaniu wszystko jest ok oprócz rysunków. Nie ma ani 1 tilesa narysowanego. Images są tablicą ale wywołanie tils[data[x][y]] nie wskazuje konkretnej komórki. jeśli np. data[2][3] = GRASS to g nie wie jaki obrazek narysować

Co rozumiesz przez "nie wskazuje konkretnej komórki"?? Przecież odwołujesz się do komórki data[x][y]. Jeżeli do tablicy tils załadujesz po kolei odpowiednio tekstury i będziesz miał tak samo ponumerowane typy, to musi działać.

Daj kod jeszcze raz z deklaracji tych intów jakie masz po poprawieniu (mam nadzieję że poprawiłeś), ładowania obrazków i pętli rysującej

0
package Gra;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.Image;


public class Map {
	
	private static final int CLEAR = 10;
	private static final int BLOCKED = 0;
	private static final int GRASS = 2;
	private static final int WATER = 1;
	private static final int SAND = 3;
	private static final int GRASAN = 4;
	private static final int WATSAN = 5;
	private static final int WIDTH = 1000;
	private static final int HEIGHT = 1000;
	public static final int TILE_SIZE = 32;
	private int[][] data = new int[WIDTH][HEIGHT];
Image tils[]={
Toolkit.getDefaultToolkit().getImage("GFX/Tiles/water.png"),
Toolkit.getDefaultToolkit().getImage("grass.png"),
Toolkit.getDefaultToolkit().getImage("GFX/Tiles/sand.png"),
Toolkit.getDefaultToolkit().getImage("GFX/Tiles/grasan.png")
};
public Map() {
				for (int y=0;y<HEIGHT;y++) {
			data[0][y] = BLOCKED;
		}
		for (int x=0;x<WIDTH;x++) {
			if ((x > 0) && (x < WIDTH-1)) {
				data[x][10] = CLEAR;
			}
			
			if (x > 2) {
				data[x][9] = BLOCKED;
			}
			data[x][0] = BLOCKED;
			data[x][HEIGHT-1] = BLOCKED;
		}
				data[3][9] = 2;
				data[2][9] = 2;
				data[6][9] = 2;
				data[4][9] = 2;
				data[3][7] = 2;
	}
	public void paint(Graphics2D g) {

		for (int x=0;x<WIDTH;x++) {
			for (int y=0;y<HEIGHT;y++) {
				if (data[x][y] == 2) {

			     g.drawImage(tils[data[x][y]], x*TILE_SIZE, y*TILE_SIZE, null);
		     
				}
				
				g.fillRect(x*TILE_SIZE,y*TILE_SIZE,TILE_SIZE,TILE_SIZE);
				g.drawRect(x*TILE_SIZE,y*TILE_SIZE,TILE_SIZE,TILE_SIZE);
			}
		}
	}
	

	public boolean blocked(float x, float y) {
		return data[(int) x][(int) y] == BLOCKED;
	}
}
0

a po co sprawdzasz warunek if (data[x][y] == 2) {, skoro niezależnie od jego wartości (zakładając że się mieści w zakresie, przed czym możesz właśnie tak zabezpieczyć) i tak ma rysować? Wywal ten warunek albo zamień go żeby sprawdzał czy wartość jest <0; 5> lub 10.

No i po narysowaniu jeszcze zamalowujesz to co narysowałeś czarnym prostokątem... Wywal te 2 linijki, albo je wstaw przed rysowanie obrazka.

0

Nie wiem co jest grane;/ Dodałem sprawdzanie (> 0 lub mniejsze od <6 ) usunałem te 2 linijki rysowania protokąta, a ekran dalej czarny (tilesy nie są rysowane)

0

powinno być raczej &&, a nie ||, ale mniejsza z tym

A ładuje obrazki poprawnie? Wypisz gdzieś tils[0].getWidth(null);
no i zamieść kod po przeróbkach

0

package Gra;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.Image;

public class Map {

private static final int CLEAR = 6;
private static final int BLOCKED = 0;
private static final int GRASS = 1;
private static final int WATER = 2;
private static final int SAND = 3;
private static final int GRASAN = 4;
private static final int WATSAN = 5;
private static final int WIDTH = 1000;
private static final int HEIGHT = 1000;
public static final int TILE_SIZE = 32;
private int[][] data = new int[WIDTH][HEIGHT];

Image tils[]={
Toolkit.getDefaultToolkit().getImage("grass.png"),
Toolkit.getDefaultToolkit().getImage("GFX/Tiles/water.png"),
Toolkit.getDefaultToolkit().getImage("GFX/Tiles/sand.png"),
Toolkit.getDefaultToolkit().getImage("GFX/Tiles/grasan.png")
};
public Map() {
for (int y=0;y<HEIGHT;y++) {
data[0][y] = 1;
}
for (int x=0;x<WIDTH;x++) {
if ((x > 0) && (x < WIDTH-1)) {
data[x][10] = 2;
}

		}
			data[3][9] = 1;
			data[2][9] = 1;
			data[6][9] = 1;
			data[4][9] = 1;
			data[3][7] = 1;
}
public void paint(Graphics2D g) {

	for (int x=0;x<WIDTH;x++) {
		for (int y=0;y<HEIGHT;y++) {
		 if ((data[x][y] >0) && (data[x][y] <6)) {
		     g.drawImage(tils[data[x][y]], x*TILE_SIZE, y*TILE_SIZE, null);
				}
	}
}
}
public boolean blocked(float x, float y) {
	return data[(int) x][(int) y] == 0;
}

}

Nie wiem gdzie dodac tils[0 ] bo bledy mam.

Zastanawiałem się nad czymś takim:'

Image[] tils = new Image[5]
Image[1] = Toolkit.getDefaultToolkit().getImage("grass.png"),
Image[2] .....

1 użytkowników online, w tym zalogowanych: 0, gości: 1