Я разрабатываю программу, в которой пушка стреляет в пулю, и эта волнует определенную точку карты. Проблема, - в котором, когда я отправляю пушку, чтобы менять адрес выстрела, есть проблема renderizado:
Нет никакой панели, которую он вмешивал бы, априори. Я показываю вам код далее для того, чтобы у вас была каждая деталь:
Графический интерфейс
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);
}
}