Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Giaan46 en 18 de Abril 2023, 15:48
-
Hola que tal ?? estoy haciendo el proyecto final del master que estoy haciendo en java y tengo problemas para implementar la parte grafica, ya tengo el codigo casi terminado, lo que me falta es implementar los personajes en el Jframe del fondo a medida que se van creando, si alguien me podria dar una mano estare muy agradecido, dejo mi proyecto completo aver que les parece y si me dan tambien una critica sobre el desarrollo tambien sera bienvenida. desde ya muchas gracias !
package Game.tokio.Personajes;
import javax.swing.*;
public abstract class Personaje {
private String nombre;
private int puntosVida;
private int resistenciaArmadura;
private ImageIcon imagen;
public Personaje(String nombre, int puntosVida, int resistenciaArmadura) {
this.nombre = nombre;
this.puntosVida = puntosVida;
this.resistenciaArmadura = resistenciaArmadura;
this.imagen = imagen;
}
public String getNombre() {
return nombre;
}
public int getVida() {
if(puntosVida < 0){
return 0;
}
return puntosVida;
}
public void setVida(int vida) {
this.puntosVida = vida;
}
public int getResistenciaArmadura() {
return resistenciaArmadura;
}
public abstract int atacar (Personaje enemigo);
public int recibirAtaque(int ataque) {
if(ataque >= resistenciaArmadura){
return ataque - resistenciaArmadura;
}else if (ataque < resistenciaArmadura){
return 0;
}else if(puntosVida == 0){
return 0;
}
return ataque - resistenciaArmadura;
}
public abstract String mensaje();
@Override
public boolean equals(Object obj){
if(obj instanceof Personaje){
Personaje personaje2 = (Personaje) obj;
return nombre.equals(personaje2.getNombre()); // si los nombres coinsiden retorna true
}
else return false;
}
public ImageIcon getImagen(){
return imagen;
}
@Override
public String toString () {
return getNombre() + "( Vida= " + getVida() + " Armadura =" + getResistenciaArmadura() + ")";
}
}
package Game.tokio;
import Game.tokio.Personajes.*;
import java.util.ArrayList;
public class Ejercito {
public ArrayList<Personaje> personajes;
public Ejercito() {
personajes = new ArrayList<Personaje>();
}
public void addPersonaje(Personaje personaje) {
// añadimos un personaje
personajes.add(personaje);
}
public Personaje getPersonaje(int posicion) {
try {
// retornamos un personaje en la posicion
return personajes.get(posicion);
} catch (Exception e) {
// si no hay personajes en esa posicion
System.out.println("no hay personajes ");
return null;
}
}
public ArrayList<Personaje> getPersonajes(){
return personajes;
}
}
package Game.tokio;
import Game.tokio.Personajes.Bestias;
import Game.tokio.Personajes.Heroes;
import javax.swing.*;
public class Batalla {
// metodo por consola
public static void batallar(Ejercito heroes, Ejercito bestias) {
int turno = 0;
do {
for (int i = 0; i < bestias.personajes.size(); i++) {
// generamos un for para que cada vez que la lista fue recorrida incremente el valor asignado para turno asi podemos imprimir por consola que turno es el que se esta jugando
for (int j = 0; j == i; j++) {
turno++;
System.out.println("Turno " + turno + ':');
}
Heroes heroe = (Heroes) heroes.getPersonaje(i);
Bestias bestia = (Bestias) bestias.getPersonaje(i);
// guardamos en variables los resultados de ataques , daño y de vida para que se actualice a medida que pasan los turnos..
int atacah = heroe.atacar(bestia);
int atacab = bestia.atacar(heroe);
int dañoh = heroe.recibirAtaque(atacab);
int dañob = bestia.recibirAtaque(atacah);
int vidah = heroe.getVida();
int vidab = bestia.getVida();
//esquema de lucha consola :
System.out.println("Lucha entre " + heroe.getNombre()
+ " (Vida= " + vidah + " Armadura= " + heroe.getResistenciaArmadura() + ") y "
+ bestia.getNombre() + " (Vida= " + vidab + " Armadura= " + bestia.getResistenciaArmadura() + ")");
System.out.println(heroe.getNombre() + " saca " + atacah + " y le quita " + dañob +
" de vida a " + bestia.getNombre());
System.out.println(bestia.getNombre() + " saca " + atacab + " y le quita " + dañoh +
" de vida a " + heroe.getNombre());
// actualizamos los valores del daño causado en esta ronda
bestia.setVida(bestia.getVida() - dañob);
heroe.setVida(heroe.getVida() - dañoh);
// hacemos un if con la consicion de que personaje tenga vida y sino se elimina de la lista
if (heroes.getPersonaje(i).getVida() <= 0) {
System.out.println("¡Muere " + heroe.mensaje() + heroes.personajes.get(i).getNombre() + '!');
heroes.personajes.remove(heroes.getPersonaje(i));
} else if (bestias.getPersonaje(i).getVida() <= 0) {
System.out.println("¡Muere " + bestia.mensaje() + bestias.personajes.get(i).getNombre() + '!');
bestias.personajes.remove(bestias.getPersonaje(i));
}
}
}
while (!bestias.personajes.isEmpty());
// luego hacemos otro if para mostrar por pantalla el ganador del combate
if (bestias.personajes.isEmpty()) {
System.out.println("¡¡VICTORIA DE LOS HÉROES!!");
} else if (heroes.personajes.isEmpty()) {
System.out.println("¡¡VICTORIA DE LAS BESTIAS!!");
}
}
public static void batallarTextArea(Ejercito heroes, Ejercito bestias, JTextArea textArea) {
int turno = 0;
do {
for (int i = 0; i < bestias.personajes.size(); i++) {
for (int j = 0; j == i; j++) {
turno++;
String mensajeTruno = "Turno " + turno + ": \n";
textArea.append(mensajeTruno);
}
// obtenemos los personajes que van a luchar
Heroes heroe = (Heroes) heroes.getPersonaje(i);
Bestias bestia = (Bestias) bestias.getPersonaje(i);
// guardamos los resultados de los ataques y el daño recibido para cada personaje
int atacah = heroe.atacar(bestia);
int atacab = bestia.atacar(heroe);
int dañoh = heroe.recibirAtaque(atacab);
int dañob = bestia.recibirAtaque(atacah);
int vidah = heroe.getVida();
int vidab = bestia.getVida();
// Esquema de la lucha
String mensajeLucha = "Lucha entre " + heroe.getNombre()
+ " (Vida= " + vidah + " Armadura= " + heroe.getResistenciaArmadura() + ") y "
+ bestia.getNombre() + " (Vida= " + vidab + " Armadura= " + bestia.getResistenciaArmadura() + ")\n";
String mensajeAtaqueHeroe = heroe.getNombre() + " saca " + atacah + " y le quita " + dañob +
" de vida a " + bestia.getNombre() + "\n";
String mensajeAtaqueBestia = bestia.getNombre() + " saca " + atacab + " y le quita " + dañoh +
" de vida a " + heroe.getNombre() + "\n";
// Agregamos los mensajes al JTextArea
textArea.append(mensajeLucha);
textArea.append(mensajeAtaqueHeroe);
textArea.append(mensajeAtaqueBestia);
// Actualizamos los valores del daño causado en esta ronda
bestia.setVida(bestia.getVida() - dañob);
heroe.setVida(heroe.getVida() - dañoh);
// Si alguno de los personajes tiene vida menor o igual a 0, lo eliminamos de la lista de personajes
if (heroes.getPersonaje(i).getVida() <= 0) {
String mensajeMuerte = "¡Muere " + heroe.mensaje() + heroes.personajes.get(i).getNombre() + "!\n";
textArea.append(mensajeMuerte);
heroes.personajes.remove(heroes.getPersonaje(i));
} else if (bestias.getPersonaje(i).getVida() <= 0) {
String mensajeMuerte = "¡Muere " + bestia.mensaje() + bestias.personajes.get(i).getNombre() + "!\n";
textArea.append(mensajeMuerte);
bestias.personajes.remove(bestias.getPersonaje(i));
}
}
} while (!bestias.personajes.isEmpty());
// luego hacemos otro if para mostrar por pantalla el ganador del combate
if (bestias.personajes.isEmpty()) {
String mensajeGanaH = "¡¡VICTORIA DE LOS HÉROES!!";
textArea.append(mensajeGanaH);
} else if (heroes.personajes.isEmpty()) {
String mensajeGanaB = "¡¡VICTORIA DE LAS BESTIAS!!";
textArea.append(mensajeGanaB);
}
}
}
package Game.tokio.Personajes;
import java.util.Random;
public class Bestias extends Personaje {
public Bestias(String nombre, int vida, int resistencia) {
super(nombre, vida, resistencia);
}
@Override
public int atacar(Personaje enemigo) {
// se lanza un dado de 0 a 90 al azar
Random dado = new Random();
int dado1 = dado.nextInt(91);
return dado1;
}
@Override
public String mensaje() {
return mensaje();
}
}
package Game.tokio.Personajes;
import java.util.Random;
public class Heroes extends Personaje {
public Heroes(String nombre, int vida, int resistencia) {
super(nombre, vida, resistencia);
}
@Override
public int atacar(Personaje enemigo){
// el ataque será el mejor lanzamiento entre 2 dados de 0 a 100
Random dado = new Random();
int dado1 = dado.nextInt(101);
int dado2 = dado.nextInt(101);
return Math.max(dado1,dado2);
}
@Override
public String mensaje() { return mensaje(); }
}
-
hay 5 clases mas que son (Elfos,Hobbits,Humanos)que extienden la clase de heroes y(Orcos,Trasgos) que extienden de la clase bestias
Ahora la clases que se encargan de la parte grafica del juego :package Game.tokio.Grafic;
import Game.tokio.Ejercito;
import Game.tokio.Personajes.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
public class PanelCrearPeronaje extends JPanel {
private JTextField jtNombre;
private JComboBox<String> jcTipo;
private JTextField jtVida;
private JTextField jtArmadura;
private JButton btaniadir;
private ArrayList<Icon> iconosPersonajes;
private Fondo fondo;
//Atributo para referenciar alguno de los ejercitos de la clase main
private Ejercito ejercito;
//Panel con la lista de personajes
private PanelLista lista;
public PanelCrearPeronaje(String titulo, String[] tipos, Ejercito ejercito) {
// inicializamos componentes
jtNombre = new JTextField();
jcTipo = new JComboBox<String>(tipos);
jtVida = new JTextField();
jtArmadura = new JTextField();
btaniadir = new JButton("añadir");
btaniadir.addActionListener(new AccionCrearPersonaje());
iconosPersonajes = new ArrayList<>();
this.ejercito = ejercito; // Ejercito referenciado
lista = new PanelLista(titulo,ejercito);//pasamos titulo de borde y referencia a ejercito
// layout de "cajas" verticales
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
// cada "caja" apilada verticalmente sera un panel de la clase panleConLabel
add(new PanelConLabel("Nombre: ", jtNombre));
add(new PanelConLabel("Tipo: ", jcTipo));
add(new PanelConLabel("Vida: ", jtVida));
add(new PanelConLabel("Armadura: ", jtArmadura));
// Boton añadir
JPanel pnAniadir = new JPanel();
pnAniadir.add(btaniadir);
add(pnAniadir);
//colocamos el panel lista debajo de todo
add(lista);
// combinamos dos bordes, uno titulador y otro vacio para crear algo de relleno
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(15, 15, 15, 15),
BorderFactory.createTitledBorder(titulo)));
}
private class PanelConLabel extends JPanel {
public PanelConLabel(String texto, JComponent componente) {
//Layout tipo grilla, sera una fila con dos columnas
setLayout(new GridLayout(1, 2));
// En la primera columna, la etiqueta
add(new JLabel(texto));
// En la segunda columna, el componente que acompaña la etiqueta
add(componente);
// inflamos el panel con aldo de borde vacio
setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
}
}
private class AccionCrearPersonaje implements ActionListener{
@Override
public void actionPerformed(ActionEvent e){
// Recogemos datos
String nombre = jtNombre.getText();
String tipo = (String)jcTipo.getSelectedItem();
int vida = Integer.parseInt(jtVida.getText());
int armadura = Integer.parseInt(jtArmadura.getText());
ImageIcon imageIcon = new ImageIcon();
ArrayList<ImageIcon> iconos = new ArrayList<>();
// Creamos nuevo personaje segun tipo
switch (tipo) {
case "Elfo":
ejercito.addPersonaje(new Elfos(nombre, vida, armadura));
ImageIcon imagenElfo = new ImageIcon(getClass()
.getResource("/Game/tokio/Multimedia/elfo1.PNG"));
imageIcon = imagenElfo;
iconos.add(imagenElfo);
break;
case "Humano":
ejercito.addPersonaje(new Humanos(nombre, vida, armadura));
ImageIcon imagenHumano = new ImageIcon(getClass()
.getResource("/Game/tokio/Multimedia/humano.PNG"));
imageIcon = imagenHumano;
iconos.add(imagenHumano);
break;
case "Hobbit":
ejercito.addPersonaje(new Hobbits(nombre, vida, armadura));
ImageIcon imagenHobbit = new ImageIcon(getClass()
.getResource("/Game/tokio/Multimedia/hobbit.PNG"));
imageIcon = imagenHobbit;
iconos.add(imagenHobbit);
break;
case "Trasgo":
ejercito.addPersonaje(new Trasgos(nombre, vida, armadura));
ImageIcon imagenTrasgo = new ImageIcon(getClass()
.getResource("/Game/tokio/Multimedia/trasgo.PNG"));
imageIcon = imagenTrasgo;
iconos.add(imagenTrasgo);
break;
case "Orco":
ejercito.addPersonaje(new Orcos(nombre, vida, armadura));
ImageIcon imagenOrco = new ImageIcon(getClass()
.getResource("/Game/tokio/Multimedia/orco1.PNG"));
imageIcon = imagenOrco;
iconos.add(imagenOrco);
break;
}
// creamos un JLabel con la imagen del personaje
// Limpiamos campos
jtNombre.setText(null);
jcTipo.setSelectedIndex(0);
jtVida.setText(null);
jtArmadura.setText(null);
revalidate();
repaint();
//Actualiza lista
lista.actualizarLista();
}
}
}
package Game.tokio.Grafic;
import Game.tokio.Ejercito;
import Game.tokio.Personajes.Personaje;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class PanelLista extends JPanel {
private JList<Personaje> lista;
private DefaultListModel<Personaje> modeloLista;
private JButton btSubir;
private JButton btBajar;
private JButton btEliminar;
private Ejercito ejercito;
public PanelLista(String titulo, Ejercito ejercito) {
this.ejercito = ejercito;
lista = new JList<Personaje>();
lista.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
modeloLista = new DefaultListModel<Personaje>();
lista.setModel(modeloLista);
btSubir = new JButton("Subir");
btSubir.addActionListener(new AccionSubirBajar(-1));
btBajar = new JButton("Bajar");
btBajar.addActionListener(new AccionSubirBajar(1));
btEliminar = new JButton("Eliminar");
btEliminar.addActionListener(new AccionEliminar());
setLayout(new BorderLayout());
JScrollPane scrollLista = new JScrollPane();
scrollLista.setViewportView(lista);
scrollLista.setBorder(BorderFactory.createTitledBorder(null, titulo));
add(scrollLista, BorderLayout.SOUTH);
JPanel pnBotones = new JPanel();
pnBotones.add(btBajar);
pnBotones.add(btSubir);
pnBotones.add(btEliminar);
add(pnBotones, BorderLayout.CENTER);
}
public void actualizarLista() {
modeloLista.clear();
for (Personaje pers : ejercito.personajes)//Ejercito no proporciona el arrayList
modeloLista.addElement(pers);
lista.setModel(modeloLista);
}
private class AccionEliminar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Personaje seleccionado = lista.getSelectedValue();
if (seleccionado == null)
JOptionPane.showMessageDialog(null, "selecciona un personaje ");
else {
ejercito.personajes.remove(seleccionado);// Eliminamos del arraylist
actualizarLista();
}
}
}
private class AccionSubirBajar implements ActionListener{
private int desplazamiento; // -1 para subir y +1 para bajar
public AccionSubirBajar(int desplazamiento){
this.desplazamiento = desplazamiento;
}
@Override
public void actionPerformed(ActionEvent e) {
// personaje seleccionado en jlist
Personaje seleccionado = lista.getSelectedValue();
if(seleccionado == null)
JOptionPane.showMessageDialog(null,"selecciona un personaje");
else{
// indice de soldado seleccionado, es igual a ambas listas
int indiceSelleccionado = lista.getSelectedIndex();
// indice del personaje para intercambiar , puede que sea uno anterio o uno posterior
int indiceIntercambiar = indiceSelleccionado + desplazamiento;
// buscamos en el arraylist, el personaje para intercambiar
Personaje intercambiar = ejercito.getPersonaje(indiceIntercambiar);
// si intercambiar fuera null, es que el soldado seleccionado no se puede intercambiar
if(intercambiar != null){
// seteamos los soldados e intercambiamos los indices
ejercito.personajes.set(indiceSelleccionado,intercambiar);
ejercito.personajes.set(indiceIntercambiar, seleccionado);
actualizarLista();
}
}
}
}
}
import Game.tokio.Ejercito;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.File;
public class Fondo extends JPanel {
private Image imagen;
private Ejercito ejercito;
public Fondo(String rutaImagen) {
this.ejercito = ejercito;
try {
File archivoImagen = new File(rutaImagen);
imagen = ImageIO.read(archivoImagen);
} catch (Exception e) {
System.out.println("Error al cargar la imagen: " + e.getMessage());
}
}
@Override
public void paint(Graphics g) {
Dimension tamano = getSize();
g.drawImage(imagen, 0, 0, tamano.width, tamano.height, null);
setOpaque(false);
super.paint(g);
}
package Game.tokio.Grafic;
import Game.tokio.Batalla;
import Game.tokio.Ejercito;
import Game.tokio.Personajes.Personaje;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class BatallaGr extends JFrame {
//Modelo
private Ejercito bestias;
private Ejercito heroes;
// Vistas
private PanelCrearPeronaje crearHeroes;
private PanelCrearPeronaje crearBestias;
private JButton btIniciar;
private JTextArea textArea;
private Fondo fondo ;
private ImagenPersonajes imagenPersonajes;
public BatallaGr(){
bestias = new Ejercito();
heroes = new Ejercito();
fondo = new Fondo("/Users/gian/IdeaProjects/ProyectoFinal_GianlucaMaida/src/Game/tokio/Multimedia/FondoJuego.png");
crearHeroes = new PanelCrearPeronaje("Heroes", new String[]{"Elfo","Humano","Hobbit"},heroes);
crearBestias = new PanelCrearPeronaje("Bestias", new String[]{"Orco","Trasgo"},bestias);
textArea = new JTextArea();
btIniciar = new JButton(" BATALLAR ");
btIniciar.getPreferredSize();
btIniciar.setBounds(100,100,100,100);
btIniciar.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textArea.setText(" ");
Batalla.batallarTextArea(heroes,bestias,textArea);
}
});
JScrollPane scrollLista = new JScrollPane();
JPanel pnSuperior = new JPanel();
JPanel pnInferior = new JPanel();
pnSuperior.add(crearHeroes);
pnSuperior.add(crearBestias);
pnInferior.add(btIniciar);
pnInferior.add(textArea);
getContentPane().add(pnSuperior, BorderLayout.NORTH);
getContentPane().add(pnInferior,BorderLayout.SOUTH);
scrollLista.setViewportView(textArea);
scrollLista.setBounds(10,10,10,10);
scrollLista.setBorder(BorderFactory.createTitledBorder(null, "Batalla!"));
add(scrollLista, BorderLayout.CENTER);
pnInferior.setVisible(true);
JFrame ventanaBat = new JFrame();
JPanel panelPersonajes = new JPanel();
panelPersonajes.setLayout(new FlowLayout());
for (Personaje heroe: heroes.getPersonajes()){
JLabel label = new JLabel(new ImageIcon(String.valueOf(heroe.getImagen())));
panelPersonajes.add(label);
}
for (Personaje bestia : bestias.getPersonajes()){
JLabel label = new JLabel(new ImageIcon(String.valueOf(bestia.getImagen())));
panelPersonajes.add(label);
}
ventanaBat.add(fondo);
//fondo.add(imagenPersonajes,BorderLayout.CENTER);
ventanaBat.setTitle("Batalla señor de los anillos ");
ventanaBat.setSize(1088,832);
fondo.setBounds(0,0,1088,832);
ventanaBat.setVisible(true);
setTitle("Batalla ");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public void getGraphics(Graphics2D g) {
super.paint(g);
fondo.paint(g);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new BatallaGr();
}
});
}
}
y aparte tengo una clase ImagenPesonajes que no la termine, he hecho prueba y error buscando ayuda en internet pero no logro hacer lo que quiero