elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  problema vectores, allegro.
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: problema vectores, allegro.  (Leído 11,143 veces)
MasterPunk


Desconectado Desconectado

Mensajes: 447


(-A-)


Ver Perfil WWW
problema vectores, allegro.
« en: 4 Enero 2012, 16:11 pm »

Hola, estoy haciendo un juego en c++ con allegro4 (no se lo suficiente de programación, pero así aprendo).

Estoy teniendo un problema al intentar mejorar una parte del codigo que pretendo que haga que el personaje del juego se mueve hacia donde hago clic con el raton en linea recta a velocidad constante.
Las variables posx y posy son la posicion actual del personaje en la pantalla, derx y dery almacenan las coordenadas del ultimo clic y la variable velocidad es la velocidad del personaje(cuanto menor sea la velocidad mas rapido irá).
Codigo antiguo:
Código
  1. while(...){
  2.    contador++;
  3.  
  4.    if( derx!=0 && contador % velocidad == 0)  //en x
  5.        if(posx!=derx)  
  6.            if(posx<derx)
  7.                posx+= 1;
  8.            else
  9.                posx-= 1;
  10.    if( dery!=0 && contador % velocidad == 0)  //en y
  11.        if(posy!=dery)  
  12.            if(posy<dery)
  13.                posy+= 1;
  14.            else
  15.            posy-= 1;
  16. }
  17.  


Con este codigo como podeis ver el recorrido del personaje no es el adecuado. Primero se mueve trazando un angulo de 45º y una vez que una de las coordenadas ha llegado se desplaza en la otra. =S no se como explicarlo pero creo que se entiende con el codigo.
Otro de los problemas de este codigo es que la velocidad con la que se mueve no es continua.

Por ello escribi este otro codigo:
Código
  1. distanciax = derx - posx;
  2. distanciay = dery - posy;
  3. float distancia = distanciax/distanciay;
  4.  
  5. if( derx!=0 && contador % (velocidad*(int)distancia) == 0) //en x
  6.         if(posx!=derx)            
  7.              posx += (int)distancia;
  8.  
  9. if(dery!=0 && contador % velocidad == 0)  //en y
  10.         if(posy!=dery)  
  11.           if(posy<dery)
  12.              posy+= 1;
  13.           else
  14.              posy-= 1;
  15.  

Hasta ahi bien, el problema es que al ejecutarlo el programa deja de responder.

Me podeis echar una mano??
Gracias, MasterPunk


« Última modificación: 4 Enero 2012, 21:54 pm por MasterPunk » En línea

Kherom

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: problema vectores, allegro.
« Respuesta #1 en: 6 Enero 2012, 17:18 pm »

¿El segundo código va dentro de un while? ¿Cuál es la condición de parada?

Así sin mirar mucho el programa no parece que hayas accedido a memoria que no debes por lo que lo normal es que se te cuelgue si entra en bucle infinito.

De todas formas no he hecho mucho caso al código por que me parece raro de cojones, ¿Por qué no te limitas a sumar a la posición un vector velocidad multiplicado por el tiempo entre frames?


En línea

MasterPunk


Desconectado Desconectado

Mensajes: 447


(-A-)


Ver Perfil WWW
Re: problema vectores, allegro.
« Respuesta #2 en: 7 Enero 2012, 02:07 am »

¿El segundo código va dentro de un while? ¿Cuál es la condición de parada?

Así sin mirar mucho el programa no parece que hayas accedido a memoria que no debes por lo que lo normal es que se te cuelgue si entra en bucle infinito.

De todas formas no he hecho mucho caso al código por que me parece raro de cojones, ¿Por qué no te limitas a sumar a la posición un vector velocidad multiplicado por el tiempo entre frames?

El segundo codigo va igual que el primero dentro de un while (!key[KEY_ESC]){...} para que el juego pare cuando se pulse Esc.
El personaje(posx, posy) para cuando llega a la posicion en la que pulsamos(derx, dery)

En este segundo codigo lo que intento es calcular la diferencia de distancia entre el personaje y el destino en el eje x y en el eje y, para calcular la proporcion en la que tienen que aumentar o disminuir las coordenadas del personaje para ir en la direccion correcta.

Aun llevo poco en el mundo de la programacion y esta es la primera vez que intento hacer algo parecido, asi que si sabes hacerlo mas sencillo dime como :P
En línea

SirLanceCC


Desconectado Desconectado

Mensajes: 1.093


Ver Perfil WWW
Re: problema vectores, allegro.
« Respuesta #3 en: 8 Enero 2012, 11:12 am »

Código
  1. distanciax = derx - posx;
  2. distanciay = dery - posy;
  3. float distancia = distanciax/distanciay;

Si dery y posy son iguales, al calcular distancia se produce una división entre cero y el programa termina.
En línea

Kherom

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: problema vectores, allegro.
« Respuesta #4 en: 8 Enero 2012, 16:37 pm »

Lo que yo no entiendo es el por qué de esa división xD Lo lógico sería hacerlo al revés para obtener la tangente...

De todas formas a mí los floats nunca se me han quedado a cero exacto, aunque podría ser.
En línea

MasterPunk


Desconectado Desconectado

Mensajes: 447


(-A-)


Ver Perfil WWW
Re: problema vectores, allegro.
« Respuesta #5 en: 8 Enero 2012, 17:10 pm »

Código
  1. distanciax = derx - posx;
  2. distanciay = dery - posy;
  3. float distancia = distanciax/distanciay;

Si dery y posy son iguales, al calcular distancia se produce una división entre cero y el programa termina.

Eso es! por eso terminaba el programa =D

Lo he arreglado pero la trayectoria del personaje no es la que esperaba TT.TT

Lo intentare plantear de otra manera, gracias Sir

Lo que yo no entiendo es el por qué de esa división xD Lo lógico sería hacerlo al revés para obtener la tangente...

De todas formas a mí los floats nunca se me han quedado a cero exacto, aunque podría ser.

Quizas es porque me pasaba las clases de trigonometria haciendo dibujitos en la mesa jajaja

Es broma, lo intentare plantear mejor. Gracias por la ayuda khenom.
« Última modificación: 8 Enero 2012, 17:12 pm por MasterPunk » En línea

Kherom

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: problema vectores, allegro.
« Respuesta #6 en: 8 Enero 2012, 17:13 pm »

A ver, sacas la tangente, de ahí el ángulo, con el ángulo y el módulo (módulo*cos ang y módulo*sen ang) sacas el vector velocidad y a partir de ahí haces la suma.

Con tu código lo si se mueve es pura casualidad xD
« Última modificación: 8 Enero 2012, 17:15 pm por Kherom » En línea

SirLanceCC


Desconectado Desconectado

Mensajes: 1.093


Ver Perfil WWW
Re: problema vectores, allegro.
« Respuesta #7 en: 8 Enero 2012, 17:53 pm »

Nada de módulos ni cosenos, necesitas trabajar un poco más con vectores.

Tienes la posición de tu personaje en un vector P, y donde haces clic en otro vector D.
Para obtener un vector que vaya de P a D, resta D - P.
Ahora tienes un vector de un tamaño que puede ser cualquiera, para adaptarlo a tus necesidades lo conviertes en vector unitario, lo multiplicas por la velocidad deseada y le llamas V.
Para avanzar sumamos P += V.

Ahora bien, para calcular el vector unitario se divide X y Y entre la longitud del vector y si el vector mide cero estamos en las mismas (fuuuuuu!!!). Para arreglar eso definimos so un vector mide cero su vector unitario es (0,0). Cuando multipliques por la velocidad seguirá siendo (0,0) y cuando actualices P no cambiará su valor, pero de todos modos habrás llegado a tu destino.

Espero que sea de ayuda.
En línea

MasterPunk


Desconectado Desconectado

Mensajes: 447


(-A-)


Ver Perfil WWW
Re: problema vectores, allegro.
« Respuesta #8 en: 8 Enero 2012, 17:54 pm »

Código
  1.      double tangente;
  2.      if(posx != derx)
  3.              tangente = dery - posy/derx - posx;
  4.      else
  5.              tangente = 10; //un valor maximo
  6.      double angulo = atan(tangente);
  7.  
  8.  
  9.      if(contador % velocidad_bacteria == 0){ //para que no se mueva demasiado rapido
  10.  
  11.                 posx += (int)(sin(angulo)*5);
  12.                 posy += (int)(cos(angulo)*5);}

Pero con este codigo...

no se como trabajar con los doubles si los pixeles el numero de pixeles es entero... =S
En línea

MasterPunk


Desconectado Desconectado

Mensajes: 447


(-A-)


Ver Perfil WWW
Re: problema vectores, allegro.
« Respuesta #9 en: 9 Enero 2012, 01:19 am »

Nada de módulos ni cosenos, necesitas trabajar un poco más con vectores.

Tienes la posición de tu personaje en un vector P, y donde haces clic en otro vector D.
Para obtener un vector que vaya de P a D, resta D - P.
Ahora tienes un vector de un tamaño que puede ser cualquiera, para adaptarlo a tus necesidades lo conviertes en vector unitario, lo multiplicas por la velocidad deseada y le llamas V.
Para avanzar sumamos P += V.

Ahora bien, para calcular el vector unitario se divide X y Y entre la longitud del vector y si el vector mide cero estamos en las mismas (fuuuuuu!!!). Para arreglar eso definimos so un vector mide cero su vector unitario es (0,0). Cuando multipliques por la velocidad seguirá siendo (0,0) y cuando actualices P no cambiará su valor, pero de todos modos habrás llegado a tu destino.

Espero que sea de ayuda.

Tienes razon, mejor trabajar con vectores que con 2 variables.
Sobre tu planteamiento...
El vector unitario tiene de modulo 1, por tanto el desplazamiento en x y en y va a ser menor de uno por cada frame, y no puedo desplazarme medios pixeles. Al pasarlo a int va a ser siempre 0. (si no me equivoco).
En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema vectores
Java
kaly 2 3,462 Último mensaje 11 Febrero 2009, 14:12 pm
por kaly
Problema con un code de Allegro « 1 2 »
Programación C/C++
vojok 10 6,487 Último mensaje 25 Julio 2010, 18:55 pm
por vojok
Problema con vectores 3d
Programación General
ABDERRAMAH 4 4,631 Último mensaje 8 Marzo 2011, 12:25 pm
por ABDERRAMAH
Problema con allegro (marcianitos c++)
Programación C/C++
lluk 5 4,285 Último mensaje 15 Mayo 2011, 23:23 pm
por ssaammuu
Problema con Juego en Allegro
Programación C/C++
SNP 0 1,695 Último mensaje 17 Junio 2013, 04:48 am
por SNP
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines