Проблема renderizado изображение

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

Salida del programa

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

Графический интерфейс

package elementosJuego;

    import elementosJuego.paneles.PanelCanon;
    import elementosJuego.paneles.PanelMapaCanon;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GridLayout;
    import java.awt.Rectangle;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import javax.swing.*;
    import javax.swing.plaf.basic.BasicProgressBarUI;

        /**
         *
         * @author ignacioaranguren
         */
        public class Juego extends JFrame {
            private Casilla[][] mapa;
            private JPanel contenedorTiempo, contenedorVidas,contenedorBarra;
            private PanelMapaCanon contenedorMapaCanon;
            private PanelCanon contenedorCanon;
            private Dimension d1, d2, d3, d4, d5;
            private double anguloRotacion = Math.PI/2, anguloMin = 0.656173986, anguloMax = 2.485418668;
            private JProgressBar barra;
            private ActionListener ac ;
            private Timer t;
            private int progreso = 0;
            private boolean flag = false;

            public Juego(){

                setLayout(null);
                setBackground(Color.black);
                d1 = new Dimension(646, 699);
                contenedorMapaCanon = new PanelMapaCanon(d1);
                contenedorMapaCanon.setBounds(0, 0, 646, 699);

                barra = new JProgressBar(JProgressBar.HORIZONTAL, 0, 100);


                barra.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 2, true));
                barra.setUI(new BasicProgressBarUI(){
                    @Override
                    protected void paintDeterminate(Graphics g, JComponent c) {
                        Graphics2D g2d = (Graphics2D)g;
                        int ancho = barra.getWidth();
                        int alto = barra.getHeight();

                        int espacioAncho = ancho ;
                        int espacioAlto = alto ;
                        barra.setPreferredSize( new Dimension(200,40));
                        double porcentajeProgres = barra.getPercentComplete();

                        espacioAncho = (int)(espacioAncho * porcentajeProgres);
                        if(porcentajeProgres <= 0.25){
                            g2d.setColor(Color.GREEN);
                        }else if( porcentajeProgres > 0.25 && porcentajeProgres <= 0.5){
                            g2d.setColor(Color.yellow);
                        }else if( porcentajeProgres > 0.5 && porcentajeProgres <= 0.75){
                            g2d.setColor(Color.orange);
                        }else{
                            g2d.setColor(Color.red);
                        }
                        Rectangle rec1 = new Rectangle(0,0, espacioAncho, espacioAlto);
                        g2d.fill(rec1);
                    }

                 });
                 ac = new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if(flag == false){
                        progreso = progreso + 1;
                        if(progreso == 99){
                            flag = true;
                        }
                        }else{
                            progreso = progreso - 1;
                            if(progreso == 1){
                                flag = false;
                            }
                        }
                        barra.setValue(progreso);
                    }

                };

                t = new Timer(20, ac);
                t.start();//cambiar el  final
                //add(barra);
                d2 = new Dimension(646, 120);
                contenedorCanon = new PanelCanon(d2);
                contenedorCanon.setLayout(new FlowLayout(FlowLayout.RIGHT));
                //contenedorCanon.setBackground(Color.gray);
                contenedorCanon.setBounds(0, 700, 646, 120);
                d4 = new Dimension(100, 100);
                contenedorVidas = new JPanel();
                contenedorVidas.setBackground(Color.red);
                contenedorVidas.setSize(d4);



                d5 = new Dimension(100, 100);
                contenedorTiempo = new JPanel();
                contenedorTiempo.setBackground(Color.blue);
                contenedorTiempo.setSize(d5);
                addKeyListener(new KeyAdapter() {
                    @Override
                    public void keyPressed(KeyEvent evento) {
                        switch (evento.getKeyCode()) {
                            case KeyEvent.VK_LEFT:
                                if(anguloRotacion > anguloMin && anguloRotacion < anguloMax ){
                                    anguloRotacion = anguloRotacion + 0.05;
                                    contenedorCanon.setAngulo(anguloRotacion);
                                    contenedorCanon.repaint();
                                }
                                break;
                            case KeyEvent.VK_RIGHT:
                                if(anguloRotacion > anguloMin && anguloRotacion < anguloMax){
                                    anguloRotacion = anguloRotacion - 0.05;
                                    contenedorCanon.setAngulo(anguloRotacion);
                                    contenedorCanon.repaint();
                                }
                                break;
                        }
                       requestFocus();
                    }

                });
                add(contenedorMapaCanon);

                add(contenedorCanon);
                //contenedorCanon.add(barra);
                setSize(900,900);

                setVisible(true);

            }

            private void cambiarDireccion(){

            }
        }

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

Второй класс - класс контейнера пушки, который он получает в наследство от JPanel.

В está класс реализовал ротацию пушки. Слушатель (JPanel) получает событие клавиатуры. В которой я реализую увеличение угла ротации.

Класс PanelCanon

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package elementosJuego.paneles;

import java.awt.Dimension;
import java.awt.*;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

import javax.swing.*;

/**
 *
 * @author ignacioaranguren
 */
public class PanelCanon extends JPanel{
    private double alfa = 0;
    private boolean flag = false;
    public PanelCanon(Dimension d){
        super.setSize(d);
        setBackground(Color.gray);
    }

    public void setAngulo(double alfa){
        this.alfa = Math.PI/2-alfa;
    }

    @Override
    public void paintComponent(Graphics g){
        try {
            super.paintComponent(g);
            Graphics2D g2d1 = (Graphics2D) g;
            BufferedImage img=ImageIO.read(getClass().getResource("/imagenes/canon.png"));
            //Image img  = new ImageIcon(getClass().getResource("/imagenes/canon.png")).getImage();
            if(flag == true){

                double locationX = img.getWidth(this) / 2;
                double locationY = img.getHeight(this) / 2;
                AffineTransform tx = AffineTransform.getRotateInstance(alfa, locationX, locationY);
                AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
                tx.rotate(alfa);
                System.out.println(tx.toString());
                g2d1.drawImage(op.filter(img, null), 330,10, null);
            }else{
                g2d1.drawImage(img, 335,0, null);
                flag = true;
            }
        } catch (IOException ex) {
            Logger.getLogger(PanelCanon.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


}

Класс Карта:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package elementosJuego.paneles;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 *
 * @author ignacioaranguren
 */
public class PanelMapaCanon extends JPanel{

    public PanelMapaCanon(Dimension d){
        super.setSize(d);
    }

    @Override
    public void paintComponent(Graphics g){
        Image img = new ImageIcon(getClass().getResource("/imagenes/fondoMapa.png")).getImage();
        g.drawImage(img, 30, 30, this); 
    }

}

5
задан 17.05.2019, 12:26
0 ответов