Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Kherom

#21
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 );
#22
Desafíos - Wargames / Re: Problemas lógicos
9 Enero 2012, 20:49 PM
Cita de: |Demon| en  9 Enero 2012, 20:16 PM
No se lo que es pensamiento lateral, sea lo que sea, no hay ningun "otro camino" el problema es como se pinta, solo aplica la lógica xD

Edito: Ya he buscado lo que es el pensamiento lateral y ya se por donde vas, como he dicho antes, no hay trampa, aplica la lógica, sobre todo en el primero xDDDD

El primero ya lo se ahora xD

El tercero también (ya es tarde :P)

Pero en los otros 2 no caigo, la falta de sueño será xDDD
#23
Desafíos - Wargames / Re: Problemas lógicos
9 Enero 2012, 20:10 PM
De todas formas más que de lógica diría que son problemas de pensamiento lateral. Y yo parece que no voy a dar ni una xDDD
#24
Desafíos - Wargames / Re: Problemas lógicos
9 Enero 2012, 19:25 PM
Cita de: |Demon| en  9 Enero 2012, 19:14 PM
¿Para que **** dices la solución?

Si no la hubieses quoteado no me habría enterado :S Ahora ya no hay remedio xD
#25
Cita de: MasterPunk en  9 Enero 2012, 01:19 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):

float tan, ang, vx, vy, velocidad; //Deberias pasar todo a floats


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
{
vx=0;
vy=0;
}
else
{
if (derx-posx==0) //Si no hay x la velocidad esta en y
{
vx=0;
if(dery-posy>0) //Si esta por encima
vy=velocidad;
else
VY=-velocidad;
}
else
{
tan= (dery-posy)/(derx-posx) //No te olvides de los parentesis
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
vy = (sin(angulo)*velocidad);
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)
}
}

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

posy+=vy;
posx+=vx;


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


posy+=vy*msTranscurridos;
posx+=vx*msTranscurridos;


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.
#26
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
#27
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.
#28
¿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?
#29
Cita de: oPen syLar en  3 Septiembre 2011, 22:25 PM
Hey.! Buscando por inter.. Encontré ciertos sitios... Donde el desarrollo se hace vía Freelance.. Con buena paga.. Pero la pregunta seria.. Son fiables.? Alguno de ustedes han trabajado en proyectos freelance.? Que probabilidad tengo de que me cancelen lo que programo.?


Saludos ;)

¿Puedes decirnos qué sitios son esos?
#30
No entiendo nada :P (Estoy aprendiendo). En cualquier caso deberías usar las etiquetas "code=cpp" y "/code" (cambiando los paréntesis por corchetes) para que quede más claro y se vean bien las tabulaciones:

Código (cpp) [Seleccionar]
void inserta_modelo(empresa empresas[], int cont)
{
char emp[5]; //el nombre que entre en consola
//cont = 0; // donde pretendemos guardar la posicion de la empresa en base_datos
//cout<<"============================...
//cout<<"| Insercion de modelo |"<<endl;
//cout<<"|___________________________...
//cout<<"| Para ingresar el modelo es necesario que indique el nombre |"<<endl;
//cout<<"| de la empresa en la que lo quiere ingresar: "<<endl;
cin>>emp;
cout<< empresas[cont].cant_modelo;
for (int i = 0; i<empresas[cont].cant_modelo;i++){
char temporal[5];
cout<<" ****** absurda";
strcpy(temporal, empresas[cont].nombre);

if (strcmp(temporal,emp) == 0){
char descripcion[50];
int cantidad;
int precio;
int codigo_barras;
cout<<"============================...
cout<<"| El nombre de la empresa es correcto, ahora puede ingresar"<<endl;
cout<<"| los datos del modelo "<<endl;
cout<<"|_________________________"<...
cout<<"| descripcion del modelo: "<<endl;
cin>>descripcion;
cout<<"| cantidad de articulos disponibles: "<<endl;
cin>>cantidad;
cout<<"| precio para el cliente: "<<endl;
cin>>precio;
cout<<"| codigo de referencia: "<<endl;
cin>>codigo_barras;
int nuevo_modelo = empresas[cont].cant_modelo;


empresas[cont].cant_modelo = nuevo_modelo++; //aumenta la cantidad de modelos de esa empresa
model [cont].descripcion[nuevo_modelo];// descripcion; //asigna la descripcion del modelo que se esta ingresando
empresas[cont].lista[nuevo_modelo].... = precio; //asigna el precio del modelo que se esta ingresando
empresas[cont].lista[nuevo_modelo].... = cantidad; //asigna la cantidad disponible del modelo que se esta ingresando
empresas[cont].lista[nuevo_modelo].... = codigo_barras; //asigna el codigo
}

}
cont++;
getch();

cout<< "modelo numero: "<<endl;
cout << cont<<endl;
cout<<"Presione cualquier tecla para continuar..."<<endl;
getch();

}


De todas formas si empresas[cont].cant_modelo es superior a 0 debería ejecutar el bucle. Y creo que te faltan unas comillas sin las cuales como ves sale todo en rojo.