Aprender a programar > C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más
Ejercicio java juego bola rebota contra barra mueve usuario precursor pong atari
manuromero73:
Hola me gustaría recabar ayuda con el ejercicio siguiente en Java.
Arcade retro basics
Debe iniciar un programa con una ventana gráfica que ocupe aproximadamente la mitad de la pantalla del usuario, centrada sobre la misma. La ventana tendrá un panel izquierdo con borde marcado donde tendrá lugar la animación gráfica, que ocupará aproximadamente 4/5 partes de la ventana gráfica. Y un panel derecho con cinco botones: "Iniciar", "Acelerar", "Frenar", "Detener/Continuar" y "Resetear" que será 1/5 parte aproximadamente de la ventana gráfica.
Inicialmente deben aparecer dos elementos gráficos sobre el tablero: uno circular ("la bola") centrado sobre el borde superior del panel de animación o tablero. Otro rectangular ("la barra") centrado sobre el borde inferior del panel de animación o tablero. El comportamiento debe ser el siguiente:
1. Si se pulsa "Iniciar", la bola deberá moverse hacia abajo en una dirección aleatoria con una velocidad inicial predeterminada y avanzar. Si alcanza una pared lateral o la superior, debe rebotar. Si alcanza la parte inferior y choca con la barra, debe rebotar. En cambio si alcanza la parte inferior y no choca con la barra debe detenerse el movimiento y aparecer el mensaje "Game over". Inicialmente la bola va hacia abajo y rebota hacia abajo, con lo cual no podrá volver a la pared superior si antes no ha rebotado en la barra.
2. La barra deberá moverse hacia izquierda o derecha cuando el usuario pulse las teclas del cursor "flecha derecha" (la barra se mueve hacia la derecha mientras pueda. Cuando alcanza la pared, ya no se puede mover más.) o "flecha izquierda" (idem pero hacia la izquierda). De esta manera, el jugador tiene que intentar que la bola rebote en la barra para seguir jugando. Si no lo logra, llega al game over y termina el juego (aunque podrá iniciar otro juego pulsando en iniciar).
3. Si se pulsa "Acelerar" la bola incrementa su velocidad. Sucesivas pulsaciones generarán nuevos incrementos de velocidad hasta el valor tope que se determine.
4. Si se pulsa "Frenar" el comportamiento es análogo al de acelerar, pero en este caso disminuyendo la velocidad hasta el valor límite que se determine.
5. Si se pulsa "Detener/Continuar" la bola quedará quieta (detener) o reanudará su movimiento si estaba quieta (continuar)
6. Si se pulsa "Resetear" se vuelve al estado inicial (bola y barra centradas sobre el panel de animación y a la espera de que se pulse un botón).
Las pulsaciones sin sentido no generarán ninguna respuesta. Por ejemplo si la bola no ha iniciado su movimiento o si está en pausa, al pulsar en acelerar no habrá ninguna respuesta puesto que no se puede acelerar. Si se pulsa detener/continuar antes de "Iniciar" no habrá respuesta, etc.
Deberá realizar un diseño orientado a objetos con las clases que estime oportunas respetando siempre:
a) Que exista orientación a objetos (distintas clases con distintas responsabilidades)
b) Funcionalidad: un elemento circular que se mueve por la pantalla y rebota en los bordes.
Kabuto:
Hola.
De momento olvida la bola y céntrate en intentar representar la barra y su movimiento.
Quisiera hacer yo un intento, pero no se cuándo podré, no tengo tiempo ni para cag..., digo.., pensar... ::)
YoanPupo:
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
YoanPupo:
Aun necesitas ayuda?
manuromero73:
HOla, sí, sigo interesado en poder resolver esto pero no tengo nivel de programacion suficiente en cuanto a codigo y también en cuanto a conceptos como tomar el control del renderizado o vectorVelocidad creo que hay partes matematicas que no son faciles
Navegación
[#] Página Siguiente
Ir a la versión completa