Tilemap в BueJ не отображается должным образом

#java #bluej

Вопрос:

Вопрос: Когда я запускаю игровой класс, я получаю: https://i.stack.imgur.com/MEAOH.png и у меня должны быть черные ящики справа и внизу. Когда я изменяю размер плитки, они отображаются правильно (отображаются все плитки), но тогда моя игра действительно маленькая. Есть ли какое-то решение?

Класс, создающий экран

 import javax.swing.JFrame; public class Game {  public static void main(String[] args){  JFrame frame = new JFrame ("Platformer");  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  frame.setContentPane(new GamePanel());  frame.pack();  frame.setLocation(10,10);  frame.setSize(1024,864);  frame.setVisible(true);  } }   

Класс для карты плиток

 import java.io.*; import java.awt.*; public class TileMap {  private int x;  private int y;   private int tileSize;  private int [][] map;  private int mapWidth;  private int mapHeight;    /**  * Constructor for objects of class TileMap  */  public TileMap(String s, int tileSize)  {  this.tileSize = tileSize;  try{  BufferedReader br = new BufferedReader(new FileReader ("testmap.txt"));  mapWidth = Integer.parseInt(br.readLine());  mapHeight = Integer.parseInt(br.readLine());  map = new int[mapHeight][mapWidth];    String delimiters ="";  for( int row= 0; row lt; mapHeight; row  ) {  String line = br.readLine();  String[] tokens = line.split(delimiters);  for(int col = 0; col lt; mapWidth; col  ){  map[row][col] = Integer.parseInt(tokens[col]);  }  }  }  catch(Exception e) {}  }    public void update(){  }    public void draw(Graphics2D g){  for(int row = 0; row lt; mapHeight; row  ){  for(int col = 0; col lt; mapWidth; col  ) {  int rc = map[row][col];  if(rc==0){  g.setColor(Color.BLACK);  }  if(rc==1){  g.setColor(Color.WHITE);  }  g.fillRect(x   col * tileSize, y   row * tileSize, tileSize, tileSize);  }  }  } }   

класс для игровой панели

 import javax.swing.JPanel; import java.awt.*; import java.awt.image.*; import java.awt.event.*; public class GamePanel extends JPanel implements Runnable {  public static final int WIDTH = 400;  public static final int HEIGHT = 400;    private Thread thread;   private boolean running;    private BufferedImage image;  private Graphics2D g;    private int FPS = 30;  private int targetTime =1000 / FPS;    private TileMap tileMap;    public GamePanel(){  super();  setPreferredSize(new Dimension(WIDTH, HEIGHT));  setFocusable(true);  requestFocus();  }    public void addNotify(){  super.addNotify();  if(thread == null){  thread = new Thread(this);  thread.start();  }  }    public void run() {  init();  long startTime;  long urdTime;  long waitTime;    while(running){  startTime = System.nanoTime();    update();  render();  draw();    urdTime = (System.nanoTime() - startTime) / 1000000;  waitTime = targetTime - urdTime;    try {  Thread.sleep(waitTime);  }  catch(Exception e)  {  }  }  }    private void init(){  running = true;  image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);  g = (Graphics2D) image.getGraphics();    tileMap = new TileMap("testmap.txt",32);  }  /////////////////////////////////////////////////////////////////////////////  private void update (){  tileMap.update();  }    private void render(){  tileMap.draw(g);  }    private void draw(){  Graphics g2 = getGraphics();  g2.drawImage(image,0,0,null);  g2.dispose();  } }   

Текстовый файл карты плиток

 20 15 00000000000000000000 01111111111111111110 01111111111111111110 00000111000011111110 01111111111111111110 01111000011111111110 01111111111111111110 01111110111111111110 01111110111111111110 00100000001111111110 01111111111111111110 01011111111111111110 01101111111111111110 01111111111111111110 00000000000000000000  

Комментарии:

1. Не очень практично звонить pack() и setSize . Пакет попытается установить правильный размер, чтобы содержать все элементы. С чем ты это делаешь addNotify ? Вы пробовали изменить «public static final int WIDTH = 400;» ?

Ответ №1:

Твой BufferedImage слишком мал! В GamePanel.init() вы используете значения WIDTH и HEIGHT , это 400 и 400.

Одним из решений было бы поделиться размером вашего JFrame с вашим GamePanel классом, чтобы сделать ваше изображение размером с экран.