• Miércoles 6 de Noviembre de 2024, 01:06

Autor Tema:  Pregunta Juego 2d  (Leído 3428 veces)

luzop

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
    • http://www.mycgiserver.com/~luisopazo
Pregunta Juego 2d
« en: Sábado 22 de Enero de 2005, 22:37 »
0
Hola.

Pienso hacer un pequeño juego 2D (nunca he hecho
nada antes)



Pero antes que nada, quiero hacer una prueba con el asunto de las colisiones, y ahi
es donde me gustaría algunos consejos/opiniones/links/etc.

Pienso utilizar un rectangulo para representar mi personaje, y para ver si intersecta el piso, pienso hacer un test "caja móvil / linea " , es decir, hayar el
primer tiempo de  colision entre la caja y todas las lineas que representan el piso.



Para mover el personaje pienso usar el clásico:

fuerza - roce = masa * acel;
velocidad += acel * delta_tiempo
posicion += velocidad * delta_tiempo

(en donde fuerza se actualiza segun las teclas de movimiento)

..bueno, de eso se trata el primer test que quiero hacer.

algún consejo ?? (lo voy a hacer en java)

gracias.

xplod

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Pregunta Juego 2d
« Respuesta #1 en: Miércoles 26 de Enero de 2005, 02:13 »
0
Luzop:

Antes que nada permíteme felicitarte por tomar la decisión de adentrarte en esta "onda" de lo videojuegos.

Con respecto a lo de tu pregunta temo no poder ayudarte mucho con el código, pues no conozco el lenguage de Java muy bien (estoy más orientado a hacer este tipo de cosas en Flash); pero te puedo dar alguno que otro consejo:

Bueno con lo del asunto de las colisiones, en muchos lenguajes de programación existe una instrucción donde un "objeto interactúa cuando choque con otro" (hitTest en Flash); esta instrucción debe de ir dentro de alguna condicionante (if) que se este actualizando constantemente.

Por ejemplo:

if (_root.circulo.hitTest(_root.cuadro)==true)
{
_root.circulo._x -= 1;
}

En cuanto lo del personaje y los juegos en 2D se refiere déjame decirte que no debes aplicar el código al personaje: el personaje realmente nunca se mueve (o lo hace muy poco); es el "escenario" en sí el que lo hace. Así que para crear la sensación de movimiento debes aplicar tus fórmulas para que el escenario "avance" y crear el código para controlar la animación de tu personaje "que camina" y así crear la ilusión de desplazamiento por "tu mundo virtual".

(A lo mejor esto va de más, porque realmente no sé a que grado de realismo y complejidad deseas hacer tu juego). Creo que antes que nada es preciso darle vida a tu personaje poniendole un "objetivo" y "dificultades" (historia tal vez), esto con el fin de que si en algún momento quieres compartirlo, cree un cierto grado de interés y ¿por que no? hasta adicción.

Espero no haberte hecho "bolas" con este rollo y que te sirva de algo...

Xplod

luzop

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
    • http://www.mycgiserver.com/~luisopazo
Re: Pregunta Juego 2d
« Respuesta #2 en: Miércoles 26 de Enero de 2005, 22:26 »
0
Gracias.

Bueno, con respecto a lo de "mover el escenario" , me estoy basando en algunas explicaciones de un libro que me conseguí. Ya sabía que algo tendría que hacer al
respecto ( "four-way scrolling"  le llama el autor). Pero lo estaba dejando para
mas adelante, despues de que tenga claro el asunto de las intersecciones.

El ejemplo del libro usa "tiles", pero yo no quiero usar esa metodología. Quiero
hacer algo estilo mario bros ( ojala!  ) B) .

Quiero que el personaje se deslize por pendientes automaticamte, y que haga
una pequeña aceleración/desaceleración al momento de "soltar/presionar" las
 teclas de movimiento.

Estoy haciendo un pequeño test. Como mensioné antes, hago intersección
caja/lineas y el cuento de la física.



en realida quería saber si hay alguna "tecnica" común para mover personajes de este tipo , y que es mas facil, usar test geométricos o chequear si los pixels de el personaje y el "escenario" se intersectan y luego reacomodar el personaje de algún modo (como tu código). Aunque que con esto último no se me ocurre una
manera fácil de hacer lo que dije antes (aceleracion ...etc).

Estoy haciendo esto :ph34r:  :

Código: Text
  1.  
  2.   float prev_x = box.getX();
  3.     float prev_y = box.getY();
  4.    
  5.     box.update(dt);
  6.    
  7.     float box_x=box.getX();
  8.     float box_y=box.getY();
  9.    
  10.     float dir_x = box_x-prev_x;
  11.     float dir_y = box_y-prev_y;
  12.    
  13.     float min_x= box_x;
  14.     float min_y= box_y - box.getHeight();
  15.    
  16.     float max_x = box_x+box.getWidth();
  17.     float max_y = box_y;
  18.    
  19.     float tInter = Tools.POSITIVE_INFINITY;
  20.     float normal_x=0;
  21.     float normal_y=1;
  22.     float[] normal_temp=new float[2];
  23.    
  24.     // AABB con  cada vertice del piso.
  25.     // Tiro un rayo en la dirección contraria al movimiento de la caja
  26.     // con origen en los vertices de cada linea y lo intersecto con la caja
  27.     for(int i=0; i<lineas.length&#59; i+=2){
  28.       float t = Tools.int_AABB_Rayo(min_x , min_y,
  29.                        max_x , max_y,
  30.                        lineas[i],lineas[i+1],
  31.                       -dir_x , -dir_y ,
  32.                       normal_temp );
  33.       if( t!=Tools.POSITIVE_INFINITY && t < tInter ){
  34.         tInter = t;
  35.         normal_x = normal_temp[0];
  36.         normal_y = normal_temp[1];
  37.       }
  38.    
  39.     }
  40.  
  41.     // Cada vertice del AABB con las líneas del piso.
  42.     // Tiro un rayo en la direccion de movimiento de la caja
  43.     // con origen en cada vertice de la caja y lo intersecto con
  44.     // las lineas del piso
  45.     for(int i=0,c=0; i<lineas.length&#59; i+=4,c++){
  46.      
  47.       float t;
  48.      
  49.       // Vertice top,left
  50.       t = Tools.int_Rayo_Linea_Eberly(lineas[i],lineas[i+1],
  51.                     lineas[i+2],lineas[i+3],
  52.                     dir_x,dir_y,
  53.                     box_x,box_y);
  54.      
  55.       if( t!=Tools.POSITIVE_INFINITY && t < tInter){
  56.         tInter = t;
  57.         normal_x = normales[c][0];
  58.         normal_y = normales[c][1];
  59.       }                    
  60.      
  61.       // vertice top,right                
  62.       t = Tools.int_Rayo_Linea_Eberly(lineas[i],lineas[i+1],
  63.                  lineas[i+2],lineas[i+3],
  64.                  dir_x,dir_y,
  65.                  box_x+box.getWidth(),box_y);
  66.      
  67.       if( t!=Tools.POSITIVE_INFINITY && t < tInter){
  68.         tInter = t;
  69.         normal_x = normales[c][0];
  70.         normal_y = normales[c][1];
  71.       }                
  72.      
  73.       // vertice bottom,right                
  74.       t = Tools.int_Rayo_Linea_Eberly(lineas[i],lineas[i+1],
  75.                  lineas[i+2],lineas[i+3],
  76.                  dir_x,dir_y,
  77.                  box_x+box.getWidth(),box_y-box.getHeight());
  78.      
  79.       if( t!=Tools.POSITIVE_INFINITY && t < tInter){
  80.         tInter = t;
  81.         normal_x = normales[c][0];
  82.         normal_y = normales[c][1];
  83.       }
  84.      
  85.       // vertice bottom,left                
  86.       t = Tools.int_Rayo_Linea_Eberly(lineas[i],lineas[i+1],
  87.                  lineas[i+2],lineas[i+3],
  88.                  dir_x,dir_y,
  89.                  box_x,box_y-box.getHeight());                
  90.      
  91.       if( t!=Tools.POSITIVE_INFINITY && t < tInter){
  92.         tInter = t;
  93.         normal_x = normales[c][0];
  94.         normal_y = normales[c][1];
  95.       }
  96.     }
  97.    
  98.     // este es el "sliding". Aquí estoy teniedo problemas :P
  99.     if( tInter != Tools.POSITIVE_INFINITY ){
  100.       float Q_x = prev_x + dir_x*tInter;
  101.       float Q_y = prev_y + dir_y*tInter;
  102.       float dot = ((box_x-Q_x)*normal_x) + ((box_y-Q_y)*normal_y);
  103.       int final_x = (int)(box_x - normal_x*dot);
  104.       int final_y = (int)(box_y - normal_y*dot);
  105.      
  106.       box.setX(final_x);
  107.       box.setY(final_y);
  108.                            //quizas aqui correr de nuevo el algoritmo
  109.       return;
  110.     }
  111.  
  112.  

Para moverlo uso esto  :blink:

Código: Text
  1.  
  2. public class EulerBody{
  3.  
  4.   protected float MAG_GRAVEDAD = 75f;
  5.     protected float MAG_ROCE = 5;
  6.     protected float MAG_FUERZA = 45;//26;
  7.     protected final float EPSILON = 1E-005F;
  8.    
  9.     protected float pos_x,pos_y;
  10.     protected float vel_x,vel_y;
  11.     protected float acel_x,acel_y;
  12.     protected float fuerza_x,fuerza_y;
  13.  
  14.  
  15.   public void update(float dt)
  16.     {
  17.       fuerza_y -= MAG_GRAVEDAD;
  18.      
  19.       // f_roce = dir_velocidad*mag_roce
  20.       float f_roce_x,f_roce_y;
  21.       f_roce_x = vel_x * MAG_ROCE;
  22.       f_roce_y = vel_y * MAG_ROCE;
  23.      
  24.         // acel = (fuerza - f_roce)/masa &#59; masa = 1
  25.         acel_x = fuerza_x - f_roce_x;
  26.         acel_y = fuerza_y - f_roce_y;
  27.        
  28.     //vel += acel * dt
  29.     vel_x += acel_x * dt;
  30.     vel_y += acel_y * dt;
  31.        
  32.         // fuerza=0
  33.         fuerza_x=0;
  34.         fuerza_y=0;
  35.        
  36.         if( Math.sqrt(vel_x*vel_x + vel_y*vel_y)  < EPSILON){
  37.           vel_x = 0;
  38.           vel_y = 0;
  39.         }
  40.         else{
  41.           pos_x += vel_x * dt;
  42.           pos_y += vel_y * dt;
  43.         }
  44.     }
  45.    
  46.     public void apply_XForce(float fx){
  47.       fuerza_x += fx;
  48.     }
  49.     public void apply_YForce(float fy){
  50.       fuerza_y += fy;
  51.     }
  52.  
  53. }
  54.  
  55.  

Bueno, cualquier cosa gracias.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Pregunta Juego 2d
« Respuesta #3 en: Miércoles 26 de Enero de 2005, 22:32 »
0
Citar
El ejemplo del libro usa "tiles", pero yo no quiero usar esa metodología. Quiero
hacer algo estilo mario bros ( ojala! ) cool.gif

MARIO BROS USA TILES,
DKC USA TILES
PRACTICAMENTE TODOS LOOS JUEGOS DE SCROLL USAN TILES.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

luzop

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
    • http://www.mycgiserver.com/~luisopazo
Re: Pregunta Juego 2d
« Respuesta #4 en: Miércoles 26 de Enero de 2005, 23:05 »
0
Citar
MARIO BROS USA TILES,

ba! disculpas.
( En todo caso me refería al "Super mario world" ...igual usa tiles ?? ...ni idea  ).

Saludos.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Pregunta Juego 2d
« Respuesta #5 en: Miércoles 26 de Enero de 2005, 23:10 »
0
Si =
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

hitman47

  • Miembro activo
  • **
  • Mensajes: 81
  • Nacionalidad: pa
    • Ver Perfil
    • http://softwareistmenio.blogspot.com
Re: Pregunta Juego 2d
« Respuesta #6 en: Jueves 27 de Enero de 2005, 05:39 »
0
hola luzop una opcion q tienes para hacer el juego puede ser el usar games engines para java o librerias y paquetes personalizados q hay por la red como el java3D y la clase CANVAS etc. tambien
en la pagina de java sun hay un par de tuto sobre juegos a pantalla completa.

salu2.

luzop

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
    • http://www.mycgiserver.com/~luisopazo
Re: Pregunta Juego 2d
« Respuesta #7 en: Jueves 27 de Enero de 2005, 15:16 »
0
ok, gracias.