java - 将添加到网格的对象沿(用户)指定的方向移动到指定数量的网格单元上

标签 java user-interface

对于Java中的游戏,我想将玩家对象向指定方向移动指定距离。虽然 - 使用 Java Random API - 在棋盘上随机移动玩家效果很好,但不幸的是我找不到任何合适的方法来将玩家在 X 和 Y 方向上移动指定的距离。在下面的代码中是我尝试过的一些代码(作为注释,带有//),但它们都没有接近工作。 封装高;

有有效的解决方案吗?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class mov {
int distance=50; 
    private MoveModel MoveModel;
    private Showvisible showvisible;
    public mov() {

        MoveModel = new MoveModel();
        showvisible = new Showvisible(MoveModel);
        showvisible.getButton().addActionListener(e-> movePlayer());
        //showvisible.getButton3(à.addActionListener(e))
    }

    //move player to a random position (works fine) 
    private void movePlayer() {
        final Random rnd = new Random();
        MoveModel.setPlayerX(rnd.nextInt(100));
        MoveModel.setPlayerY(rnd.nextInt(100));
        showvisible.refresh();
    }

    //Move player in the x direction to the East  (doesn't work) 
   private void movePlayer2(int distance) {
       MoveModel.setPlayerX(+50);
    //  MoveModel.setPlayerY(distance++);
       //MoveModel.setPlayerX(distance); 
       //MoveModel.setPlayerX(playerX+distance);    //Many variations tried, none of them works 

        showvisible.refresh(); 
    }


    public static void main(String[] args) {
        new mov();
    }
}

class Showvisible {

    private final static int GAP = 2;
    MoveModel MoveModel;
    private MainPanel mainPanel;

    Showvisible(MoveModel MoveModel){
        this.MoveModel = MoveModel;
        createAndShowGUI();
    }

    void refresh() {
        mainPanel.repaint();
    }

    private void createAndShowGUI() {
        JFrame board = new JFrame("Single Player Game");
        board.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainPanel = new MainPanel();
        board.add(mainPanel);
        board.pack();
        board.setVisible(true);
    }

    JButton getButton() {   return mainPanel.getButton();   }
    JButton getButton2() { return mainPanel.getButton(); } 

    class MainPanel extends JPanel {

        private BottomPanel bPanel;

        MainPanel() {
            setLayout(new BorderLayout(GAP,GAP));
            add(new TopPanel(), BorderLayout.PAGE_START);
            add(new BoardPanel(), BorderLayout.CENTER);
            bPanel = new BottomPanel();
            add(bPanel, BorderLayout.PAGE_START);
        }

        JButton getButton() {   return bPanel.getButton();  }
        JButton getButton2() { return bPanel.getButton2(); } 

    }

    class TopPanel extends JPanel {
        TopPanel() {
            setLayout(new FlowLayout(FlowLayout.CENTER));
            add(new JLabel("This is an amazing game "));
        }
    }

    class BoardPanel extends JPanel {

        Player player;

        BoardPanel()   {

            setBorder(BorderFactory.createLineBorder(Color.BLACK, GAP));
            GridLayout layout = new GridLayout(MoveModel.getBoardRows(), 
            MoveModel.getBoardCols());
            setLayout(layout);

            for (int i = 0; i <MoveModel.getBoardRows(); i++)   {

                for (int j = 0; j < MoveModel.getBoardCols(); j++)  {
                    add(new Tile());
                }
            }

            player = new Player();
            player.setBounds(new Rectangle(1000,1000, 1000,1000));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            player.paint(g);
        }
    }

    class Tile extends JLabel {

        Tile() {
            setPreferredSize(new Dimension(MoveModel.getSquareSize(), MoveModel.getSquareSize()));
            setBorder(BorderFactory.createLineBorder(Color.ORANGE, GAP));
        }
    }

    class Player extends JLabel{

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillRect(MoveModel.getPlayerX(), MoveModel.getPlayerY(), MoveModel.getPlayerSize(),MoveModel.getPlayerSize());
        }
    }

    class BottomPanel extends JPanel {

        JButton button = new JButton("Random Move");
        JButton button2 =new JButton("move East");


        BottomPanel(){
            add(button);
            add(button2);

        }

        JButton getButton() {   return button;  }
        JButton getButton2() { return button2; } 
    }
}

class MoveModel{

    private int boardRows = 9, boardCols = 9, squareSize = 50;
    int playerX = 0;
    private int playerY = 0;
    private int playerSize =25;
    int getPlayerX() {  return playerX; }

    void setPlayerX(int playerX) {  this.playerX = playerX; }

    int getPlayerY() {return playerY;   }

    void setPlayerY(int playerY) {  this.playerY = playerY; }

    int getPlayerSize() {return playerSize; }

    int getBoardRows() {return boardRows; }

    int getBoardCols() {return boardCols; }

    int getSquareSize() {return squareSize; }

output

最佳答案

Showvisible中更改

JButton getButton2() { return mainPanel.getButton(); }

JButton getButton2() { return mainPanel.getButton2(); }

Mov 构造函数中(不要将 mov 用于 class name )为按钮分配一个 Action 监听器:

 showvisible.getButton2().addActionListener(e-> movePlayerX(50));

并将此方法添加到 Mov 中:

//Move player in the x direction to the East (positive) or west (negative 
private void movePlayerX(final int distance) {
    moveModel.setPlayerX(moveModel.getPlayerX() + distance);//get current x and add to it 
    showvisible.refresh();
}

要增加 X,您可以使用 getPlayerX() 检索当前位置并向其添加。
完整的修改代码可以从here复制

关于java - 将添加到网格的对象沿(用户)指定的方向移动到指定数量的网格单元上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53690759/

相关文章:

java - 需要Java帮助来组合Gui中的多个类

java - 使用JDBI获取Postgres数组数据

python - FramelessWindowhint 导致 qmenu 无法正常工作

java - Struts2 在带有 &quote 的 jsp 文件上显示 json 数据

c# - 如何使用 IKVM 构建 .net 库?

python - 将看门狗与 Tkinter 一起使用

Java GUI 分层 Pane

java - 使用什么工具包可以在绘画中制作多个线程? Swing、GWT、FX、Qt 还是什么?

java - 将 XML 嵌入到 SOAP 请求的 CDATA 部分时出现解析错误

java - 用 if 语句指向程序中的特定行? java