
Ayuda con animacion interactiva Java (tiro vertical)
Publicado por KuroNeko (2 intervenciones) el 19/11/2016 22:35:18
Mucho gusto, soy un programador novato, realmente novato; pero con gran deseo de aprender, por lo que apreciaria enormemente sus consejos.
Como no podia ser de otra manera, decidi comenzar mi aprendizaje con un lenguaje tan "amigable" a los recien llegados como java, y con un tema tan motivador como lo son los videojuegos.
Realmente no pretendo hacer nada inovador ni vistoso, solo deseo comprender como crear y ensamblar cada una de las piezas que conforman un programa.
En este caso seria un juego bastante basico, un personaje dibujado en dos dimensiones, moviendose unidimensionalmente (de manera horizontal) y saltando cuando sea necesario para sortear obstaculos y atacar a los enemigos.
Es alli donde me han surgido dudas; en este caso, asumi que la mejor manera de hacer que mi personaje brincara seria utilizando la formula fisica del tiro vertical (yf = y0 + v0*t + a*(t*t)/2) , sin embargo, antes de codificarla en el programa decidi hacer una prueba con una matriz unidimensinal, la cual deberia representar los aumentos en el eje y en cada instante del movimiento hacia arriba.
Sin embargo, a la hora de correr el programa, este muestra toda clase de comportamientos: mi modelo de personaje (una simple circunferencia azul) no para su movimiento hacia arriba, de detiene en el punto y-maximo para luego invertir su movimiento hacia abajo sin detenerse, se mueve tan solo una posicion hacia arriba, rebota sin parar, etc.
En vez de usar hilos (entiendo su estructura e implementacion, pero aun no los comprendo del todo) estoy utilizando un timer que actualiza las coordenadas del "personaje" cada 20 milisegundos, y en su correspondiente funcion ActionListener se midifican las coordenadas de los objetos que luego se dibujaran en el objeto g de la funcion paint.
El programa se compone de 2 clases (la que dibuja el canvas, que es donde todo ocurre, y la ventana (JFrame) que contiene y despliega en pantalla el "juego".
El codigo es el siguiente:
Para el canvas:
//Importando las librerias
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;
//Inicia la clase, hereda canvas y recibe eventos del temporizador
public class pruebaMovimiento extends Canvas implements ActionListener
{
int x = 200, y = 3, yT = 0; //Declaracion de las variables de posicion deo objeto,
int ancho, alto; //los diferenciales del movimiento y la condicion boleana
int i = 0; // para que se de el salto
boolean salto = false;
int[] valoresSalto; // se declara el arreglo con los valores en y del salto
Timer temporizador;
Graphics graficoBuffer;
Image imgBuffer;
public pruebaMovimiento()
{
//se declara el arreglo que contiene los valores sucesivos en y al realizar el movimiento de salto
this.valoresSalto = new int[]{-50, -30, -10, -5,0,5,10,30,50};
this.setSize(700,460);
this.setBackground(Color.WHITE);
this.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e)
{
int tecla = e.getKeyCode();
switch(tecla)
{
//Si se presiona la tecla arriba la variable salto indica que el personaje debe realizar un
//movimiento
case KeyEvent.VK_UP:
salto = true;
break;
case KeyEvent.VK_RIGHT:
xT = 10;
break;
case KeyEvent.VK_LEFT:
xT = -10;
break;
}
}
public void keyReleased(KeyEvent e)
{
int tecla = e.getKeyCode();
switch(tecla)
{
case KeyEvent.VK_UP:
{}
case KeyEvent.VK_RIGHT:
xT = 0;
break;
case KeyEvent.VK_LEFT:
xT = 0;
break;
}
}
});
//Se agrega el temporizador
temporizador = new Timer(20, this);
temporizador.start();
setFocusable(true);
}
// se inicia el bloque paint
public void paint(Graphics g)
{
ancho = this.getWidth();
alto = this.getHeight();
imgBuffer = createImage(ancho,alto);
graficoBuffer = imgBuffer.getGraphics();
graficoBuffer.setColor(Color.BLUE);
graficoBuffer.fillOval(x,y,30,30);
g.drawImage(imgBuffer,0,0,this);
}
//bloque necesario para el doble buffer
public void update(Graphics g)
{
paint(g);
}
//en este bloque se calculan las coordenadas del personaje en cada momento.
@Override
public void actionPerformed(ActionEvent e)
{
x += xT; Se calcula la coordenada x del personaje
/*aqui deberia estar el error; si el boton arriba se presiona, entonces salto es verdadera y se ejecuta el bucle while, iterando a traves cada una de las posiciones del arreglo Valores salto, sumandoselas sucesivamente a la variable y (responsable del movimiento vertical) en cada cambio del timer, aumentando ademas la variable indice i, fialmente, cuando se ha iterado por los 9 elementos, comprueba si i es igual a 9 (valor que excede el numero de elementos del arreglo), y de ser asi, la variable i cambia su valor a 0 (lista para un nuevo salto), y la variable booleana salto cambia su valor a falso, con lo que el bucle deberia de dejar de ejecutarse*/
if(salto){
while( salto == true)
{
y += valoresSalto[i];
i++;
if( i == 9)
{
i = 0;
salto = false;
}
}
}
if((x + xT) <= 0 ) //esto si marcha bien
x = 0;
else if((x +xT) >= ancho-30)
x = ancho-30;
repaint();
}
}
Espero no haberme extendido demasiado, en verdad he repasado bastante el codigo y no entiendo cual es el error, espero ke alguien le pueda dar un vistazo y se anime a compartir lo que pienza; cualquier sugerencia es bienvenida.
Saludos
Como no podia ser de otra manera, decidi comenzar mi aprendizaje con un lenguaje tan "amigable" a los recien llegados como java, y con un tema tan motivador como lo son los videojuegos.
Realmente no pretendo hacer nada inovador ni vistoso, solo deseo comprender como crear y ensamblar cada una de las piezas que conforman un programa.
En este caso seria un juego bastante basico, un personaje dibujado en dos dimensiones, moviendose unidimensionalmente (de manera horizontal) y saltando cuando sea necesario para sortear obstaculos y atacar a los enemigos.
Es alli donde me han surgido dudas; en este caso, asumi que la mejor manera de hacer que mi personaje brincara seria utilizando la formula fisica del tiro vertical (yf = y0 + v0*t + a*(t*t)/2) , sin embargo, antes de codificarla en el programa decidi hacer una prueba con una matriz unidimensinal, la cual deberia representar los aumentos en el eje y en cada instante del movimiento hacia arriba.
Sin embargo, a la hora de correr el programa, este muestra toda clase de comportamientos: mi modelo de personaje (una simple circunferencia azul) no para su movimiento hacia arriba, de detiene en el punto y-maximo para luego invertir su movimiento hacia abajo sin detenerse, se mueve tan solo una posicion hacia arriba, rebota sin parar, etc.
En vez de usar hilos (entiendo su estructura e implementacion, pero aun no los comprendo del todo) estoy utilizando un timer que actualiza las coordenadas del "personaje" cada 20 milisegundos, y en su correspondiente funcion ActionListener se midifican las coordenadas de los objetos que luego se dibujaran en el objeto g de la funcion paint.
El programa se compone de 2 clases (la que dibuja el canvas, que es donde todo ocurre, y la ventana (JFrame) que contiene y despliega en pantalla el "juego".
El codigo es el siguiente:
Para el canvas:
//Importando las librerias
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;
//Inicia la clase, hereda canvas y recibe eventos del temporizador
public class pruebaMovimiento extends Canvas implements ActionListener
{
int x = 200, y = 3, yT = 0; //Declaracion de las variables de posicion deo objeto,
int ancho, alto; //los diferenciales del movimiento y la condicion boleana
int i = 0; // para que se de el salto
boolean salto = false;
int[] valoresSalto; // se declara el arreglo con los valores en y del salto
Timer temporizador;
Graphics graficoBuffer;
Image imgBuffer;
public pruebaMovimiento()
{
//se declara el arreglo que contiene los valores sucesivos en y al realizar el movimiento de salto
this.valoresSalto = new int[]{-50, -30, -10, -5,0,5,10,30,50};
this.setSize(700,460);
this.setBackground(Color.WHITE);
this.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e)
{
int tecla = e.getKeyCode();
switch(tecla)
{
//Si se presiona la tecla arriba la variable salto indica que el personaje debe realizar un
//movimiento
case KeyEvent.VK_UP:
salto = true;
break;
case KeyEvent.VK_RIGHT:
xT = 10;
break;
case KeyEvent.VK_LEFT:
xT = -10;
break;
}
}
public void keyReleased(KeyEvent e)
{
int tecla = e.getKeyCode();
switch(tecla)
{
case KeyEvent.VK_UP:
{}
case KeyEvent.VK_RIGHT:
xT = 0;
break;
case KeyEvent.VK_LEFT:
xT = 0;
break;
}
}
});
//Se agrega el temporizador
temporizador = new Timer(20, this);
temporizador.start();
setFocusable(true);
}
// se inicia el bloque paint
public void paint(Graphics g)
{
ancho = this.getWidth();
alto = this.getHeight();
imgBuffer = createImage(ancho,alto);
graficoBuffer = imgBuffer.getGraphics();
graficoBuffer.setColor(Color.BLUE);
graficoBuffer.fillOval(x,y,30,30);
g.drawImage(imgBuffer,0,0,this);
}
//bloque necesario para el doble buffer
public void update(Graphics g)
{
paint(g);
}
//en este bloque se calculan las coordenadas del personaje en cada momento.
@Override
public void actionPerformed(ActionEvent e)
{
x += xT; Se calcula la coordenada x del personaje
/*aqui deberia estar el error; si el boton arriba se presiona, entonces salto es verdadera y se ejecuta el bucle while, iterando a traves cada una de las posiciones del arreglo Valores salto, sumandoselas sucesivamente a la variable y (responsable del movimiento vertical) en cada cambio del timer, aumentando ademas la variable indice i, fialmente, cuando se ha iterado por los 9 elementos, comprueba si i es igual a 9 (valor que excede el numero de elementos del arreglo), y de ser asi, la variable i cambia su valor a 0 (lista para un nuevo salto), y la variable booleana salto cambia su valor a falso, con lo que el bucle deberia de dejar de ejecutarse*/
if(salto){
while( salto == true)
{
y += valoresSalto[i];
i++;
if( i == 9)
{
i = 0;
salto = false;
}
}
}
if((x + xT) <= 0 ) //esto si marcha bien
x = 0;
else if((x +xT) >= ancho-30)
x = ancho-30;
repaint();
}
}
Espero no haberme extendido demasiado, en verdad he repasado bastante el codigo y no entiendo cual es el error, espero ke alguien le pueda dar un vistazo y se anime a compartir lo que pienza; cualquier sugerencia es bienvenida.
Saludos
Valora esta pregunta


0