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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  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,171 veces)
Kherom

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: problema vectores, allegro.
« Respuesta #10 en: 9 Enero 2012, 02:16 am »

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).

Él te dice que saques el vector unitario y luego lo multipliques por la velocidad que desees. Por otro lado un entero se redondea siempre a 0, pero si mantienes las variables de la posición como float los pequeños incrementos se irán acumulando y avanzará el píxel en cuanto llegue. Así que deberías trabajar siempre con floats y hacer el cast en el momento de dibujar.

En cualquier caso yo haría algo así (Puede que haya errores, ahora no puedo probar, sólo tengo el bloc de notas xD):

Código
  1. float tan, ang, vx, vy, velocidad; //Deberias pasar todo a floats
  2.  
  3.  
  4. if (posx==derx && posy==dery) // Ponemos la velocidad a 0 cuando alcanzamos la posicion (Creo que seria conveniente hacer algo como if( posx>(derx-0.001)&&posx<(derx+0.001) && posy>(dery-0.001)&&posy<(dery+0.001) )por la posible imprecision que tienen los float
  5. {
  6. vx=0;
  7. vy=0;
  8. }
  9. else
  10. {
  11. if (derx-posx==0) //Si no hay x la velocidad esta en y
  12. {
  13. vx=0;
  14. if(dery-posy>0) //Si esta por encima
  15. vy=velocidad;
  16. else
  17. VY=-velocidad;
  18. }
  19. else
  20. {
  21. tan= (dery-posy)/(derx-posx) //No te olvides de los parentesis
  22. ang=(float)atan((double)tan);//Según cómo lo hagas deberías tener en cuenta si la velocidad es positiva o negativa, no me apetece poner los if ahora xD
  23. vy = (sin(angulo)*velocidad);
  24. vx = (cos(angulo)*velocidad); //creo que los cast son automaticos, si no los pones, también se podrian quitar en la atan ya que creo que sale sólo un warning, pero no estoy seguro (no lo puedo comprobar ahora)
  25. }
  26. }
  27.  
  28. //Todo lo anterior debería ejecutarse sólo una vez al hacer clik, luego sólo tendrías que comprobar si ya ha llegado al final para poner la velocidad a 0.
  29.  
  30. posy+=vy;
  31. posx+=vx;
  32.  

La opción del vector unitario también está bien pero pierdes la opción de mover el personaje con las teclas al no tener la dirección, con éste método le das un ángulo en radianes y se va moviendo.

En cuanto a lo de que no se mueva demasiado rápido lo que tienes que hacer es 1º jugar con el valor que le das a la velocidad y sobre todo tener en cuenta que el framerrate puede variar sobre según el equipo, así que deberías calcular los ms entre frame y frame para adaptarla.

Algo tipo

Código
  1. posy+=vy*msTranscurridos;
  2. posx+=vx*msTranscurridos;
  3.  

Siendo msTrancurridos el tiempo que ha pasado desde el último frame. Otra opción es dejar el framerrate fijo (haciendo que el código sólo se ejecute cada x milisegundos) y olvidar ésto, pero en equipos lentos además de reducir el framerate se reducirá la velocidad.


« Última modificación: 9 Enero 2012, 02:33 am por Kherom » En línea

MasterPunk


Desconectado Desconectado

Mensajes: 447


(-A-)


Ver Perfil WWW
Re: problema vectores, allegro.
« Respuesta #11 en: 10 Enero 2012, 22:45 pm »

Algo parecido habia intentado yo, pero hay un problemilla:

posx y posy deben ser enteros para poder mostrar el grafico del personaje:

Código
  1. void putpixel(BITMAP *bmp, int x, int y, int color); //si, dibujo al personaje en pantalla pixel a pixel...  :rolleyes:

El codigo que has puesto seria perfecto si la pantalla fuera mas grande, pero siendo como es la velocidad perfecta es de 0,1 o 0,2 pixeles por frame.

Código
  1. float velocidad = 0.2;
  2. posx += (int)velocidad;

El personaje no se mueve. Por ello he utilizado el contador, para movel el personaje cada v frames, siendo v la velocidad.

Por lo demas todo perfecto, voy a arreglar y a probar el codigo. Gracias.


En línea

Kherom

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: problema vectores, allegro.
« Respuesta #12 en: 10 Enero 2012, 23:23 pm »

A ver:

float posxf=0;

posxf+=0.2;
putpixel(BITMAP *bmp, posf, int y, int color);

No hace nada.

posxf+=0.2;
putpixel(BITMAP *bmp, posf, int y, int color);

No hace nada.

posxf+=0.2;
putpixel(BITMAP *bmp, posf, int y, int color);

No hace nada.

posxf+=0.2;
putpixel(BITMAP *bmp, posf, int y, int color);
No hace nada.

posxf+=0.2;
putpixel(BITMAP *bmp, posf, int y, int color);

Avanza un píxel (posf ahora con el cast vale 1, antes 0).

Así es como lo tienes que hacer, vas sumando la posición al float y luego se lo pasas a la función que lo dibuje como entero, los decimales se desprecian pero cada x frames avanza un píxel. De ese modo no te tienes que preocupar por qué valores das a la velocidad, ya se moverá cuando se tenga que mover.

Al pasarle el float a la función, que acepta enteros, hará automáticamente un cast, asi que no te tienes que preocupar. Si quieres evitar el warning haz el cast a mano al pasar el argumento ( (int)posxf );
« Última modificación: 10 Enero 2012, 23:30 pm por Kherom » En línea

MasterPunk


Desconectado Desconectado

Mensajes: 447


(-A-)


Ver Perfil WWW
Re: problema vectores, allegro.
« Respuesta #13 en: 11 Enero 2012, 00:30 am »



Muahahaha, 200 warnings pero funciona =D
Que alegria, asi debia sentirse dios cuando le dijeron como compilar el mundo xD

Que funcione es lo de menos, lo importante es que en este post me habeis enseñado varias cosas que tenia que saber.
Muchas gracias por la ayuda ;)
En línea

Kherom

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: problema vectores, allegro.
« Respuesta #14 en: 11 Enero 2012, 01:07 am »

Si haces el cast a int a mano
Código:
función( (int)numeroflotante )
evitarás los warnings, ya que para lo único que sirven en éste caso es para indicar una posible pérdida de precisión, que es justamente lo que andas buscando.

De todas formas ahora que me fijo, para que tengas tantos warnings, ¿Llamas a la función una vez por píxel A MANO? xD
« Última modificación: 11 Enero 2012, 01:15 am por Kherom » En línea

MasterPunk


Desconectado Desconectado

Mensajes: 447


(-A-)


Ver Perfil WWW
Re: problema vectores, allegro.
« Respuesta #15 en: 11 Enero 2012, 02:25 am »

Si haces el cast a int a mano
Código:
función( (int)numeroflotante )
evitarás los warnings, ya que para lo único que sirven en éste caso es para indicar una posible pérdida de precisión, que es justamente lo que andas buscando.

De todas formas ahora que me fijo, para que tengas tantos warnings, ¿Llamas a la función una vez por píxel A MANO? xD

Si, lo e los warnings ya lo he arreglado, que para eso esta la herramienta remplazar :P

Es una p***da que en allegro 4 no se puedan meter png, y como con las bmp se ve el cuadradito negro alrededor de la imagen lo he arreglado dibujandolo pixel a pixel. Costoso, pero ya esta hecho xD
40x40 pixeles en color.

Si no conoces el camino rapido te toca andar el largo =S
En línea

Kherom

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: problema vectores, allegro.
« Respuesta #16 en: 11 Enero 2012, 13:44 pm »

Eliges un color para las transparencias (por ejemplo un rosa que no te guste, o el negro si las imágenes no tienen negro), luego cargas en memoria la imagen y mediante un bucle for pintas sólo los píxeles que no sean de ese color.
En línea

MasterPunk


Desconectado Desconectado

Mensajes: 447


(-A-)


Ver Perfil WWW
Re: problema vectores, allegro.
« Respuesta #17 en: 12 Enero 2012, 00:49 am »

no se ni como comprobar el color de los pixeles ni como pintar solo algunos pixeles, asi que si me dices como me harias un segundo gran favor
En línea

Kherom

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: problema vectores, allegro.
« Respuesta #18 en: 12 Enero 2012, 01:15 am »

no se ni como comprobar el color de los pixeles ni como pintar solo algunos pixeles, asi que si me dices como me harias un segundo gran favor

Primero necesitas los datos de la imagen cargados en memoria, luego compruebas con un editor de imágenes cuál es el valor del color que vayas a usar para la transparencia, y luego mediante un par de bucles for vas pintando sólo los que no coincidan con ése color.
« Última modificación: 12 Enero 2012, 13:50 pm por Kherom » En línea

MasterPunk


Desconectado Desconectado

Mensajes: 447


(-A-)


Ver Perfil WWW
Re: problema vectores, allegro.
« Respuesta #19 en: 12 Enero 2012, 02:25 am »

voy a volver a leer en el manual de allegro los objetos bitmap
« Última modificación: 12 Enero 2012, 02:29 am por MasterPunk » 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,470 Ú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,510 Último mensaje 25 Julio 2010, 18:55 pm
por vojok
Problema con vectores 3d
Programación General
ABDERRAMAH 4 4,639 Último mensaje 8 Marzo 2011, 12:25 pm
por ABDERRAMAH
Problema con allegro (marcianitos c++)
Programación C/C++
lluk 5 4,295 Último mensaje 15 Mayo 2011, 23:23 pm
por ssaammuu
Problema con Juego en Allegro
Programación C/C++
SNP 0 1,701 Último mensaje 17 Junio 2013, 04:48 am
por SNP
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines