Fecha y hora actual: Domingo 20 Ago 2017 20:16
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

[JAVA] Bases y demo de un juego sencillo 2D

Responder al Tema Ir a página 1234Siguiente

Índice del Foro > Programación de juegos o videojuegos > [JAVA] Bases y demo de un juego sencillo 2D

Autor Mensaje
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Martes 03 Ago 2010 17:16

Título del mensaje: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Intro

Pues debido a las inquietudes de algunos usuarios, he decidido hacer algo sencillo en java que pueda ser aprovechado para otros que quieran hacer juegos sobre ésta plataforma o aplicaciones, la idea principal es sentar las bases, porque se que muchos que empezáis con la programación, copiáis de aquí de allá, sin tener una idea clara del porque del diseño, restándole importancia a ésto, y al final llegan los problemas, los errores, y todo se vuelve incomprensible e ilegible.

Sprites

Así que me dejo de chachara, y vamos con lo que vamos. Primeramente, si hablamos de un juego 2D, necesitaremos Sprites, el bitmap es la base del Sprite, principalmente obtendremos la imagen de los recursos que previamente almacenamos en un paquete predeterminado, por eso es bueno que seamos organizados y que los nombres a usar en un proyecto, siempre se encuentren en nuestra lengua nativa, y que tengan nombres comprensibles. Se que a muchos os da pereza escribir variables con más de tres caracteres seguidos, pero eso nos ayudará a entender bien el código, y si trabajamos en equipo, nos ayudará a que el equipo lo entienda también.

Código:
  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5.  
  6. package juego;
  7.  
  8. import java.awt.*;
  9. import javax.swing.ImageIcon;
  10. /**
  11.  *
  12.  * @author whiteskull
  13.  */
  14. public class Sprite{
  15. private int x,y; //coordenadas
  16. private boolean visible; // si esta visible o no
  17. private String sprite; // el nombre de la imagen
  18.  
  19. public Sprite() //Constructor
  20. {
  21. visible=true;
  22. x=y=0;
  23. }
  24.  
  25. public boolean isVisble()
  26. {
  27. return visible;
  28. }
  29.  
  30. public void setVisible(boolean estado)
  31. {
  32. visible=estado;
  33. }
  34.  
  35. public int getX() // Obtenemos la coordenada horizontal actual del Sprite
  36. {
  37. return x;
  38. }
  39.  
  40. public void setX(int valor) //Asignamos la coordenada horizontal actual del Sprite
  41. {
  42. x=valor;
  43. }
  44.  
  45. public int getY() // Obtenemos la coordenada vertical actual del Sprite
  46. {
  47. return y;
  48. }
  49.  
  50. public void setY(int valor) // Asignamos la coordenada vertical actual del Sprite
  51. {
  52. y=valor;
  53. }
  54.  
  55. public int getWidth() // Ancho del Sprite
  56. {
  57. return new ImageIcon(getClass().getResource(sprite)).getImage().getWidth(null);
  58. }
  59.  
  60. public int getHeight() // Alto del Sprite
  61. {
  62. return new ImageIcon(getClass().getResource(sprite)).getImage().getHeight(null);
  63. }
  64.  
  65. public void setSprite(String nombre) // Asignamos el fichero imagen al Sprite
  66. {
  67. sprite=nombre;
  68. }
  69.  
  70. public String getSprite() // Nos devuelve el fichero imagen del Sprite
  71. {
  72. return sprite;
  73. }
  74.  
  75. public void putSprite(Graphics grafico,int coordenadaHorizontal,int coordenadaVertical) // Pegamos el Sprite en la pantalla
  76. {
  77. x=coordenadaHorizontal;
  78. y=coordenadaVertical;
  79. if (visible) grafico.drawImage(new ImageIcon(getClass().getResource(sprite)).getImage(), x, y, null);
  80. }
  81.  
  82. }
  83.  


En la ésta clase, hemos incluido lo básico de un Sprite, su finalidad es que pueda ser imprimido en cualquier dispositivo Graphics, que permita desplazamientos y obtener algunas de sus propiedades, las cuales podremos modificar, entre ellas destacar la de visible. Ésta propiedad nos puede dar mucho juego. Imaginemos que mi personaje mata a un enemigo de un balazo, si luego nos interesa repetir el nivel, no necesitaremos destruir al enemigo, y solo le diremos que no sea visible. Visible también nos puede servir para optimizar la aplicación, por ejemplo, tenemos el caso que tenemos un juego con scroll de pantalla, y nos interesa mostrar los que actualmente se encuentren en la área del personaje protagonista, y los que se encuentren moviéndose fuera de la pantalla no nos interesa que los imprima, con su consecuente proceso de pintado, que ralentiza el juego, y más cuando tenemos tropecientos Sprites, entonces modificamos la propiedad visible a false y problema resuelto, ya que aunque lo peguemos, seguirá actualizando sus coordenadas.

Ejemplo de uso

Voy a poner un ejemplo de uso de la clase, porque ya me veo venir las piedras...

Código:
  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5.  
  6. package juego;
  7.  
  8. import java.awt.*;
  9. import java.awt.event.*;
  10. import java.awt.image.BufferedImage;
  11.  
  12. /**
  13.  *
  14.  * @author whiteskull
  15.  */
  16. public class juego extends Canvas {
  17. // TODO code application logic here
  18. private Frame ventana;
  19. private Sprite sprite, otroSprite;
  20. long tiempo=System.currentTimeMillis();
  21.  
  22. public juego(){
  23. sprite=new Sprite();
  24. otroSprite=new Sprite();
  25.  
  26. ventana=new Frame();
  27.  
  28. ventana.setSize(350,200);
  29. ventana.add(this);
  30. ventana.setVisible(true);
  31. ventana.addWindowListener(new WindowAdapter(){
  32. public void windowClosing(WindowEvent e){
  33. System.exit(0);
  34. }
  35. });
  36.  
  37. sprite.setSprite("/Imagenes/personaje.png");
  38. otroSprite.setSprite("/Imagenes/personaje.png");
  39. while(true)
  40. {
  41. if (System.currentTimeMillis()-tiempo>25) { // actualizamos cada 25 milisegundos
  42.  
  43. if (sprite.getX()>this.getWidth()) sprite.setX(0);
  44. else sprite.setX(sprite.getX()+1);
  45.  
  46. dibuja(this.getGraphics());
  47. tiempo=System.currentTimeMillis();
  48. }
  49. }
  50. }
  51.  
  52. public void dibuja(Graphics grafico)
  53. {
  54. // El Begin de OpenGL o DirectX
  55. BufferedImage pantalla=new BufferedImage(this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB );
  56.  
  57. sprite.putSprite(pantalla.getGraphics(), sprite.getX(), sprite.getY());
  58. otroSprite.putSprite(pantalla.getGraphics(), 110, 100);
  59.  
  60. // El ENd
  61. grafico.drawImage(pantalla, 0, 0, this);
  62. }
  63. }
  64.  



Ultima edición por WhiteSkull el Jueves 16 Ago 2012 19:29; editado 3 veces
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Tesis
Administrador


Registrado: 04 Mar 2007
Mensajes: 3151
Ubicación: Valencia - España

Mensaje Publicado: Martes 03 Ago 2010 20:26

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Otro fantástico aporte Ok Ok
Como siempre...


Saludos.


Normas del foro
Aprende a postear correctamente usando las etiquetas
Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Martes 03 Ago 2010 21:57

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Gracias Tesis. La verdad es que la parte ociosa de la programación es la que mejor se me da y además me gusta.

Personaje Jugable

Bueno, cómo ya tenemos la base Sprite, ya podemos ponernos con el objeto que moverá el jugador o usuario. El Personaje Jugable, en adelante PJ, tiene la característica que posee los atributos y propiedades que requieran para el juego que estemos diseñando y será controlado mediante algún tipo de dispositivo de entrada, cómo un joystick o en éste caso, con el teclado. Entre sus atributos por ejemplo, podemos añadirle un propiedad de vida, que puede ser inicializada en el constructor con un valor, el cual ira reduciéndose según recibamos daño o colisionemos con algo, hasta que llegue a cero, que entonces será la muerte del Pj. También podemos incluir una matriz de Sprites que nos podrá servir para almacenar los fotogramas de la animación, si es que queremos animarlo. La estructura cómo comentaba puede ser variable pero lo básico y necesario, que es el control de éste mediante las teclas, es el cuerpo esencial.

Código:
  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5. package juego;
  6.  
  7. import java.awt.event.*;
  8. /**
  9.  * @author whiteskull
  10.  */
  11. public class PersonajeJugable extends Sprite implements KeyListener {
  12.  
  13. private boolean arriba, abajo, izquierda, derecha;
  14.  
  15. public void actualiza() {
  16. if(arriba==true) this.setY(this.getY()-10);
  17. if(abajo==true) this.setY(this.getY()+10);
  18. if(izquierda==true) this.setX(this.getX()-10);
  19. if(derecha==true) this.setX(this.getX()+10);
  20. }
  21.  
  22. // tecla sin pulsar
  23. public void keyReleased(KeyEvent e) {
  24. switch (e.getKeyCode()) {
  25. case KeyEvent.VK_DOWN:
  26. abajo = false;
  27. break;
  28. case KeyEvent.VK_UP:
  29. arriba = false;
  30. break;
  31. case KeyEvent.VK_LEFT:
  32. izquierda = false;
  33. break;
  34. case KeyEvent.VK_RIGHT:
  35. derecha = false;
  36. break;
  37. }
  38. }
  39.  
  40. //tecla presionada
  41. public void keyPressed(KeyEvent e) {
  42. switch (e.getKeyCode()) {
  43. case KeyEvent.VK_UP:
  44. arriba = true;
  45. break;
  46. case KeyEvent.VK_LEFT:
  47. izquierda = true;
  48. break;
  49. case KeyEvent.VK_RIGHT:
  50. derecha = true;
  51. break;
  52. case KeyEvent.VK_DOWN:
  53. abajo = true;
  54. break;
  55. }
  56. }
  57.  
  58. public void keyTyped(KeyEvent e) {
  59. throw new UnsupportedOperationException("Not supported yet.");
  60. }
  61. }
  62.  


Ahora el problema que no encontraremos, cómo expuso una compañera en un hilo, es que podamos perder el foco mientras se crean los componentes. También hay que decir que necesitaremos implementar el KeyListener al objeto que éste por encima, para que éste sea focalizado y direccione la captura de teclas por medio del addKeyListener(), al objeto Pj ya creado, que contiene los métodos para procesar las teclas. De igual forma, siempre podremos direccionar dinámicamente en tiempo de ejecución la toma de eventos a un determinado objeto.

Ejemplo de uso


Código:
  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5.  
  6. package juego;
  7.  
  8. import java.awt.*;
  9. import java.awt.event.*;
  10. import java.awt.image.BufferedImage;
  11.  
  12. /**
  13.  *
  14.  * @author whiteskull
  15.  */
  16. public class juego extends Canvas implements KeyListener {
  17. // TODO code application logic here
  18. private Frame ventana;
  19. private Sprite sprite;
  20. private PersonajeJugable otroSprite;
  21. long tiempo=System.currentTimeMillis();
  22.  
  23. public juego(){
  24. sprite=new Sprite();
  25. otroSprite=new PersonajeJugable();
  26. ventana=new Frame();
  27.  
  28. ventana.setSize(350,200);
  29. ventana.add(this);
  30. ventana.setVisible(true);
  31. ventana.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } });
  32.  
  33. sprite.setSprite("/Imagenes/personaje.png");
  34. sprite.setY(this.getHeight()/2);
  35. otroSprite.setSprite("/Imagenes/personaje.png");
  36. otroSprite.setY(this.getHeight()/2);
  37. // ATENCION ATENCION *************************************************
  38. this.requestFocus(); // Focalizamos hacia nuestro objeto
  39. this.addKeyListener(otroSprite); // Direccionamos la captura a nuestro Pj
  40. // *******************************************************************
  41. while(true) // BUCLE INFINITO DEL JUEGO
  42. {
  43. if (System.currentTimeMillis()-tiempo>25) { // actualizamos cada 25 milisegundos
  44. otroSprite.actualiza(); // Mueve nuestro Pj
  45.  
  46. if (sprite.getX()>this.getWidth()) sprite.setX(0);
  47. else sprite.setX(sprite.getX()+1);
  48.  
  49. dibuja(this.getGraphics());
  50. tiempo=System.currentTimeMillis();
  51. }
  52. }
  53. }
  54.  
  55. public void dibuja(Graphics grafico)
  56. {
  57. // El Begin de OpenGL o DirectX
  58. BufferedImage pantalla=new BufferedImage(this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB );
  59.  
  60. sprite.putSprite(pantalla.getGraphics(), sprite.getX(), sprite.getY());
  61. otroSprite.putSprite(pantalla.getGraphics(), otroSprite.getX(), otroSprite.getY());
  62.  
  63. // El ENd
  64. grafico.drawImage(pantalla, 0, 0, this);
  65. }
  66.  
  67. public void keyTyped(KeyEvent e) {
  68. throw new UnsupportedOperationException("Not supported yet.");
  69. }
  70.  
  71. public void keyPressed(KeyEvent e) {
  72. throw new UnsupportedOperationException("Not supported yet.");
  73. }
  74.  
  75. public void keyReleased(KeyEvent e) {
  76. throw new UnsupportedOperationException("Not supported yet.");
  77. }
  78.  
  79. }
  80.  


Básicamente es el mismo ejemplo que el anterior, sólo que hemos añadido en la declaración de la clase juego, implements KeyListener, y antes de llegar al bucle infinito del juego hemos focalizado y redireccionado.

Código:
  1. // ATENCION ATENCION *************************************************
  2. this.requestFocus(); // Focalizamos hacia nuestro objeto
  3. this.addKeyListener(otroSprite); // Direccionamos la captura a nuestro Pj
  4. // *******************************************************************


Luego para que se actualice, recordar que hay que actualizarlo por medio del método actualiza().

Código:
  1. otroSprite.actualiza(); // Mueve nuestro Pj
  2.  


Ahora ya podemos mover al Pj Guiño.



Ultima edición por WhiteSkull el Jueves 16 Ago 2012 19:30; editado 1 vez
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Viernes 13 Ago 2010 16:29

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Animación de Sprites

Ahora que ya sabemos mover un Sprite, lo ideal sería animarlo mediante varias imágenes una detrás de otra. Para ello deberemos mejorar la clase Sprite. La nueva mejora incorpora un par de métodos; resizeArray,setFrame y getFrame. Basicamente es idéntica a la primera que hicimos, sólo que esta vez se trabaja con una matriz que almacena los nombres de los ficheros de imagen que conformaran la animación. El funcionamiento difiere un poco; si antes asignábamos la imagen con setSprite, ahora no sólo podemos asignarle una única imagen, ya que si volvemos a repetir el proceso con setSprite, conseguimos almacenar la siguiente imagen y así sucesivamente hasta que nos quedemos sin memoria Risa . La variable encargada de mostrar la imagen que deseemos es fotograma, la cual será gestionada con los métodos getFrame y setFrame.

Código:
  1. import java.awt.*;
  2. import javax.swing.ImageIcon;
  3. /**
  4.  *
  5.  * @author whiteskull
  6.  */
  7. public class Sprite {
  8. private int x,y,fotograma; //coordenadas
  9. private boolean visible; // si esta visible o no
  10. private String sprite[]; // el nombre de la imagen
  11.  
  12. public Sprite() //Constructor
  13. {
  14. sprite=new String[1];
  15. fotograma=0;
  16. visible=true;
  17. x=y=0;
  18. }
  19.  
  20. public boolean isVisble() // Nos indicara si esta o no esta visible
  21. {
  22. return visible;
  23. }
  24.  
  25. public void setVisible(boolean estado) // Le indicamos si es visible o no
  26. {
  27. visible=estado;
  28. }
  29.  
  30. public int getX() // Obtenemos la coordenada horizontal actual del Sprite
  31. {
  32. return x;
  33. }
  34.  
  35. public void setX(int valor) //Asignamos la coordenada horizontal actual del Sprite
  36. {
  37. x=valor;
  38. }
  39.  
  40. public int getY() // Obtenemos la coordenada vertical actual del Sprite
  41. {
  42. return y;
  43. }
  44.  
  45. public void setY(int valor) // Asignamos la coordenada vertical actual del Sprite
  46. {
  47. y=valor;
  48. }
  49.  
  50. public int getWidth() // Ancho del Sprite
  51. {
  52. return new ImageIcon(getClass().getResource(sprite[fotograma])).getImage().getWidth(null);
  53. }
  54.  
  55. public int getHeight() // Alto del Sprite
  56. {
  57. return new ImageIcon(getClass().getResource(sprite[fotograma])).getImage().getHeight(null);
  58. }
  59.  
  60. private static Object resizeArray (Object oldArray, int newSize) {
  61. int oldSize = java.lang.reflect.Array.getLength(oldArray);
  62. Class elementType = oldArray.getClass().getComponentType();
  63. Object newArray = java.lang.reflect.Array.newInstance(elementType,newSize);
  64. int preserveLength = Math.min(oldSize,newSize);
  65. if (preserveLength > 0)
  66. System.arraycopy (oldArray,0,newArray,0,preserveLength);
  67. return newArray;
  68. }
  69.  
  70. public void setSprite(String nombre) // Asignamos el fichero imagen al Sprite
  71. {
  72. sprite[sprite.length-1]=nombre;
  73. sprite=(String[])resizeArray(sprite,sprite.length+1);
  74. }
  75.  
  76. public void setFrame(int valor)
  77. {
  78. fotograma=valor;
  79. }
  80.  
  81. public int getFrame()
  82. {
  83. return fotograma;
  84. }
  85.  
  86. public String getSprite() // Nos devuelve el fichero imagen del Sprite
  87. {
  88. return sprite[fotograma];
  89. }
  90.  
  91. public void putSprite(Graphics grafico,int coordenadaHorizontal,int coordenadaVertical) // Pegamos el Sprite en la pantalla
  92. {
  93. x=coordenadaHorizontal;
  94. y=coordenadaVertical;
  95.  
  96. if (visible) grafico.drawImage(new ImageIcon(getClass().getResource(sprite[fotograma])).getImage(), x, y, null);
  97. }
  98. }
  99.  


Si pero, y la animación? jajjajaja vale vale, la animación la haremos manualmente trabajando con los métodos anteriormente mencionados, setFrame y getFrame. Pero si ya quisiéramos tener una función o método especial que lo haga todo, ya tendríamos que trabajarlo en el objeto Personaje o derivado de Sprite, porque no siempre todos los personajes u objetos visuales tienen el mismo comportamiento. Entonces lo aconsejable es personalizarlos.

En éste caso hemos personalizado un poco la clase PersonajeJugable y le hemos añadido el método anima y también un par de variables para controlar el tiempo de la animación que vendrá determinado por las acciones del teclado.

Código:
  1. import java.awt.event.*;
  2. /**
  3.  * @author whiteskull
  4.  */
  5. public class PersonajeJugable extends Sprite implements KeyListener {
  6.  
  7. private boolean arriba, abajo, izquierda, derecha;
  8. private int cuentaActual,contador;
  9.  
  10. public int actualizar() {
  11. int estado=0; // Indica la orientacion o direccion que toma el PJ
  12. if (contador++>Integer.MAX_VALUE) contador=Integer.MIN_VALUE;
  13. if(arriba ==true) { this.setY(this.getY()-10); estado+=1; }
  14. if(abajo ==true) { this.setY(this.getY()+10); estado+=2; }
  15. if(izquierda==true) { this.setX(this.getX()-10); estado+=4; }
  16. if(derecha ==true) { this.setX(this.getX()+10); estado+=8; }
  17. return estado;
  18. }
  19.  
  20. public void anima(int desde, int hasta, int escala)
  21. {
  22. if (Math.abs(contador-cuentaActual)>escala) {
  23. cuentaActual=contador;
  24. if (this.getFrame()>=hasta) this.setFrame(desde); else
  25. this.setFrame(this.getFrame()+1);
  26. }
  27. }
  28. // tecla sin pulsar
  29. public void keyReleased(KeyEvent e) {
  30. switch (e.getKeyCode()) {
  31. case KeyEvent.VK_DOWN:
  32. abajo = false;
  33. break;
  34. case KeyEvent.VK_UP:
  35. arriba = false;
  36. break;
  37. case KeyEvent.VK_LEFT:
  38. izquierda = false;
  39. break;
  40. case KeyEvent.VK_RIGHT:
  41. derecha = false;
  42. break;
  43. }
  44. }
  45.  
  46. //tecla presionada
  47. public void keyPressed(KeyEvent e) {
  48. switch (e.getKeyCode()) {
  49. case KeyEvent.VK_UP:
  50. arriba = true;
  51. break;
  52. case KeyEvent.VK_LEFT:
  53. izquierda = true;
  54. break;
  55. case KeyEvent.VK_RIGHT:
  56. derecha = true;
  57. break;
  58. case KeyEvent.VK_DOWN:
  59. abajo = true;
  60. break;
  61. }
  62. }
  63.  
  64. public void keyTyped(KeyEvent e) {
  65. throw new UnsupportedOperationException("Not supported yet.");
  66. }
  67. }
  68.  


Entonces ahora lo ideal es que si vamos a crear un personaje protagonista, sería crear una clase específicamente para él, pero que herede todas las propiedades del PersonajeJuagable, por ejemplo así:

Código:
  1. /**
  2.  *
  3.  * @author whiteskull
  4.  */
  5. public class Lorna extends PersonajeJugable {
  6.  
  7. public Lorna()
  8. {
  9. super();
  10. this.setSprite("/Imagenes/lorna_camina1.png");
  11. this.setSprite("/Imagenes/lorna_camina2.png");
  12. this.setSprite("/Imagenes/lorna_camina3.png");
  13. this.setSprite("/Imagenes/lorna_camina4.png");
  14.  
  15. }
  16.  
  17. public void actualiza()
  18. {
  19. if (this.actualizar()>0) this.anima(0,3,3);
  20.  
  21. }
  22.  
  23. }
  24.  


Vemos cómo en el constructor añadimos los fotogramas al protagonista con el setSprite, luego para evitar confusiones, creamos un método actualiza, y al de la clase PersonajeJugable le renombramos su actualiza por actualizar. La clase actualiza del protagonista, será la encargada de capturar las teclas, mover el Sprite y ahora de animarlo siempre que se cumpla la condición que le demos, de lo contrario siempre estaría animado, pero por ejemplo, habrá que acondicionarlo según donde se mueve, si se mueve, si no lo hace, si salta, si reciobe daño, etc... en el caso de nuetsro protagonista mostrará la secuencia de animación mientras el Sprite se mueva en cualquier dirección, actualizar()>0 .

Y para finalizar su uso en el Juego sería así:

Código:
  1.  
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.awt.image.BufferedImage;
  5. /**
  6.  * @author whiteskull
  7.  */
  8. public class juego extends Canvas implements KeyListener {
  9. // TODO code application logic here
  10. private Frame ventana;
  11. private Sprite sprite;
  12. private Lorna lorna;
  13. long tiempo=System.currentTimeMillis();
  14.  
  15. public juego(){
  16. // Declaramos los objetos y los incializamos
  17. ventana=new Frame();
  18. sprite=new Sprite();
  19. lorna=new Lorna();
  20. // Configuramos la ventana
  21. ventana.setSize(350,200);
  22. ventana.add(this);
  23. ventana.setVisible(true);
  24. ventana.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } });
  25. // Configuramos los Sprites
  26. sprite.setSprite("/Imagenes/personaje.png");
  27. sprite.setY(this.getHeight()/2);
  28. lorna.setY(this.getHeight()/2);
  29. // ATENCION ATENCION *************************************************
  30. this.requestFocus(); // Focalizamos hacia nuestro objeto
  31. this.addKeyListener(lorna); // Direccionamos la captura a nuestro Pj
  32. // *******************************************************************
  33. while(true) // BUCLE INFINITO DEL JUEGO
  34. {
  35. if (System.currentTimeMillis()-tiempo>25) { // actualizamos cada 25 milisegundos
  36. lorna.actualiza();
  37.  
  38. if (sprite.getX()>this.getWidth()) sprite.setX(0);
  39. else sprite.setX(sprite.getX()+1);
  40.  
  41. //System.out.println(isCollision(sprite,lorna));
  42. dibuja(this.getGraphics());
  43. tiempo=System.currentTimeMillis();
  44. }
  45. }
  46. }
  47.  
  48. public void dibuja(Graphics grafico)
  49. {
  50. // El Begin de OpenGL o DirectX
  51. BufferedImage pantalla=new BufferedImage(this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB );
  52.  
  53. sprite.putSprite(pantalla.getGraphics(), sprite.getX(), sprite.getY());
  54. lorna.putSprite(pantalla.getGraphics(), lorna.getX(), lorna.getY());
  55.  
  56. // El ENd
  57. grafico.drawImage(pantalla, 0, 0, this);
  58. }
  59.  
  60. public boolean isCollision(Sprite spriteUno,Sprite spriteDos)
  61. {
  62. if (((spriteUno.getX()+spriteUno.getWidth()>spriteDos.getX()) && (spriteDos.getX()+spriteDos.getWidth()>spriteUno.getX()))
  63. && ((spriteUno.getY()+spriteUno.getHeight()>spriteDos.getY()) && (spriteDos.getY()+spriteDos.getHeight()>spriteUno.getY())))
  64. return true;
  65. else return false;
  66. }
  67.  
  68. public void keyTyped(KeyEvent e) {
  69. throw new UnsupportedOperationException("Not supported yet.");
  70. }
  71.  
  72. public void keyPressed(KeyEvent e) {
  73. throw new UnsupportedOperationException("Not supported yet.");
  74. }
  75.  
  76. public void keyReleased(KeyEvent e) {
  77. throw new UnsupportedOperationException("Not supported yet.");
  78. }
  79. }
  80.  


suerte Ok



Ultima edición por WhiteSkull el Jueves 16 Ago 2012 19:32; editado 1 vez
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Nacho5C



Registrado: 13 Nov 2011
Mensajes: 4

Mensaje Publicado: Domingo 13 Nov 2011 14:49

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Buenas, estoy siguiendo tu tutorial para guiarme en como hacer mi proyecto de programaciçon de este cuatrimestre, si quisiera hacer diferentes niveles para el juego, me bastaría con crear una clase nivel e ir modificándola en el juego.java haciéndola más complicada a medida que avanza el juego?

Una pregunta aparte mi idea era hacer una especie de sonic sencillito si es necesario sin enemigos, pero que tuviese que coger ciertos objetos en cierto tiempo y llegar al final del recorrido, es muy complejo hacer un recorrido?

Muchas gracias

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Lunes 14 Nov 2011 00:23

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Nacho escribió:
si quisiera hacer diferentes niveles para el juego, me bastaría con crear una clase nivel e ir modificándola en el juego.java haciéndola más complicada a medida que avanza el juego?


bueno...mmm... digamos que nla clase Nivel sería la que interpreta un nivel, pero dependiendo de la descripción de este. Vamos, es que no se como explicarlo. Yo haría que la clase Nivel tomara unos datos, por ejemplo, me comentas que quieres hacerlo al estilo Sonic, pero sin enemigos, pues entonces sabrás que los niveles contenía bitmaps para el fondo y objetos donde interactuaba el PJ, como los anillos, los muelles que te impulsaban, etc...

Código:
class Nivel
{

...
    BloqueDinamico bloquesD[];
    BloqueStatico bloqueS[];
    Anillo anillos[];
    void actualizar()... // que sería llamado desde el bucle del juego
...


Habría que hacer una clase para éstos objetos, por ejemplo usar la Sprite como base y luego añadirle un comportamiento en base a las circunstancias y acciones del PJ.

Según queramos modificar el nivel, no deberías crear otra clase extra, si no parametrizar la clase, como por ejemplo modificar el número de plataformas, colocar lso anillos en lugares más inaccesibles, etc... entiendes?

Código:
Nivel primerNivel=new Nivel(); // Podriamos añadirle en el constructor el ancho y alto del nivel para impedir que el PJ se saliera fuera, etc...

primerNivel.AñadeAnillo(10,20);
primerNivel.AñadeAnillo(40,50);

Nivel segundoNivel=new Nivel();

segundoNivel.AñadeAnillo(10,20);
segundoNivel.AñadeAnillo(10,20);
segundoNivel.AñadeAnillo(10,20);
segundoNivel.AñadeAnillo(10,20);

segundoNivel.AñadeEnemigo(300,500);
...


Aún así, los niveles sería aconsejado que los realizaras desde un editor, hecho por ti, y que este generara un fichero que luego sería embebido en la aplicación. Luego cargas esos ficheros que representan o describen el nivel desde un método.

Código:
...
segundoNivel.Load("nivel2.map");

...


Espero que hayas captado la idea. Me gustaría haberte puesto un ejemplo más práctico y funcional pero en estos momentos no puedo por falta de tiempo, quizás más adelante siga el hilo y continúe el tutorial, añadiendo por ejemplo el tema de los mapas y niveles, así como sonido, etc...

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Nacho5C



Registrado: 13 Nov 2011
Mensajes: 4

Mensaje Publicado: Miércoles 16 Nov 2011 01:46

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Si se me ha quedado claro la idea y la veo interesante, solo que viendo que esto tiene bastante curro y es un proyecto que debo entregar para el mes que viene creo que me voy a decantar por acabar haciendo una especie de pang y también ponerle niveles, que tengo algún código que me servirá de ayuda, muchísimas gracias, si me surge alguna duda te la postearé aquí si no te importa.

P.D : Felicidades por el tutorial está muy claro y bien hecho.
WhiteSkull escribió:
Nacho escribió:
si quisiera hacer diferentes niveles para el juego, me bastaría con crear una clase nivel e ir modificándola en el juego.java haciéndola más complicada a medida que avanza el juego?


bueno...mmm... digamos que nla clase Nivel sería la que interpreta un nivel, pero dependiendo de la descripción de este. Vamos, es que no se como explicarlo. Yo haría que la clase Nivel tomara unos datos, por ejemplo, me comentas que quieres hacerlo al estilo Sonic, pero sin enemigos, pues entonces sabrás que los niveles contenía bitmaps para el fondo y objetos donde interactuaba el PJ, como los anillos, los muelles que te impulsaban, etc...

Código:
class Nivel
{

...
    BloqueDinamico bloquesD[];
    BloqueStatico bloqueS[];
    Anillo anillos[];
    void actualizar()... // que sería llamado desde el bucle del juego
...


Habría que hacer una clase para éstos objetos, por ejemplo usar la Sprite como base y luego añadirle un comportamiento en base a las circunstancias y acciones del PJ.

Según queramos modificar el nivel, no deberías crear otra clase extra, si no parametrizar la clase, como por ejemplo modificar el número de plataformas, colocar lso anillos en lugares más inaccesibles, etc... entiendes?

Código:
Nivel primerNivel=new Nivel(); // Podriamos añadirle en el constructor el ancho y alto del nivel para impedir que el PJ se saliera fuera, etc...

primerNivel.AñadeAnillo(10,20);
primerNivel.AñadeAnillo(40,50);

Nivel segundoNivel=new Nivel();

segundoNivel.AñadeAnillo(10,20);
segundoNivel.AñadeAnillo(10,20);
segundoNivel.AñadeAnillo(10,20);
segundoNivel.AñadeAnillo(10,20);

segundoNivel.AñadeEnemigo(300,500);
...


Aún así, los niveles sería aconsejado que los realizaras desde un editor, hecho por ti, y que este generara un fichero que luego sería embebido en la aplicación. Luego cargas esos ficheros que representan o describen el nivel desde un método.

Código:
...
segundoNivel.Load("nivel2.map");

...


Espero que hayas captado la idea. Me gustaría haberte puesto un ejemplo más práctico y funcional pero en estos momentos no puedo por falta de tiempo, quizás más adelante siga el hilo y continúe el tutorial, añadiendo por ejemplo el tema de los mapas y niveles, así como sonido, etc...

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Nacho5C



Registrado: 13 Nov 2011
Mensajes: 4

Mensaje Publicado: Martes 22 Nov 2011 22:18

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Hola , te escribo esta duda de un proyecto de un juego que estoy modificando, creo que sería más correcto
enviarla por privado pero debido a que acabo de registrarme en el foro no tengo permisos aún.

El caso es que el juego que estoy modificando es una especie de Pang, y las bolas están dibujadas
mediante el método dibujarCirculo de Java, al igual que el protagonista que está dibujado mediante
métodos del estilo como dibujarRectángulo,Triángulo etc y el fondo del juego es un graphics y se guarda
mediante un image.

1)Entonces lo que yo he intentado conseguir es introducir tu personaje mediante sprite, personaje jugable etc..
de tal forma que pueda usar imágenes en vez que tener que dibujar.

2)También he intentado añadir un fondo mediante un bufferedImage de tal manera que en cada nivel del juego
pueda poner una imagen diferente de fondo.
Pero tampoco he conseguido hacerlo funcionar.

3)Por último también quisiera hacer lo mismo con las bolas del juego, y en vez que tener que dibujarlas
asignarles una imagen.

Las clases en las qué se manejan estos aspectos son:
1) Protagonista, Juego y Ventana
2) Juego y Ventana
3) Bola, Juego y Ventana
Te adjunto el código en un link, ya que es muy extenso para copiarlo.

megaupload.com/?d=OSHJFJ1L

Si es necesario posteo los link, pero como ya digo son bastante extensos

Muchas gracias y entiendo que ya que como dices no es que te sobre el tiempo, agradeceré
cualquier tipo de ayuda que me des por muy pequeña que sea.

Saludos.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Viernes 09 Dic 2011 23:09

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Nacho5C escribió:
...y las bolas están dibujadas
mediante el método dibujarCirculo de Java, al igual que el protagonista que está dibujado mediante
métodos del estilo como dibujarRectángulo,Triángulo etc...
...no esta mal, pero seguro es más sencillo que usaras simples bitmaps.

Nacho5C escribió:
1)Entonces lo que yo he intentado conseguir es introducir tu personaje mediante sprite, personaje jugable etc..
de tal forma que pueda usar imágenes en vez que tener que dibujar.
Y? no es nada difícil, y como puedes apreciar usa métodos sencillos y lógicos.

Nacho5C escribió:
2)También he intentado añadir un fondo mediante un bufferedImage de tal manera que en cada nivel del juego
pueda poner una imagen diferente de fondo.
Pero tampoco he conseguido hacerlo funcionar.
Si vas a utilizar la clase Sprite no necesitas usar bufferImage para poner un fondo, ya que con ella puedes cargar todo tipo de imagen. Más adelante expongo una pequeña demo con scroll horizontal, usando solamente la clase Sprite.

Nacho5C escribió:
3)Por último también quisiera hacer lo mismo con las bolas del juego, y en vez que tener que dibujarlas
asignarles una imagen.
..tan fácil como hacer:

Código:
        Sprite bolaDeFuego=new Sprite();
...
...
        bolaDeFuego.setSprite("/bitmaps/bolaDeFuego.png");
...


Lo que si debes tener en cuenta es el orden con que "pegues" los sprites, dentro del método dibuja(), entre las líneas...
Código:
        BufferedImage pantalla=new BufferedImage(this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB );

        // pegar Sprites aquí

        // El ENd
        grafico.drawImage(pantalla, 0, 0, this);
...
.. ya que los Sprites se dibujaran en ese orden, por lo que el fondo, siempre deberá ir el primero, resto de sprites y por último el interfaz con marcadores de vida, puntos, etc...

Como hacer un scroll sencillo (moviendo un bitmap gigante)

El scroll consiste en el movimiento acompasado del jugador con el fondo, para ello delimitamos zonas en la pantalla que permitirá que eso suceda.

Código:
...
                if (jugador.getX()<80) // indicamos la zona izquierda de la pantalla
                {  // donde comenzaremos a mover el fondo, que se mover en sentido contrario al movimiento del jugador   
                    jugador.setX(Xanterior);
                    fondo.setX(fondo.getX()+jugador.getSteps().x);
                } else if (jugador.getX()>(this.getWidth()-110)) // zona derecha
                {
                    jugador.setX(Xanterior);
                    fondo.setX(fondo.getX()-jugador.getSteps().x);
                }
...


En la demo que incluyo, usé un bitmap gigante, ya que en un ordenador, hoy en día, la memoria no es un impedimento. En dispositivos portátiles, se pueden usar otras técnicas ya mencionadas como es la de usar una matriz de bloques, que consisten en pequeños Sprites. Pero en ambos casos, sigue el mismo principio.

Proyecto (realizado en Netbeans): http://ge.tt/9QjrLzA?c



Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Nacho5C



Registrado: 13 Nov 2011
Mensajes: 4

Mensaje Publicado: Domingo 11 Dic 2011 01:31

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Tengo una duda lo único que yo compruebo la colisión con el disparo o el protagonista mediante los atributos de la clase bola, radio etc
Si cambio la bola dibujada por un sprite como compruebaría esa colisión?

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Domingo 11 Dic 2011 02:53

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Cómo la comprobarías? no entiendo.

Yo por lo menos, incluí una función que funciona en la misma clase del juego, que trabaja con el ancho y alto de un Sprite (fotograma actual), y comprueba si se solapa con otro Sprite especificado. Devuelve True si colisiona, y False si no lo hace. Para su buen funcionamiento, debe ser puesta después de actualizar las coordenadas de los Sprites, osea, después de un actualiza() o un setX()/setY().
Código:
...
public boolean isCollision(Sprite spriteUno,Sprite spriteDos)
    {
        if (((spriteUno.getX()+spriteUno.getWidth()>spriteDos.getX()) && (spriteDos.getX()+spriteDos.getWidth()>spriteUno.getX()))
            && ((spriteUno.getY()+spriteUno.getHeight()>spriteDos.getY()) && (spriteDos.getY()+spriteDos.getHeight()>spriteUno.getY())))
            return true;
        else return false;
    }
...

Pero aparte de esto, hay muchas formas, desde usar una sencilla matriz, leyendo pixeles, por coordenadas, etc...

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Sierra
Usuario Iniciado


Registrado: 10 Ene 2012
Mensajes: 11

Mensaje Publicado: Domingo 15 Ene 2012 03:16

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Hola! Tengo un problemilla con el pintado del personaje y es que me parpadea cuando no esta en movimiento.

Reutilizando tu codigo hice esto:

dibuja( graficosJuego ); //Dibuja la imagen de fondo

for( int i = 0; i< personajes.size(); i++ ) //Vector de personajes
{
graficosJuego = (Graphics2D) this.getGraphics(); //Esta linea comentada hace lo mismo XD
personajes.elementAt(i).putSprite( graficosJuego, personajes.elementAt(i).getX() , personajes.elementAt(i).getY() );
}
if( finJuego )
mensajeFinJuego( graficosJuego );

Gracias de antemano.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Domingo 15 Ene 2012 23:10

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

Te parpadea, porque seguro que estás pintando encima de una imagen o un control... el control o la imagen, se intenta actualizar, bien por un proceso de repintado o el que sea. Por eso aparece ese efecto molesto de parpadeo, por eso para solucionar eso, todo el mundo usa una única pantalla donde trabaja, en ella antes de visualizarla, se dibujan los personajes, los objetos, el fondo, etc... una vez acabado el proceso, se pega la imagen o se vuelca sobre el lienzo o sobre la imagen visualizadora.

A este tipo de pantallas se el denomina "buffer", por eso si observas dentro de la función dibuja... verás que la imagen que uso para pintar y trabajar con ella es pantalla, desde ahí dibujo los sprites.

Código:
  public void dibuja(Graphics grafico)
    {
        // El Begin de OpenGL o DirectX
        BufferedImage pantalla=new BufferedImage(this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB );

        sprite.putSprite(pantalla.getGraphics(), sprite.getX(), sprite.getY());
        lorna.putSprite(pantalla.getGraphics(), lorna.getX(), lorna.getY());
...


Luego vuelco el contenido de pantalla al objeto donde trabajo (this), ya que hereda las características de la clase Canvas, que le permiten visualizar y trabajar adecuadamente con los gráficos.

Código:
....
        // El ENd
        grafico.drawImage(pantalla, 0, 0, this);
    }

Entonces, lo que estás haciendo es lo siguiente; primero llamas a la función dibuja(), que como tienes en el comentario, dibuja la imagen del fondo Risa , luego inicias un bucle y dentro, imprimes i veces (personajes.size() ) un gráfico, perdiendo en cada vuelta el anterior gráfico, de esa forma está produciendo el efecto parpadeo.

Debes trabajar con imagen y luego volcarla, lo ideal es que fuera dentro de dibuja, porque te en cuenta, que podemos modificar las propiedades del personaje desde cualquier parte.

Tu imagina este proceso como cuando vas al teatro, mientras se muestra la escena de un acto, detrás del escenario hay otro que se está decorando, y cuando acaba el acto, moverá el actual para mostrar el que hay detrás, normalmente con la caída del telón.

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Sierra
Usuario Iniciado


Registrado: 10 Ene 2012
Mensajes: 11

Mensaje Publicado: Martes 17 Ene 2012 00:29

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

He puesto un código tal que este pero ahora no me pinta el personaje Triste :


Código:



/***********************************************************************************\

        METODO DE REDIBUJADO DEL PANEL DE JUEGO
       
    \***********************************************************************************/
   
    //Para dibujar la pantalla del juego y manipular su panel grafico
    private void dibujadoJuego()
    {
        anchura = getWidth();
        altura = getHeight();
       
        //Dibujar el contexto actual en la pantalla
        if( imagenJuego == null )
        {
           
            imagenVolatil = cargarImagen( nombreImagen );
       
            if( imagenJuego == null)
            {
                System.out.println( "imagenJuego es nulo" );
                return;
            }
            else
                graficosJuego = (Graphics2D) this.getGraphics();
        }
       
        dibuja( this.getGraphics() );
       
        if( finJuego )
            mensajeFinJuego( this.getGraphics() );
    }
   
   
    //Repintaremos el fondo
    public void dibuja( Graphics g )
    {
        anchura = getHeight();
        altura =  getWidth();
         
        if( imagenJuego != null )
        {
            Graphics2D g2d = (Graphics2D) g;
            dibujar( g2d , 0, 0);
        }
    }
   
   
    //Metodo de dibujado de la imagen
    public void dibujar(Graphics2D g, int x, int y)
    {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
 
        // Antes de que copiemos la VolatileImage, necesitaremos tenerla en buen estado.
        if ( imagenVolatil.validate(gc) != VolatileImage.IMAGE_OK )
        {
            imagenVolatil = crearImagenVolatil( anchura, altura, imagenVolatil.getTransparency() );
            rutina();
        }
 
        g.drawImage( imagenVolatil, 0, 0, imagenVolatil.getWidth(), imagenVolatil.getHeight(), this);
    }
   
   
    //Nos cercioramos de que la imagen esta bien antes de pintar
    public void rutina()
    {
 
        do {
 
            int valido = imagenVolatil.validate(gc);
 
            if ( valido == VolatileImage.IMAGE_INCOMPATIBLE )
            {
                imagenVolatil = crearImagenVolatil( anchura, altura, imagenVolatil.getTransparency() );
            }
 

 
            for( int i = 0; i< personajes.size(); i++ )
            {
                personajes.elementAt(i).putSprite( imagenVolatil.getGraphics(), personajes.elementAt(i).getX() , personajes.elementAt(i).getY() );
            }

        } while ( imagenVolatil.contentsLost());   
    }



Es un poco complicado por que carga una imagenVolatil y verifica que no la hemos perdido antes de dibujarla, lo he puesto como atributo de la clase canvas en vez de crearlo cada vez en el metodo dibuja.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Martes 17 Ene 2012 12:18

Título del mensaje: Re: [JAVA] Bases y demo de un juego sencillo 2D

Responder citando

personajes.elementAt(i).putSprite( imagenVolatil.getGraphics(), personajes.elementAt(i).getX() , personajes.elementAt(i).getY() );

PutSprite() funciona cuando pasas la imagen que va a pintar primeramente con setSprite(), el primer argumento de putSprite() es para indicarle donde lo pinta.

En resumen, debes comprobar dos cosas, que si está pintando sobre el dispositivo del control y si las imagenes que le pasaste a personajes mediante setSprite() contienen algo, bien porque no existe o porque la ruta no es la correcta, date cuenta que es una ruta de clase, ya que supuestamente la imagen debe estár agregada como un recurso.

Para comprobar si está pintando correctamente, prueba sustituir la línea ...

g.drawImage( imagenVolatil, 0, 0, imagenVolatil.getWidth(), imagenVolatil.getHeight(), this);
...por un g.drawLine o similar.

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Responder al Tema Ir a página 1234Siguiente
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 1 Hora

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

EMPLEO ANALISTA PROGRAMADOR/A BACK-END JAVA EE

GRUPOARESTORA Bolsa de trabajo 0 Viernes 23 Jun 2017 13:33 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Juego de gato sencillo en Java

Alan Antonio Java 0 Domingo 13 Nov 2016 02:21 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Dudas sobre un juego que tengo pensado crear

aypheros Programación de juegos o videojuegos 2 Domingo 06 Nov 2016 23:20 Ver último mensaje
El foro no contiene ningún mensaje nuevo

CONEXION JAVA A ANDROID

Toño34r00 Java 3 Domingo 16 Oct 2016 18:41 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Juego Mate-ahorcado

JoxeDuKe12 Programación de juegos o videojuegos 1 Viernes 23 Sep 2016 21:57 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,