我需要一点帮助在java网格上实现玩家移动

时间:2014-03-31 15:50:20

标签: java user-interface

我需要一点java的帮助,我是语言的新手,因此我不知道如何实现这个。

我已经制作了一个基本的15; 40格JLabel Image,感谢这个网站,我需要帮助的是关于如何制作一个播放器(假设是一个图像,也显示在网格上)四处移动使用WASD(我不知道Ascii-approach是否适用于java)或箭头键。

这是我的网格代码

public class GUI {
    static Scanner cns = new Scanner(System.in);
    JFrame frame = new JFrame();
    ImageIcon ImageIcon = new ImageIcon("Grass.png");
    JLabel[][] grid;

    public GUI(int width, int length) {
        Container pane = frame.getContentPane();
        frame.setLayout(new GridLayout(width,length));
        grid = new JLabel[width][length];

        for(int y = 0; y < length; y++) {
            for(int x = 0; x < width; x++) {
                grid[x][y] = new JLabel();
                grid[x][y].setBorder(BorderFactory.createLineBorder(Color.black));
                grid[x][y].setBorder(BorderFactory.createEmptyBorder());   
            }
        }

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

        for(int y = 0; y < length; y++) {
            for(int x = 0; x < width; x++) {
                pane.add(grid[x][y]= new JLabel(new ImageIcon("Grass.png")));
                grid[x][y].setBorder(BorderFactory.createLineBorder(Color.black));
                grid[x][y].setBorder(BorderFactory.createEmptyBorder());
                frame.add(grid[x][y]);
           }
        }
    }

    public static void main(String[] args) {
        new GUI(15, 40);    
    }
}

1 个答案:

答案 0 :(得分:0)

这里有一些建议:

1 - 使GUI扩展JFrame并实现KeyListener。

您必须覆盖KeyListener方法(keyPressed,keyReleased和keyTyped),您应该从JFrame覆盖repaint()。

重绘方法应该在末尾调用super.repaint()来更新帧。

2 - 让GUI字段存储有关需要绘制的内容的数据。

您可能应该将网格或网格中的内容存储为字段。

3 - 构造函数应该初始化,而不是渲染。

渲染应该在repaint()中完成。构造函数应该执行以下操作:

    super();
    JPanel frame = new JPanel();
    add(frame);
    pack();
    addKeyListener(this);
    repaint();

这个答案有点未完成,但我会更多地了解它并更新它。特别是,JPanel是JFrame中的一个元素。


更新:这是一个小工作示例。使用WASD在屏幕上移动矩形。


这是JFrame。

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class MyJFrame extends JFrame implements KeyListener {

    private MyJPanel frame;

    public MyJFrame() {
        super();
        frame = new MyJPanel();
        add(frame);
        pack();
        addKeyListener(this);
        repaint();
    }

    public static void main(String[] args) {
        MyJFrame window = new MyJFrame();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
        window.setTitle("Test");
    }

    @Override
    public void repaint() {
        super.repaint();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        frame.keyPressed(e);
        repaint();
    }

    @Override
    public void keyTyped(KeyEvent e) { }

    @Override
    public void keyReleased(KeyEvent e) { }
}

这是JPanel。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;

public class MyJPanel extends JPanel {

    private int x = 0;
    private int y = 0;

    public MyJPanel() {
        setPreferredSize(new Dimension(200,200));
    }

    @Override
    public void update(Graphics g) {
        paint(g);
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.red);
        g.drawRect(x,y,20,20);
    }

    public void keyPressed(KeyEvent e) {
        int k = e.getKeyCode();

        switch (k) {
            case KeyEvent.VK_D:
                x++;
                break;
            case KeyEvent.VK_A:
                x--;
                break;
            case KeyEvent.VK_W:
                y--;
                break;
            case KeyEvent.VK_S:
                y++;
                break;
        }
    }
}
祝你好运!