Я пытаюсь сделать очень простую плиточную RPG.В первых тестах, плитки были в правильных местах, но когда я произвел рефакторинг программы и создал классы map и tile.map для хранения и отображения карт и плитки для хранения pos и img плиток и для обнаружения столкновений, это было неправильное размещениеизображения.
Структура класса включает в себя главный класс «Frame», который содержит карту, хранящуюся в строковом массиве, затем создает класс карты и помещает строковый массив, текстуры травы и воды, а также плитку «Высота и ширина» и графику.объект (init вызывается внутри метода рисования, так что я получу графический объект не нуль).
Карта представляет собой двумерный массив, составленный из классов листов, который основан на строковом массиве.Плитка получает графический объект и рисует на нем изображение.Теперь, когда я запускаю его, он кладет плитки в неправильном месте.
Ссылки на код:
- (основной класс) Рамка: pastebin.com / dephCtfg
- Карта: pastebin.com / hKitArsf
- Плитка: pastebin.com / aagDjEWp
Редактировать: Добавлен весь код:
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
public class UsersFrame extends JFrame {
// images
private Image imgs[] = new Image[2];
private int tileH = 25;
private int tileW = 25;
// map1
private Map map1;
String map1St[] = {
"0000000000000000000000000",
"0111111110011111111000000",
"0111111110011111111000000",
"0111111110011111111000000",
"0111000110011100011000000",
"0110000110011000011000000",
"0111001110011100111000000",
"0111101110011110111000000",
"0111111110011111111000000",
"0000000000000000000000000",
"0000000000000000000000000",
"0000000000000000000000000",
"0000000000000000000000000",
"0000000000000000000000000",
"0000000000000000000000000",
"0000000000000000000000000",
"0000000000000000000000000",
"0000000000000000000000000",
"0000000000000000000000000",
"0000000000000000000000000",
"0000000001000000000000000",
"0000000010000000000000000",
"0000000000000000000000000",
"0000000000000000000000000",
"0000000000000000000000000", };
public UsersFrame() {
loadPics();
}
public void paint(Graphics gg) {
map1 = new Map(map1St, tileW, tileH, imgs, gg);
map1.drawMap();
}
public static void main(String s[]) {
JFrame frame = new UsersFrame();
frame.setTitle("RPG");
// Add a window listner for close button
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
// This is an empty content area in the frame
JLabel jlbempty = new JLabel("");
jlbempty.setPreferredSize(new Dimension(600, 625));
frame.getContentPane().add(jlbempty, BorderLayout.CENTER);
frame.setResizable(false);
frame.pack();
frame.setVisible(true);
}
private void loadPics() {
Image grass = new ImageIcon("/Users/olek/RESOURCES/RPG/grass.jpg")
.getImage();
Image water = new ImageIcon("/Users/olek/RESOURCES/RPG/water.jpg")
.getImage();
imgs[0] = grass;
imgs[1] = water;
}
}
class Map {
// TODO: fix images not showing
// position
private int dx = 0;
private int dy = 0;
// position on the frame
private int tx = 0;
private int ty = 0;
private int tileH;
private int tileW;
private int mapW = 25;
private int mapH = 25;
private Image imgs[] = { null, null };
private Graphics g;
Tile map[][] = new Tile[mapW][mapH];
String mapSt[];
private boolean doneDrawing = false;
public Map(String mapSt[], int tileW, int tileH, Image imgs[], Graphics g) {
this.mapSt = mapSt;
this.tileW = tileW;
this.tileH = tileH;
dx = 0;
dy = 0;
tx = 0;
ty = 0;
this.imgs = imgs;
doneDrawing = false;
this.g = g;
System.out.print(g.toString());
}
public void drawMap() {
if (g == null) {
System.out.print("g is null");
return;
}
char currTile = mapSt[dy].charAt(dx);
System.out.print(currTile + "\n");
if (currTile == '0') {
System.out.print("drawing water at " + tx + " , " + ty + "\n");
map[dx][dy] = new Tile(imgs[1], tileW, tileH, tx, ty, true, false, g);
}
if (currTile == '1') {
System.out.print("drawing grass at " + tx + " , " + ty + "\n");
map[dx][dy] = new Tile(imgs[0], tileH, tileH, tx, ty, false, false, g);
}
calcPlacePos();
if (!doneDrawing) {
drawMap();
}
}
private void calcPlacePos() {
if (dx != (mapW - 1)) {
// System.out.print(dx+" != ("+mapW+"-1)\n");
dx++;
}
// System.out.print(dx+" == ("+mapW+"-1) && "+dy+" != ("+mapH+"-1)\n");
if (dx == (mapW - 1) && dy != (mapH - 1)) {
dx = 0;
dy++;
}
if (dx == (mapW - 1) && dy == (mapH - 1)) {
doneDrawing = true;
System.out.print("done");
}
tx = dx * tileW;
ty = dy * tileH;
}
}
class Tile {
private Image img;
private int tileH;
private int tileW;
private int posX;
private int posY;
private boolean isWall;
private boolean front;
private Graphics gr;
public Tile(Image i, int w, int h, int pX, int pY, boolean wall,
boolean inFront, Graphics g) {
img = i;
tileH = h;
tileW = w;
posX = pX;
posY = pY;
isWall = wall;
front = inFront;
gr = g;
drawTile();
}
public boolean isWall() {
return isWall;
}
public boolean isInFront() {
return front;
}
public Image getImage() {
return img;
}
public void setImage(Image i) {
if (i != null) {
img = i;
} else {
System.out.print("Could not assign image to Tile object becouse \n" +
" gotten image is null");
}
}
private void drawTile() {
Graphics2D g2d = (Graphics2D) gr;
g2d.translate(0, 22);
g2d.drawImage(img, posX, posX, null);
System.out.print(posX + " , " + posY);
}
public Dimension getDimension() {
return new Dimension(tileW, tileH);
}
}