Настройка расположения объектов / изображений на фоне - PullRequest
0 голосов
/ 06 марта 2020

Я сейчас работаю над версией игры, Людо / Чувак, не злись, я столкнулся с несколькими проблемами, одной из самых больших из которых является тот факт, что я не могу разместить токены там, где я хочу, чтобы они быть. Мне нужно установить токены в определенные позиции для начала, и мне понадобится метод, с помощью которого я вычислю, куда их перемещать на экране. Вот код:

public class Ludo extends JFrame{

   private BackgroundPanel imagePanel=null;
   private JLabel jlTokenBlue1=null;
   private JLabel jlTokenBlue2=null;
   ...

   public Ludo(){
          try{         
         //Creating background panel  
         imagePanel = new BackgroundPanel("ludoBoard.png");
         add(imagePanel);

         //create tokens for play
         BufferedImage imageTokenBlue1 = ImageIO.read(new File("blue1.png"));
         jlTokenBlue1 = new JLabel(new ImageIcon(imageTokenBlue1));

         BufferedImage imageTokenBlue2 = ImageIO.read(new File("blue2.png"));
         jlTokenBlue2 = new JLabel(new ImageIcon(imageTokenBlue2));

         BufferedImage imageTokenBlue3 = ImageIO.read(new File("blue3.png"));
         jlTokenBlue3 = new JLabel(new ImageIcon(imageTokenBlue3));

         BufferedImage imageTokenBlue4 = ImageIO.read(new File("blue4.png"));
         jlTokenBlue4 = new JLabel(new ImageIcon(imageTokenBlue4));

         BufferedImage imageTokenRed1 = ImageIO.read(new File("red1.png"));
         jlTokenRed1 = new JLabel(new ImageIcon(imageTokenRed1));

         BufferedImage imageTokenRed2 = ImageIO.read(new File("red2.png"));
         jlTokenRed2 = new JLabel(new ImageIcon(imageTokenRed2));

         BufferedImage imageTokenRed3 = ImageIO.read(new File("red3.png"));
         jlTokenRed3 = new JLabel(new ImageIcon(imageTokenRed3));

         BufferedImage imageTokenRed4 = ImageIO.read(new File("red4.png"));
         jlTokenRed4 = new JLabel(new ImageIcon(imageTokenRed4));

         imagePanel.add(jlTokenBlue1);
         imagePanel.add(jlTokenBlue2);
         imagePanel.add(jlTokenBlue3);
         imagePanel.add(jlTokenBlue4);
         imagePanel.add(jlTokenRed1);
         imagePanel.add(jlTokenRed2);
         imagePanel.add(jlTokenRed3);
         imagePanel.add(jlTokenRed4);

         jlTokenRed1.setLocation(250,500);
         }//End of try
      catch(IOException ioe){
         System.out.println("The background image cannot be loaded...");
      }catch(NullPointerException npe){
         npe.getMessage();
      }
.
.
.
class BackgroundPanel extends JPanel
{
  Image image;
  public BackgroundPanel(String imageName)
  {
    try
    {
      image = javax.imageio.ImageIO.read(new java.net.URL(getClass().getResource(imageName), imageName));
    }
    catch (Exception e) { /*handled in paintComponent()*/ }
  }

  @Override
  protected void paintComponent(Graphics g)
  {
    super.paintComponent(g); 
    if (image != null)
      g.drawImage(image, 0,0,this.getWidth(),this.getHeight(),this);
  }
}

Я пытался использовать setLocation и перекрасил, но не смог установить токены так, как я хочу. Я хотел бы поместить токены в белые поля в соответствующих цветах. Любая помощь и / или предложение очень приветствуются. Ниже изображение того, как это выглядит прямо сейчас. Вот ссылка на диск, содержащий все, если вы сами захотите проверить файлы. drive.google.com/open?id=1xap_xz2K3SF37XQfRN3Y_LHoTHg0HNox!

İmage

1 Ответ

0 голосов
/ 06 марта 2020

Я создал код для вашей игры. Вам нужно будет завершить код.

Вот GUI, который я создал.

Ludo  board

Первое, что я сделал, было использовать шаблон модель / вид / контроллер . Разделяя логические функции игры, я мог сосредоточиться на одной части за раз.

Вот модель, которую я создал. Это не завершено, но я думаю, вы можете видеть, что я пытаюсь сделать стадо. Я поместил его класс в собственный пакет моделей.

package com.ggl.ludo.model;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

public class LudoModel {

    private final BufferedImage gameBoard;

    private final BufferedImage[] imageTokenBlue;

    public LudoModel() {
        imageTokenBlue = new BufferedImage[4];
        imageTokenBlue[0] = getImage("blue1.png");
        imageTokenBlue[1] = getImage("blue2.png");
        imageTokenBlue[2] = getImage("blue3.png");
        imageTokenBlue[3] = getImage("blue4.png");
        gameBoard = getImage("ludoBoard.png");
    }

    public BufferedImage getGameBoard() {
        return gameBoard;
    }

    public BufferedImage[] getImageTokenBlue() {
        return imageTokenBlue;
    }

    private BufferedImage getImage(String fileName) {
        try {
            return ImageIO.read(getClass().getResourceAsStream("/" + fileName));
        } catch (IOException e) {
            return null;
        }
    }

}

Все, что делает этот код, - это чтение изображений и, в конечном итоге, создание логической модели вашей игры. Он вообще не касается представления или кода контроллера.

Следующим классом, который я создал, был класс DrawingPanel. Этот класс др aws игровое поле и в конце концов, др aws фигуры на доске. Расположение информации о деталях входит в модель.

package com.ggl.ludo.view;

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JPanel;

import com.ggl.ludo.model.LudoModel;

public class DrawingPanel extends JPanel {

    private static final long serialVersionUID = 1L;

    private LudoFrame frame;

    private LudoModel model;

    public DrawingPanel(LudoFrame frame, LudoModel model) {
        this.frame = frame;
        this.model = model;
        int width = model.getGameBoard().getWidth();
        int height = model.getGameBoard().getHeight();
        this.setPreferredSize(new Dimension(width, height));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(model.getGameBoard(), 0, 0, this);
        // Your piece drawing code goes here
    }

}

Затем я создал класс для хранения JFrame. Код JScrollPane можно удалить. Мой старый ноутбук не может отображать игровую доску размером с вашу. О чем следует помнить, если вы хотите, чтобы другие играли в эту игру.

Я поместил код меню в свой собственный метод. Мне нравится хранить отдельные вещи отдельно. Мой слабый ум не может обрабатывать слишком много процессов одновременно.

package com.ggl.ludo.view;

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;

import com.ggl.ludo.model.LudoModel;

public class LudoFrame {

    private DrawingPanel drawingPanel;

    private LudoModel ludoModel;

    public LudoFrame(LudoModel ludoModel) {
        this.ludoModel = ludoModel;
        generateGUIControl();
    }

    private void generateGUIControl() {
        JFrame frame = new JFrame("Ludo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setJMenuBar(createMenu());

        drawingPanel = new DrawingPanel(this, ludoModel);
        JScrollPane scrollPane = new JScrollPane(drawingPanel);
        scrollPane.setPreferredSize(new Dimension(400, 400));

        frame.add(scrollPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JMenuBar createMenu() {
        JMenuBar ludoMenuBar = new JMenuBar();
        JMenu ludoMenuFirst = new JMenu("Information");
        ludoMenuBar.add(ludoMenuFirst);

        JMenuItem jmiDescription = new JMenuItem("Description");
        JMenuItem jmiHelp = new JMenuItem("Help");
        JMenuItem jmiRestart = new JMenuItem("Restart");
        JMenuItem jmiExit = new JMenuItem("Exit");

        ludoMenuFirst.add(jmiDescription);
        ludoMenuFirst.add(jmiHelp);
        ludoMenuFirst.add(jmiRestart);
        ludoMenuFirst.add(jmiExit);
        ludoMenuBar.add(ludoMenuFirst);
        return ludoMenuBar;
    }
}

Наконец, класс драйверов, который запускает весь процесс. Вы должны запустить приложение Swing в потоке рассылки событий (EDT). Вызов SwingUtilities invokeLater гарантирует, что ваше приложение запускается на EDT.

package com.ggl.ludo;

import javax.swing.SwingUtilities;

import com.ggl.ludo.model.LudoModel;
import com.ggl.ludo.view.LudoFrame;

public class Ludo implements Runnable {

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

    @Override
    public void run() {
        new LudoFrame(new LudoModel());
    }
}

Я надеюсь, что это было полезно для вас. Что касается контроллеров, я предлагаю вам использовать слушателя мыши и рисовать игровые фигуры на игровом поле.

Помните, информация о расположении игровых фигур входит в модель. Вид чертежного кода dr aws из информации в модели.

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