Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - YoanPupo

Páginas: [1]
1
Como dato la clase Battle, que se encarga de la logica de batalla, y BattlePanel, que se encarga de la visualizacion, no saben que tipo es cada personaje, ni quien los controla, perfectamente pueden ser dos jugadores, o dos CPU.
Como demostracion des-comenten esta linea dentro del metodo reset de la clase visual

//jugador.setActionSelector(new CPUActionSelector());

Y comenten esta

jugador.setActionSelector(new PlayerActionSelector().setPanel(actionListPane));

Luego vean lo que pasa, usen el mago en modo dificil o su personaje no vivirá mucho



Ahi va el codigo

3
Las imagenes del Caballero, coloquenlas en la carpeta Caballero, las del Mago en Mago, ahi van las del Caballero

4
Ya esta, aqui va el codigo, las imagenes las enviaré separadas, les toca a ustedes colocar cada una en su carpeta, consegui reducir el tamaño total reemplazando la imagen de fondo por un fondo renderizado dinamicamente, escriban por cualquier duda

5
Igual tal.vez en partes se pueda, aunque aclaro que el codigo cambio bastante, las acciones ahora se definen en clases y no en metodos, y Mago y Caballero ahora solo tienen constructor, ya que toda la funcionalidad viene de Personaje, el sistema usado para consola era muy dificil de adaptar a graficos, ya que habia que sincronizar la logica del combate con las animaciones, ademas , el juego se ejecuta en dos threads(el awt, que se encarga de la parte grafica, y otro que se encarga de la logica de combate)

6
Consegui convertir el juego en un videojuego, pero al final si tuve que reescribir bastante codigo( unas 8 clases mas), si quieren se los comparto, pero no se si se pueda por las imagenes y la restriccion de tamaño

7
Ya encontré el problema, un pequeño error logico en el uso de Vector2D.ORIGIN_POINT
El error venia del constructor de la clase GameObject y del metodo lenght() de Vector2D
Solo reemplaza las clases GameObject y GameBoard por estas y listo
Como mejoria te sugiero pasar el control del juego(inicio, pausa  ,acelerar, frenar) al teclado y eliminar los botones

8
Las bolas extra no son un error, el codigo agrega mas cuando se supera cierto record, si quieres eliminar este comportamiento elimina o comenta la llamada a addBall que esta en el metodo update() de la clase GameBoard
La barra es controlada por el movimiento del cursor MIENTRAS ESTÉ EN EL AREA DE JUEGO, el evento que mueve la barra esta asociado al componente GameBoard, asi que la barra se detendra si el cursor sale del area de juego, ejemplo hacia la barra de titulo o la zona de los botones
La clase GameBoard tiene un metodo setBarPosition(float y) que permite establecer donde esta la barra en la horizontal, en la clase principal Phong se le asigna la posicion del cursor cursor, si quieres pasarlo al teclado no es dificil
La razon del control por mouse es que en lo personal el teclado se hacia injugable, era casi imposible atravekar a tiempo el campo antes que la bola, ademas, el juego se me hacia monotono porque el rebote era siempre igual, asi que al rebotar con la barra a la bola se le agrega la velocidad que tiene la barra al momento del choque ( algo que ademas aumenta el realismo), tambien fue porque querias el resto de controles con botones, y si estabas jugando y , por ejemplo, apretabas "frenar" el foco( o sea, quien escucha al teclado) pasaria a ese boton, y no podrias mover la barra
 Aun asi, si quieres puedo indicarte que cambiar para jugar con el teclado
  Asegurate de estudiar el codigo, encontraras que puedes hacerle varios cambios

9
Probablemente se repita en otros instanceof( hay varios en el codigo de gestion de colisiones) solo repite el proceso de mover la varizble del if a una linea con casting dentro del bloque

10
Cambia el if quitando el ball
Y agrega en el bloque if esta linea

Ball ball=(Ball)o;

el error probablemente sea por tu version del JDK o por la configuracion del IDE, porque esta funcionalidad con instanceof es relativamente reciente

12
Los vectores son el medio para representar coordenadas x;y, o x;y;z para 3d, son la base del funcionamiento de los juegos

Para renderizar en swing solo creas una clase qie herede de JComponent y anulas el metodo paint(Graphics gc)

Dentro de este usas el objeto Graphics para dibujar, este tiene metodos para dibujar lineas, rectangulos ,elipses, poligonos, curvas, imagenes, y controlar el color
Primero dibujas un rectangulo con el color de getBackground() para borrar la imagen anterior y luego dibujas lo que quieras

Para crear el bucle que actualice constantemente la pantall a puedes usar la clase java.swing.Timer, este se construye con un delay o retardo entre actualizaciones , y un objeto ActionListener(una subclase realmente ya que es una interfaz) ,cuando se inicia ejecuta el codigo  delActionListener una y otra vez.
Adjunto un zip con el codigo completo, no es identico a como querias, pero es muy modificable, la "raqueta" se mueve con el mouse, y cada tantos rebotes se agrega otra bola, señalo que las clases del paquete gameSystem son muy genericas y pueden reutilizarse en otros minijuegos

13
La forma mas "limpia " de hacer esto es usando un archivo de definicion, que describa las operaciones de dibujo, el programa leeria este archivo y dibujaria lo obtenido, el archivo podria ser un txt con cada operacion de dibujo descrita asi
Operacion: parmetro1 :parametro2 :………parametroN

Ejemplo

fillRect: 25 :25 :50: 50
DrawOval: 0: 0: 100: 100

el codigo usaria java.util.Scanner para leer el archivo linea por linea
Luego con java.util.StringTokenizer puedes separar la linea en partes
asi
StringTokenizer cortador =new StringTokenizer(laLinea,":");
esto dividiria la linea usando ":" como separador
Luego obtienes la operacion, que seria el primer token
String operacion=cortador.nextToken()
luego solo seria pasarla por un if else o switch para identificarla, asi un fillRect tendria otros cuatro tokens(x,y,ancho,alto)
Solo obtenlos de cortador, conviertelos a int con Integer.parseInt y ejecuta la operacion
Algo asi
public void drawFile(Graphics gc,File source){
Scanner scan=new Scanner(source);
while(scan.hashNext()){
String line =scan.nextLine();
StringTokenizer cortador=new StringTokenizer(line,":");
If(cortador.countTokens<2)continue;//linea vacia
String operacion=cortador.nextToken().trim();

if(operacion.equals("fillRect")){
int x=Integer.parseInt(cortador.nextToken().trim());
int y=Integer.parseInt(cortador.nextToken().trim());
int ancho=Integer.parseInt(cortador.nextToken().trim());
int alto=Integer.parseInt(cortador.nextToken().trim());
gc.fillRect(x,y,ancho,alto)
}
}
}

asi, el if llevaria un else if para cada operacion que quieras poder usar(drawRect, fillOvall, etc)

15
Esta interesante tu proyecto, con un poco de trabajo puede convertirse de juego por consola a un videojuego grafico, se podria usar casi todo el codigo ya implementado, de hecho tal vez lo haga

16

Empezando con diseñar un componente subclase de JPanel que permita visualizar la bola y la barra

debes sobreescribir el metodo paintComponent(java.awt.Graphics gc)  para tomar el control del renderizado

Crea una clase que servirá de superclase de bola y de barra (ObjetoGrafico por ejemplo) que mantendria como variables posicion (Un point2D o dos float) que mantendran la posicion de el objeto, tamaño con la longitud en x y en y,posicion anterior ,que mantendrá la ultima posicion ocupada,un boolean , que es true si el ultimo movimiento fue en x o false si fue en y,(tiene que ver con las colisiones), y vectorVelocidad, un Point2D o dos float que representa la velocidad actual del objeto.

Ademas del constructor y los get/set, necesitaras un metodo que actualice el objeto, lo mueva a su nueva posicion y otro metodo para determinar si este colisiona con otro objeto pasado como parametro(retorna boolean) la clase Rectangle2D te servirá para probar colisiones
ademas un metodo colision con que se anulará en subclase para definir el comportamiento ante una colision
y un metodo para dibujar el objeto, que recibiria como parametro un Graphics sobre el que dibujar
ademas una clase que gestione los objetos(Universo)que mantendria una lista de objetos graficos,y un metodo para actualizarlos, que itere sobre los objetos que contiene y luego probaria las colisiones, algo asi
     for(ObjetoGrafico obj : ElUniverso){
             obj.actualizar();
              for (ObjetoGrafico otro : ElUniverso){
                     if(obj.colisionaCon(otro)){
                            obj.hayColision(otro);


                      }
}
              }
el metodo actualizar seria asi
public void actualizar(){
    if(ultimoEnX){
posicionAnterior=posicion.clone();
posicion.y+=vectorVelocidad.y;
ultimoEnX =true;
}else{
  posicion.y+=vectorVelocidad.y;
ultimoEnX=false;


}
este metodo mueve el objeto alternativamente en x y en la siguiente llamada en yx ya veras para que
el metodo hay colision esta en blanco en esta clase
el metodo de dibujo husaria el metodo fillRect(int x,int y,int width,int height) para dibujar un rectangulo con la posicion y tamqño del objeto
Una subclase Bola representaria la pelota,el vectorVelocidad se crearia con valores aleatorios, y el metodo hayColision seria asi
public void hayColision(ObjetoGrafico otro){
posicion=ultimaPosicion;
if(ultimoEnX){
vectorVelocidad.x=-vectorVelocidad.x;
}else{
vectorVelocidad.y=-vectorVelocidad.y;
}
}
el efecto conseguido es que al ocurrir una colision se retorna el objeto a la posicion anterior,y se comprueba el ultimo movimiento, si fue en x el valor x de velocidad se invierte, en caso contrario se invierte y, esto consigue el efecto de rebote.
el metodo de dibujo simplemente usaria el metodo fillOval(int x,int y,int width,int height)de Graphics para dibujar la bola
empieza intentando eso,coloca un objeto bola encerrado entre cuatro ObjetoGrafico y ve si se comporta como quieres, ahora no tengo a mano una PC, luego puedo darte codigo mas completo

Páginas: [1]

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".