Я новичок в Java, в настоящее время изучаю GUI. Я создаю простую игру «Лабиринт». В настоящее время у меня есть макет лабиринта с использованием массива String, преобразованного в 2D-массив, и размещения изображения для стен и пространства с помощью «W» и «S» в массиве String.Java-перемещение BufferedImage на JFrame
Проблема, с которой я сейчас сталкиваюсь, - это мое изображение персонажа, перемещающееся с помощью ключей массива, я создал BufferedImage, нарисовал его в форме и у меня есть мой слушатель, и я просто не могу найти, где я ошибаюсь.
Это мой код;
public class Maze extends JFrame implements KeyListener {
private Container contain;
private JPanel pEast, pNorth, pSouth, pCenter, pWest;
private JButton btnStart, btnReset, btnExit;
private JLabel lblTitle, lblmazewall;
private JTextArea txtArea;
//private String s;
//private FileInputStream in;
//private int no;
//private char ch;
private ImageIcon mazewall;
private BufferedImage player;
private int xpos = 100, ypos = 100;
private String [] mazeLayout;
private String [][] mazeLayout2d;
Maze(){
loadImage();
mazeLayout = new String[10];
mazeLayout2d = new String[10][10];
contain = getContentPane();
pEast = new JPanel();
pNorth = new JPanel();
pSouth = new JPanel();
pCenter = new JPanel();
pWest = new JPanel();
//pCenter.setBackground(Color.BLUE);
pCenter.setLayout(new FlowLayout (FlowLayout.CENTER,0,0));
pWest.setLayout(new FlowLayout (FlowLayout.CENTER, 10, 10));
btnStart = new JButton("Start");
btnStart.setFont(new Font("Dialog", Font.BOLD, 18));
btnReset = new JButton("Reset");
btnReset.setFont(new Font("Dialog",Font.BOLD,18));
pEast.setLayout(new FlowLayout (FlowLayout.CENTER,10,10));
pEast.add(btnStart);
pEast.add(btnReset);
btnExit = new JButton("Exit");
btnExit.setFont(new Font("Dialog",Font.BOLD,18));
pSouth.setLayout(new FlowLayout (FlowLayout.CENTER, 20,10));
pSouth.add(btnExit);
lblTitle = new JLabel("Maze Game");
lblTitle.setFont(new Font("Dialog",Font.BOLD,24));
lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
pNorth.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 10));
pNorth.add(lblTitle);
txtArea = new JTextArea(20,70);
txtArea.setFont(new Font("dialog",Font.BOLD,16));
mazewall = new ImageIcon("mazewall.png");
// Read in from a text file, needed later
// try{
// in = new FileInputStream("maze.txt");
// while((no = in.read()) != -1){
// ch = (char)no;
// s+=ch;
// }
// txtArea.setText(s);
// }catch(FileNotFoundException ef){
// JOptionPane.showMessageDialog(null, "File not found - maze.txt");
// }catch(IOException e){
// JOptionPane.showMessageDialog(null, "Unable to read file maze.txt");
// }
contain.add(pEast, BorderLayout.EAST);
contain.add(pNorth, BorderLayout.NORTH);
contain.add(pSouth, BorderLayout.SOUTH);
contain.add(pCenter, BorderLayout.CENTER);
contain.add(pWest, BorderLayout.WEST);
//Array for maze
mazeLayout[0] = "WWWWWWWWWW";
mazeLayout[1] = "WSSSWWSWWW";
mazeLayout[2] = "WSWSWWSSSW";
mazeLayout[3] = "WSWSWWWWSW";
mazeLayout[4] = "WSWSWWWWSW";
mazeLayout[5] = "WSWSWSSSSW";
mazeLayout[6] = "WSWSWSWWWW";
mazeLayout[7] = "WSWSWSWWWW";
mazeLayout[8] = "WSWSSSWWWW";
mazeLayout[9] = "WWWWWWWWWW";
//Converting array into 2d array
for(int y = 0; y < 10; y++){
for(int x = 0; x < 10; x++){
mazeLayout2d[y][x] = mazeLayout[y].substring(x, x+1);
if (mazeLayout2d[y][x].equals("W")){
lblmazewall = new JLabel();
mazewall = new ImageIcon("mazewall.png");
lblmazewall.setIcon(mazewall);
pCenter.add(lblmazewall);
}
if (mazeLayout2d[y][x].equals("S")){
lblmazewall = new JLabel();
mazewall = new ImageIcon("mazefloor.png");
lblmazewall.setIcon(mazewall);
pCenter.add(lblmazewall);
}
}
}
}
public void loadImage(){
try{
String playerPath = "player.png";
player = ImageIO.read(new File(playerPath));
}catch(IOException ex){
ex.printStackTrace();
}
addKeyListener(this);
}
@Override
public void paint(Graphics g){
super.paint(g);
g.drawImage(player, xpos, ypos,50,80, this);
}
public void keyPressed(KeyEvent ke){
switch(ke.getKeyCode()){
case KeyEvent.VK_RIGHT:{
xpos+=3;
}
break;
case KeyEvent.VK_LEFT:{
xpos-=3;
}
break;
case KeyEvent.VK_DOWN:{
ypos+=3;
}
break;
case KeyEvent.VK_UP:{
ypos-=3;
}
break;
}
repaint();
}
public void keyTyped(KeyEvent ke){}
public void keyReleased(KeyEvent ke){}
}
Надеюсь, кто-то может сказать мне, где моя проблема, спасибо.
Что это такое? Вы видите игрока? Он вообще движется? Если вы добавите println в манипулятор клавиатуры, выполните ли нажатия клавиш? –
Я вижу изображение игрока в позиции xpos и ypos. Я добавил в System.out.println («RIGHT»); слева, вверх и вниз при нажатии клавиш и ничего не отображается – Sqoh