Java - Ayuda con animacion interactiva Java (tiro vertical)

 
Vista:
Imágen de perfil de KuroNeko

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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con animacion interactiva Java (tiro vertical)

Publicado por Tom (1627 intervenciones) el 20/11/2016 20:32:23
Lo que has pegado no compila.

Pero prueba a quitar el while en:

1
2
3
4
5
6
7
8
9
10
11
12
while( salto == true)
{
y += valoresSalto[i];
 
i++;
 
if( i == 9)
{
i = 0;
salto = false;
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de KuroNeko

Ayuda con animacion interactiva Java (tiro vertical)

Publicado por KuroNeko (2 intervenciones) el 21/11/2016 01:12:19
Muchas gracias... es correcto...es que no agregue el listado de el Jframe para no extender mas el post... elimine el while y ahora realiza justo lo que deseaba que hiciera....

Asunto solucionado!!!!!... espero que le pueda servir de apoyo a alguien mas.....

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar