PDA

Ver la versión completa : [Ayuda] Ayuda con Fenix: Gravedad y mapa de durezas



Keinel
06/10/2009, 16:35
:confused: Hola, estoy intentando hacer un juego para la wiz de plataformas ,pero tengo varios problemas con la gravedad y el mapa de durazas ,ya q cuando se la puse me desaparecieron las coliciones como podria poner q me detectara las coliciones de un mapa de durezas rojo cuando saltas o caes en el?

Gracias por la ayuda y a ver si me sale un wen juego XD

Saludos^^

Hokutoy
06/10/2009, 16:44
SALUDOS!
Es dificil darte una solucion sin hacerte medio juego ya que no das muchas pistas sobre el posible problema.
Como has hecho la Gravedad y el mapa de durezas? Los has cogido de algun ejemplo y los has juntado "a ver que sale"? Yo te recomiendo que mires bien algun ejemplo de gravedad y de mapa de durezas (hay bastantes ejemplo por la red... si no encuentras nada ya te daré algunos) y "juegues" con ellos modificandolos y entendiendo como funcionan.
Una vez dominados no tendría que ser problema su uso y disfrute.
Si concretas más tu error o aportas algo de codigo podremos intentar ayudarte mas facilmente.

Locke
06/10/2009, 16:53
En cada frame intenta calcular la distancia que separa el sprite del suelo, y luego comparala con la distancia vertical que va a recorrer en ese frame en funcion de la aceleracion de la gravedad.

Si la distancia a recorrer es mayor que la que lo separa del suelo (del pixel mas arriba en la capa de durezas respecto a su coordenada X), iguala la distancia a recorrer a la distancia de elevacion.

Si es menor, dejale caer a gusto y ya comprobaras en el siguiente frame.

Keinel
06/10/2009, 17:02
A ver k tal, pongo akí el codigo

Process gravedad();

Private
vgravedad;
Begin

vgravedad=(father.velocidad_gravedad++);
If (vgravedad>12)
father.velocidad_gravedad=12;
vgravedad=12;
End

If (vgravedad<0)
While (vgravedad++!=0)
// Si se da con
el techo
If (map_get_pixel(1,2,father.x/2,(father.y-24)/3)<>252)
father.y--;
Else
father.velocidad_gravedad=0;
Break;
End
End
Else
father.y+=vgravedad;
// Comprueba el rango vertic
al del movimiento del protagonista
From vgravedad=-16 To 7 Step 2;
If (map_get_pixel(1,2,father.x/2,(father.y+vgravedad)/2)==136)
Break;
End
End
If (vgravedad<8)
father.y+=vgravedad;
father.velocidad_gravedad=0;
End
End

End

Process en_pantalla()

Begin

If (map_get_pixel(idescenario,2,x,y+45)==rgb(255,0,0) )
Return(true); // Si se toca suelo el proceso devuelve true
Else
Return(false); // Si , devuelve false
End

End
y esta lo de las durezas
if(flags==0 and map_get_pixel(idescenario,2,avanzadillader,y-40)==rgb(255,0,0))
obstacle=1;
elseif (flags==0 and map_get_pixel(idescenario,2,avanzadillader,y-40)!=rgb(255,0,0))
obstacle=0;
elseif(flags==1 and map_get_pixel(idescenario,2,avanzadillaizq,y-40)==rgb(255,0,0))
obstacle=1;

elseif (flags==1 and map_get_pixel(idescenario,2,avanzadillaizq,y-40)!=rgb(255,0,0))
obstacle=0;
end

/*Salto hacia la derecha*/
if(key(_s) and flags==0 and obstacle==0)
repeat
/*El
movimiento del salto propiamente dicho*/
y=y-(yy-iy);
x=x+xx;
/*Para salirse del mapa de durezas*/
if(x>=2000) x=x-2000;end
/*Cuando la cabeza del personaje rebot
e con la base de una plataforma, éste ha de caer. El
algoritmo es el mismo que el de la caida libre desde una plataforma superior a otra inferior (ver más
aba )*/
if(map_get_pixel(idescenario,2,x,y-
40)==rgb(255,255,0))
while(map_get_pixel(idescenario,2,x,y+45)!=rgb(255 ,0,0))

y=y+5;
frame;

end
break;
end


frame;
//Para que se vaya desacelerando el salto y el personaje vuelva a bajar
iy=iy+1;
/*Falta hacer que mientras esté saltando y choque contra una plataforma, se detenga el salto!!!*/
until(map_get_pixel(idescenario,2,x,y+45)==rgb(255 ,0,0))
/*or map_get_pixel(idescenario,2,av
anzadillader,y)==rgb(255,0,0))*/
iy=1;
end
/*Salto hacia la izquierda. Igual que el de la derecha excepto en que la
coordenada x disminuye en vez de aumentar.Por lo demás, todo igual.*/
if(key(_s) and flags==1 and obstacle==0)
repeat

y=y-(yy-iy);
x=x-xx;
if(x<=0)x=x+2000;end
if(map_get_pixel(idescenario,2,x,y-
40)==rgb(255,255,0))
while(map_get_pixel(idescenario,2,x,y+45)!=rgb(255 ,0,0)
)
y=y+5;
frame;
end
break;
end

frame;
iy=iy+1;
until(map_get_pixel(idescenario,2,x,y+45)==rgb(255 ,0,0))
iy=1;
end
/*Salto hacia la derecha*/
if(key(_d) and flags==0 and obstacle==0)

repeat
/*El movimiento del salto propiamente dicho*/
y=y-(yyy-iy);
x=x+xxx;
/*Para salirse del mapa de durezas*/
if(x>=2000) x=
x-2000;end
/*Cuando la cabeza del personaje rebote con la base de una plataforma, éste ha de caer. El
algoritmo es el mismo que el de la caida libre desde una plataforma superior a otra inferior (ver más
aba )*/
if(map_get_pixel(idescenario,2,x,y-
40)==rgb(255,255,0))
while(map_get_pi
xel(idescenario,2,x,y+45)!=rgb(255,0,0))
y=y+5;
frame;
end
break;

end

Drumpi
06/10/2009, 17:31
Buf, gravedad y mapas de durezas, el capítulo 7 de programación por lo menos, no recomendados a novatos :)
Estoy un poco cansado de programar hoy, lo siento, pero no puedo leer mucho código hoy (te recomiendo que pongas [ code ] y [ /code ] sin los espacios y luego pegues el contenido del código entre los dos para conservar el sangrado).
De todas formas, te daré los consejos básicos:

Para los mapas de durezas es mejor usar siempre mapas de 256 colores, se puede hacer con 16bits, pero tendrás que tener en cuenta que el código de un color puede cambiar de un PC a otro. No es una regla, pero te quitará muchos quebraderos de cabeza.
Tambien puedes hacer el mapa a la mitad de su tamaño, la pérdida de precisión es mínima y ahorras un 75% de memoria.
La gravedad es esa bicha mala de los juegos de plataforma, hay muchas formas de hacerla, pero lo más importante es que vayas comprobando el movimiento del personaje a cada pixel, pues si haces algún "salto", a poco que te encuentres con que el mapa usa lineas finas, atravesará el suelo. Es complicado, lo se, pero es tu mejor opción.

Y lo más importante, no intenteis empezar a hacer cosas complicadas, un juego de plataformas es de lo más difícil de hacer en cuanto a programar videojuegos 2d se refiere, y se recomienda haber empezado por algo sencillo como un matamarcianos, un pong o similar, seguir con algo en vista aerea (el Pacman es un ejercicio muy completo) y luego plantearse las plataformas.
Y en tu caso, o hay una gran historia de programación antes o has empezado copiando código. No te lo tomes a mal, símplemente lo digo porque nos cuentas que tu personaje atraviesa las durezas y veo código chocando contra plataformas con la cabeza. Céntrate primero en que el personaje no atraviese un suelo llano, luego un suelo con relieve, y luego te centras en los techos. Obviamente para cada prueba recomiendo que diseñes un escenario específico para cada una.

Espero que te sirva de guía. Y perdona una vez más por no darte una solución más específica (esos nombres tan genéricos en las variables tampoco ayudan mucho :D)

Keinel
06/10/2009, 18:15
Alguien me puede poner algun ejemplo de mapa de durezas y gravedad q venga con Fpg plz??

Grax^^

Rivroner
06/10/2009, 18:22
:confused: Hola, estoy intentando hacer un juego para la wiz de plataformas ,pero tengo varios problemas con la gravedad y el mapa de durazas ,ya q cuando se la puse me desaparecieron las coliciones como podria poner q me detectara las coliciones de un mapa de durezas rojo cuando saltas o caes en el?

Gracias por la ayuda y a ver si me sale un wen juego XD

Saludos^^

¿Pero qué es lo que te pasa exactamente?

¿Las durezas y colisiones con suelo y paredes te funcionaban bien pero al poner la gravedad ya no funcionan, es eso?

Pues ya sabes donde está el problema, en alguna de las ecuaciones de la gravedad.

Igual has metido en las ecuacione sle agravedad alguna constante o variable que cambia alguna de las ecuaciones de las durezas o colisiones digo yo.

Yo no te puedo ayudar, estoy como tú, copiando y pegando código.

La otra tarde me tiré 3 horas para entender como podía hacer funcionar a mi personaje a la misma velocidad que iba a 30 frames pero conel juego a 60 como lo había puesto ahora :D Y ahí estuve tocando cosas hasta que di con la clave. :D Era bien fácil, pero cuando el código no lo has pensado tú, si no que lo has copiado cuesta verlo un rato largo. [wei]

Yo uso este pedazo de tutorial, por si no tienes ninguno a mano ;) :

http://www.pixjuegos.com/descargas/CursoFenix2.pdf

Mira en la página 517, igual encuentras lo que buscas.

Keinel
06/10/2009, 18:42
Ahora lo k me pasa es k cuando estoy en las plataformas se me unde para abajo pero q me deja saltar en ellas q falla?

Rivroner
06/10/2009, 18:45
¿Se te unde el qué, el personaje, la plataforma, las 2 cosas a la vez?

Explícate mejor, así ahorraremos tiempo. :)

Como diría un Miyagi, primero leete ese manual entero y luego ya te mando otra cosa. :D

http://t3.gstatic.com/images?q=tbn:vt2vJ34eGbN3VM:http://www.galeon.com/elrincondealberto/miyagi.jpg


Mira estos ejemplos tb, ha 3 de durezas y 2 de gravedad creo.

http://usuarios.lycos.es/tgames/resume.html

chipan
06/10/2009, 20:30
el castle of Dr malvado es un ejemplo perfecto de durezas y gravedad.

Darumo
06/10/2009, 20:34
prueba con algo cutre, suma siempre 2 a la coordenada Y, y si pisa "suelo" le restas 2, eso mantiene el muñeco encima del suelo (si no toca "suelo" siempre "cae" 2 pixel por frame, si toca suelo "sumas 2 y restas 2" asi que se mueve 0 en Y), aparte si quieres que pueda subir "cuestas" coge en vez de un color dos colores a diferente altura (1 pixel de diferencia) del "PIE" del personaje, con el mas bajo sigues haciendo igual que como fuese uno, pero si el otro alto tambien toca "suelo" le restas 1 o 2 a Y, eso levantaria el muñeco con la forma del suelo al menos pendientes de 45º creo, en las bajadas la gravedad hace el resto. (si tienes mucha velocidad de frames puedes cambiar los "2" por "1", a 60frames/sg a 2 pixel por frame, en un segundo el muñeco cae media pantalla practicamente)

Por cierto acostumbrate a guardar el resultado de coger color de una coordenada en una variable, por lo que veo en el codigo coges el mismo punto de color muchas veces, y "map_get_pixel" consume bastante, nada mas en "en_pantalla" 2 llamadas seguidas, cuando podria ser una.
Ten en cuenta que parece poco, pero es 1 llamada mas, que a 60frames por segundo son 60 llamadas extras, eso a la "izquierda", y otras 60 para la "derecha", son 120 llamadas por la cara por no usar 2 variables, y si usas mapas de durezas de 8bit tambien puedes evitar el uso del comando "RGB" solo comprobando el numero de color de 0 a 255 que tambien es mas ligero (evitas el calcular el color ROJO en tu caso, por ejemplo puede poner el rojo en el color 1, y solo tienes que mirar si es = a 1) o guarda el resultado de ese "rgb(255 ,0,0)" en una variable ROJO al principio del programa y usas esta despues en vez de repetir tanto "rgb(255 ,0,0)", es simple y apenas tienes que tocar lo que has hecho.
Lo digo por que CPU nunca sobra, y estas cosas al principio parece que no pero despues se notan. Imagina lo que puedes ahorrar de calculos a lo largo del programa, por que eso te lo he dicho de un solo proceso.

animanegra
06/10/2009, 21:01
tengo una presentacion y un codigo que igual te puede ayudar. Si lo quieres pon tu mail y te lo envio.

Keinel
06/10/2009, 21:11
Gracias, envíamelo a lord--destruction@hotmail.com

Graxx^^

animanegra
06/10/2009, 21:27
te lo he enviado ya.
***** lord destruction, me ha recordado a la peli de hackers :D

masteries
06/10/2009, 23:58
Ese código es tremendamente complejo (quizá más bien largo), debes pensar siempre que lo que estás haciendo es un videojuego y todo proceso ha de estar minuciosamente miniaturizado... aún pensando esto te saldrán "morcillotes" incomprensibles así que imagínate sin pensar de esta forma.

Te paso la gravedad que utilizo en mi juego "Viaje al centro de la Tierra" que por cierto la primera fase está disponible en la sección de descargas Fénix GP2X, no tiene el código, pero si te gusta la forma en que se juega te lo puedo mandar sin problemas.

Es una buena práctica aumentar la precisión en la lectura del mapa de durezas haciendo unas cuantas comprobaciones de map_get_pixel en cada fotograma.

Lo olvidaba, este código que te muestro sirve para que el personaje se adapte a terrenos abruptos, curvos, en relieve, realistas o como lo querais llamar.


if(trepando==0)
from fine=-6 to 4;//10 comprobaciones por cuadro, xq no se mueve píxel a píxel
suelo=map_get_pixel(graficos_fase,nivel,(x)/2,(y+fine)/2);//la gravedad se detiene en cuanto se toca el suelo
if(suelo==duz.rojo | suelo==duz.naranja)
y=y+fine;
break;//se ha encontrado el suelo, ya no hay que seguir comprobando
end
if(suelo==255)
suelo=0;
end
if(y=>yminimo)//se ha salido del nivel
play_wav(s[21],0);//esto de aquí cambiaría en cada juego, claro
graph=no_graph;
clear_stats(1);
loop
frame;
end
end
end
end

if(suelo==duz.rojo | suelo==duz.naranja)
gravedad=0;
//aquí van las cosas que puede hacer el personaje cuando está en el suelo o plataforma
end

//GRAVEDAD, no es un proceso, esto va dentro del código del personaje
if(suelo==0 & salto==0 & trepando==0)//gravedad, está cayendo
fix=1; //no está quieto
en_el_suelo=0;//tampoco está en el suelo
y += 2 + gravedad;
if(caida<255)
caida++;
if(caida==49)
play_wav(s[21],0);
end
end
if(contador==1)
graph=32;
end
if(key(_right)) //se mueve peor en el aire
from fine=5 to 0;
pared=map_get_pixel(graficos_fase,nivel,((x+20)+fi ne)/2,(y-1)/2);
if(pared==duz.marron)
break;
end
end//fin del from
if(pared!=duz.marron)
flags=0;
if(fin_de_salto==1)//va más rápido si cae debido a un salto, lleva el ímpetu del salto
x += 5;
else
contador_aire++;
if(contador_aire==2)
contador_aire=0;
x += 2;
end
end
end
end

if(key(_left)) //se mueve peor en el aire
from fine=-5 to 0;
pared=map_get_pixel(graficos_fase,nivel,((x-20)+fine)/2,(y-1)/2);
if(pared==duz.marron)
break;
end
end//fin del from
if(pared!=duz.marron)
flags=1;
if(fin_de_salto==1)
x -= 5;
else
contador_aire++;
if(contador_aire==2)
contador_aire=0;
x -= 2;
end
end
end
end

if(gravedad<12)
contador_gravedad++;
if(contador_gravedad==2)
contador=1;
gravedad++;
contador_gravedad=0;
end
end
end
Como ves se trata de un código muy sencillo y funcional (sobretodo si has probado mi juego).

Espero que te sirva de ayuda.

Rivroner
15/10/2009, 15:59
Creo que me pasa lo mismo que a Keinel, encima los 2 hemos sablado el código del Dr.Malvado. :quepalmo:


Masteries, ¿el trepando, caida, finde salto pared, etc.. las declaro como global? ¿Cuales inicializo a 0?

Si es que soy un paquete. :(