#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
классом, чтобы сделать ваше изображение размером с экран.