Как я могу переместить JPanel на JFrame в Java? - PullRequest
0 голосов
/ 07 октября 2019

Итак, я хочу сделать простую игру, похожую на понг, с нуля с помощью Java. В настоящее время я делаю движение двумя веслами. Тем не менее, я застрял в самом начале. Я пытаюсь установить начальную позицию 2 весла, но не могу. Я пытался установить пользовательские макеты, но позже я хочу постоянно менять их позиции, перемещая их, конечно.

У меня есть следующий код:

package com.kristof;
import javax.swing.*;
import java.awt.*;

public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame("gEngine");
        Player playerOne = new Player();
        Player playerTwo = new Player();

        frame.add(playerOne.getMyPanel());
        frame.add(playerTwo.getMyPanel());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBackground(Color.RED);
        frame.setSize(1280, 720);
        frame.setResizable(false);
        frame.setVisible(true);
    }

    public static class Player {
        private JPanel myPanel;

        public Player() {
            this.myPanel = new MyPanel();
        }

        public JPanel getMyPanel() {
            return myPanel;
        }

    }

    static class MyPanel extends JPanel {
        public MyPanel() {
            setBackground(Color.BLACK);
        }
        @Override
        public void paintComponent(Graphics g) {
            // let the component be painted "natural"
            super.paintComponent(g);
            // Do custom painting
            g.setColor(Color.WHITE);
            g.fillRect(50, getHeight() / 2, 20, 120);
        }
    }

}

Я уже пробовализменив свои позиции, вызвав метод setLocation на их myPanel s, но это не сработало.

1 Ответ

1 голос
/ 07 октября 2019

Итак, вы создали класс Player, но у вас нет позиции игрока в этом классе.

Поскольку весла будут двигаться только вверх и вниз, нам нужны только методы для изменения координаты y.

  static class Player{
    int x;
    int y;

   Player(int x){this.x=x;}

   void moveUp(){y--;}
   void moveDown(){y++;}

   void drawPlayer(Graphics2D g){
       g.fillRect(x,y,40,120);
   }

}

Теперь в классе, который расширяет JPanel (в вашем случае MyPanel), мы можем взять наш вновь созданный класс Player в качестве ввода (поместив его в конструктор)

Мы также можем создать таймер для регулярного обновления кадров. Добавляя players[0].moveDown; в часы, первый весло будет перемещаться вниз каждый кадр

В методе рисования мы можем перебирать игроков и отображать их, используя метод drawPlayer в классе Player.

 MyPanel(Player[] players) {
        this.players = players;
        setBackground(Color.BLACK);

        new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                repaint();
                players[0].moveDown;
            }
        }, 300, 1000 / 60);
    }

 @Override
    public void paint(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.WHITE);

        for(Player p : players){
            p.drawPlayer((Graphics2D) g);
        }
    }

Теперь, чтобы собрать все воедино, нам просто нужно создать проигрыватели при запуске программы.

Player[] players = new Player[]{
            new Player(100),
            new Player(1000)
    };
    frame.add(new PongWindow(players));

Вот как будет выглядеть кодкак все вместе:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.util.Timer;
    import java.util.TimerTask;

    public class Main {
        

        public static void main(String[] args) {



            JFrame frame = new JFrame("gEngine");

            Player[] players = new Player[]{
                    new Player(100),
                    new Player(1000)
            };
            frame.add(new PongWindow(players));


            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setBackground(Color.RED);
            frame.setSize(1280, 720);
            frame.setResizable(false);
            frame.setVisible(true);




        }


        static class Player{
            int x;
            int y;

            Player(int x){this.x=x;}

            void moveUp(){y+= -8;}
            void moveDown(){y+= 8;}

            void drawPlayer(Graphics2D g){
                g.fillRect(x,y,40,120);
            }

        }


        static class PongWindow extends JPanel {

            //private JPanel panel = new JPanel();
            Player[] players;

            PongWindow(Player[] players) {
                this.players = players;
                setBackground(Color.BLACK);

                new Timer().scheduleAtFixedRate(new TimerTask() {
                    @Override
                    public void run() {
                        repaint();
                        players[0].moveDown();
                    }
                }, 300, 1000 / 60);


            }



            @Override
            public void paint(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.WHITE);

                for(Player p : players){
                    p.drawPlayer((Graphics2D) g);
                }
            }
        }

    }
...