GUI манипуляции для настольной игры - PullRequest
0 голосов
/ 03 декабря 2018

Я совершенно новичок в Java и хочу создать однопользовательскую настольную игру на Java.

У меня уже есть много классов, которые определяют игру, но, для моего вопроса, я ограничу этот вопрос созданием доски с графическим интерфейсом для моей настольной игры.Мои очень конкретные вопросы основаны на приведенном ниже коде:

  1. Как мне переместить игрока в настольную игру?(класс Player существует)
  2. Это правильный способ создания платы Java с графическим интерфейсом, есть ли лучшие альтернативы?
  3. Как я могу установить только видимую часть игры?(и это должно измениться, когда игрок движется!)

Заранее спасибо за достойные ответы.Поскольку я очень новичок в Java, пожалуйста, объясните ваши ответы в четкой форме.

это вывод кода ниже:

output of the code

import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseMotionAdapter;

public class SwingPaintDemo3 {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI(); 
            }
        });
    }

    private static void createAndShowGUI() {
        System.out.println("Created GUI on EDT? "+
        SwingUtilities.isEventDispatchThread());
        JFrame f = new JFrame("Single Player Game");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
    } 
}

    class MyPanel extends JPanel {


        private int squareX = 50;
        private int squareY = 50;
        private int squareW = 20;
        private int squareH = 20;

        public MyPanel() {

            setBorder(BorderFactory.createLineBorder(Color.black));


   public Dimension getPreferredSize() {
        return new Dimension(250,200);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);       
        g.drawString("This is the game board ",10,20);
        g.setColor(Color.GREEN);
        g.fillRect(squareX,squareY,squareW,squareH);
        g.setColor(Color.BLACK);
        g.drawRect(squareX,squareY,squareW,squareH);
        g.drawRect(squareX+20,squareY,squareW,squareH);
        g.drawRect(squareX+40,squareY,squareW,squareH);
        g.drawRect(squareX+60,squareY,squareW,squareH);
        g.drawRect(squareX+60,squareY,squareW,squareH);
        g.drawRect(squareX+80,squareY,squareW,squareH);
        g.drawRect(squareX,squareY+20,squareW,squareH);
        g.drawRect(squareX+20,squareY+20,squareW,squareH);
        g.drawRect(squareX+40,squareY+20,squareW,squareH);
        g.drawRect(squareX+60,squareY+20,squareW,squareH);
        g.drawRect(squareX+80,squareY+20,squareW,squareH);
        g.drawRect(squareX,squareY+40,squareW,squareH);
        g.drawRect(squareX+20,squareY+40,squareW,squareH);
        g.drawRect(squareX+40,squareY+40,squareW,squareH);
        g.drawRect(squareX+60,squareY+40,squareW,squareH);
        g.drawRect(squareX+80,squareY+40,squareW,squareH);

    }  
} 

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Ниже приведен mcve , демонстрирующий очень простую реализацию игрового поля и игрока с использованием шаблона Model-View-Controller.Модель в этом шаблоне содержит всю информацию, которая нужна представлению («У меня уже есть отдельный класс Board.Java с матричным представлением настольной игры, включая координаты» - это модель).Это просто представление, и контроллер связывает представление и модель и организует шоу:

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 GameControler {

    private Model model;
    private View view;

    public GameControler() {

        model = new Model();
        view = new View(model);
        view.getButton().addActionListener(e-> movePlayer());
    }

    //move player to a random position for demo purpose only 
    private void movePlayer() {
        final Random rnd = new Random();
        model.setPlayerX(rnd.nextInt(100));//arbitrary limit which maybe outside bounds
        model.setPlayerY(rnd.nextInt(100));//arbitrary limit which maybe outside bounds
        view.refresh();
    }

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

class View {

    private final static int GAP = 2;
    Model model;
    private MainPanel mainPanel;

    View(Model model){
        this.model = model;
        createAndShowGUI();
    }

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

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

    JButton getButton() {   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_END);
        }

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

    class TopPanel extends JPanel {
        TopPanel() {
            setLayout(new FlowLayout(FlowLayout.LEADING));
            add(new JLabel("This is the game board "));
        }
    }

    class BoardPanel extends JPanel {

        Player player;

        BoardPanel()   {

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

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

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

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

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

    class Tile extends JLabel {

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

    class Player extends JLabel{

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

    class BottomPanel extends JPanel {

        JButton button = new JButton("Move Player");

        BottomPanel(){
            add(button);
        }

        JButton getButton() {   return button;  }
    }
}

class Model{

    private int boardRows = 3, boardCols = 5, squareSize = 50;
    private int playerX = 0, playerY = 0, playerSize =15;

    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; }
}

enter image description here

Код можно скопироватьвставить в один файл (GameControler.java) и запустить.Пожалуйста, просмотрите, измените ваши потребности и спросите, где вам нужны пояснения.

0 голосов
/ 03 декабря 2018

Для почти всех этих вопросов вам нужно создать метод, чтобы нарисовать определенное место на доске.Вы должны держать доску отдельно от графического представления - например, как места с координатами от (0,0) до (5,3).Они могут быть преобразованы в фактическую графику.Теперь вы можете пройти через каждую из координат доски, определить, что на ней (игрок / свободен / вне зоны видимости) и нарисовать ее соответственно.

Что касается "есть ли лучшие методы": яконечно, есть, но идти с этим.Так как вы только начинаете, это место так же хорошо, как и любое другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...