Перемещение графического объекта с кнопкой мыши и слушателем - PullRequest
0 голосов
/ 13 июня 2019

Нужна небольшая помощь, я пытаюсь сделать простую игру для школьного проекта, но я не могу заставить свои танки двигаться.

Можно ли заставить графический объект двигаться только с помощью кнопок?

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

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

public class Hra extends JPanel{
public int zakladc=1300;
public int zakladm=35;

public int GetZakladc(){
    return zakladc;
}

public int GetZakladm(){
    return zakladm;
}

    Pozadi();
    tank_cerveny();
    tank_modry();

    JTextField uhel_text=new JTextField(3);

    JTextField sila_text=new JTextField(3);

    JButton prava=new JButton("VPRAVO");           
    add(prava);
    class obsluha_prava implements MouseListener{
        public void mouseClicked(MouseEvent e) {
            if (natahu==0){
                zakladc=zakladc+1;


                System.out.println(zakladc);
            }
        }
        public void mousePressed(MouseEvent e) {

        }
        public void mouseReleased(MouseEvent e) {

        }
        public void mouseEntered(MouseEvent e) {

        }
        public void mouseExited(MouseEvent e) {

        }
    }

    JButton leva=new JButton("VLEVO");                
    add(leva);
    class obsluha_leva implements MouseListener{
        public void mouseClicked(MouseEvent e) {

        }
        public void mousePressed(MouseEvent e) {

        }
        public void mouseReleased(MouseEvent e) {

        }
        public void mouseEntered(MouseEvent e) {

        }
        public void mouseExited(MouseEvent e) {

        }
    }

}
public void Pozadi(){
Graphics g = img.getGraphics();
Color pisek=new Color(242,197,102);
    g.setColor(pisek);
    g.fillRect(0,665,1368,100);
}

public void tank_cerveny(){
    Graphics g = img.getGraphics();
    g.setColor(Color.BLACK);
    g.fillOval(zakladc,y-13,40,13);
    g.fillRect(zakladc-10,y-2*13+6,15,4);
    g.setColor(Color.RED);
    g.fillRect(zakladc+5,y-2*13+1,30,13);
}

public void tank_modry(){
    Graphics g = img.getGraphics();
    g.setColor(Color.BLACK);
    g.fillOval(zakladm,y-13,40,13);
    g.fillRect(zakladm+35,y-2*13+6,15,4);
    g.setColor(Color.BLUE);
    g.fillRect(zakladm+5,y-2*13+1,30,13);
}

То, как это должно работать, заключается в том, что вы нажимаете кнопку «VPRAVO», и один танк перемещается вправо или «VLEVO», а танк перемещается влево.

1 Ответ

1 голос
/ 13 июня 2019

Да, это вполне возможно, вот упрощенный пример.

Когда вы хотите нарисовать что-то на компоненте, вы делаете это внутри переопределенного метода paintComponent. В этом методе у вас есть доступ к фактическому Graphics объекту, который используется для рисования компонента.

Добавьте ActionListener к каждой кнопке, которая будет вызываться при нажатии, адаптировать направление и координаты в зависимости от кнопки, затем вызвать repaint(), что заставит компонент перекраситься, используя новые значения:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Hra extends JPanel {

    private int x = 130;
    private int y = 100;

    private boolean moveRight = false;

    public Hra() {

        JButton prava = new JButton("VPRAVO");

        prava.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {

                moveRight = true;
                x = x - 5;
                repaint();

            }
        });
        add(prava);

        JButton leva = new JButton("VLEVO");

        leva.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {

                moveRight = false;
                x = x + 5;
                repaint();

            }
        });
        add(leva);

    }

    @Override
    public void paintComponent(final Graphics g) {

        super.paintComponent(g);

        if (moveRight) {

            tank_cerveny(g);
        } else {

            tank_modry(g);
        }
    }

    public void tank_cerveny(final Graphics g) {

        g.setColor(Color.BLACK);
        g.fillOval(x, y - 13, 40, 13);
        g.fillRect(x - 10, y - 2 * 13 + 6, 15, 4);
        g.setColor(Color.RED);
        g.fillRect(x + 5, y - 2 * 13 + 1, 30, 13);
    }

    public void tank_modry(final Graphics g) {

        g.setColor(Color.BLACK);
        g.fillOval(x, y - 13, 40, 13);
        g.fillRect(x + 35, y - 2 * 13 + 6, 15, 4);
        g.setColor(Color.BLUE);
        g.fillRect(x + 5, y - 2 * 13 + 1, 30, 13);
    }

    public static void main(final String[] args) {

        Hra hra = new Hra();

        JFrame frame = new JFrame();

        frame.setContentPane(hra);

        frame.setSize(400, 200);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);

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