Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Info sobre durezas

Iniciado por Harko, 20 de Octubre de 2006, 07:13:14 PM

« anterior - próximo »

Harko

Holaa

Estaba intentando encontrar la manera de que el personaje se pare al llegar a las paredes y los objetos de una habitacion y habia decidido utilizar un mapa de durezas para hacerlo.

Si no me equivoco la tecnica consistia en tener lo que seria la sombra de la habitacion y pintar de un color prefijado el sitio por el que no se puede pasar, si no es asi corregidme.

Estoy intentando implementar eso con la CRM32Pro dibujandome las paredes solamente y no consigo que funcione correctamente. Si alguin sabe como se puede hacer funcionar esto correctamente o tiene alguna idea mejor se lo agradeceria.

Harko.
-=Harko´s Blog=-
Fui el primer civil en probar el "Lord of Creatures" y ademas usaban mis cascos. :D

-=Portfolio=-

Alguno de mis juegos:
-=Feed The Frog=-

Neroncity

warwolf

Mmmm la habitación la dibujas con tiling o es una imagen completa? Lo digo porque si haces servir tiling puedes reducir el problema a colisiones de superficies ;)

TiRSO

Si no me equivoco, un mapa de durezas para colisiones consiste en un gráfico que indica la posibilidad de posicionarse en el escenario con un código de colores (normalmente blanco y negro). No se exactamente a lo que te refieres con eso de las sombras.
Warwolf está en lo cierto, aunque en algunos casos puede interesar un mapa de durezas a pesar de usar tiles.
De todas formas, aquí hay gente con mucha más experiencia que yo en este tipo de problemas así que dejaré que amplíen la información.

Harko

No usamos tiles, usamos una imagen para cada habitacion, otra cosa seran los muebles.

Con lo de sombras me refiero a lo que seria el contorno de la habitacion, las paredes (o al menos su base).

Me he hecho una habitacion rudimentaria y en otro archivo tengo el contorno de las paredes, he estado intentando que el personaje se mueva solo por el interior de la habitacion y que se pare cuando llegue a la pared. Pero si le digo directamente que compruebe si hay colision entre el sprite y la pared el movimiento empieza a ir a saltos. Eso cuando pongo el interior transparente (colorkey) porque sino ni siquiera funciona :(

Queria que me explicarais, si alguien lo sabe, como hacer que funcione correctamente o si hay alguna forma de hacerlo que funcione mejor.

Harko.
-=Harko´s Blog=-
Fui el primer civil en probar el "Lord of Creatures" y ademas usaban mis cascos. :D

-=Portfolio=-

Alguno de mis juegos:
-=Feed The Frog=-

Neroncity

seryu

Usas algun sistema de colision propio de la CRM32Pro o lo que haces es un simple "getpixel" ?

Harko

Por ahora estaba probando con las colisiones de CRM32Pro, hasta probe la pixelcolision, pero no termina de ir. Supongo que el comprobar en cada frame la colision con una imagen tan grande le cuesta.

Estaba pensando en utilizar de algun modo el getpixel, que te devuelve el color que tiene pero voy a tener que mirarlo bastante.

Tambien me estaba planteando otra cosa, hacer unos SDL_Rect con el tamaño de cada pared e ir comprobando se colisiona con alguna. Puede que sea lo mas sencillo ya que al parecer cada habitacion tendra un tamaño diferente, al principio.

Harko.
-=Harko´s Blog=-
Fui el primer civil en probar el "Lord of Creatures" y ademas usaban mis cascos. :D

-=Portfolio=-

Alguno de mis juegos:
-=Feed The Frog=-

Neroncity

TiRSO

Cita de: "Harko"Supongo que el comprobar en cada frame la colision con una imagen tan grande le cuesta.

No se como lo estás haciendo, pero das a entender que utilizas un mapa de durezas del mismo tamaño que el gráfico de la habitación. En ese caso, te diría que no hay ninguna necesidad de utilizar el mismo tamaño; normalmente se utiliza una reducción bastante grande, ya que para indicar que zonas se pueden atravesar y cuales no no hace falta tener tanto detalle.

Harko

Como ya he dicho es la primera vez que hago algo parecido, asi que seguramente metere la pata hasta el fondo varias veces :P

Una de esas metidas de pata, supongo, es que si, uso una imagen igual de grande que el fondo para ir comprobando si se da con la pared. Cuando empieza a ir a saltos supongo que sera por eso.

Otra cosa que me raya es que le puse una coordenadas x e y temporales en las que se guarda la posicion que va a tener el protagonista cuando pulsas alguna tecla de direccion. Luego comprueba con esas coordenadas si se da o no, y si no hay colision entonces le paso esas coordenadas al sprite, lo mueve y lo dibuja.

Pues aun asi cuando llega a una pared se queda atascado y no tira para atras, sobretodo con la superior izquierda, con las otras a veces se para. Voy a ver si encuentro la manera de implementarle lo de los rectangulos a ver si tira con eso.

Harko.
-=Harko´s Blog=-
Fui el primer civil en probar el "Lord of Creatures" y ademas usaban mis cascos. :D

-=Portfolio=-

Alguno de mis juegos:
-=Feed The Frog=-

Neroncity

seryu

para el personaje deberias tener definido un rectangulo que vendria a ser su area de colision, en vez de utilizar una xy por que si no, se te va a pegar mucho a las colisiones.

Lo de que se te quede encajado suena a que igual alguna de las direcciones en las que calculas si colisiona esta mal.

Como posible mejora, para cuando soluciones esos problemillas: en caso de detectar colision en la direccion en la que se mueve el jugador, puedes comprobar si a ambos lados hay sitio libre, y entonces desplazar el personaje en esa otra direccion.

Es el efecto de "resbalar" por la pared que si te fijas tienen muchos juegos, y le da un acabado mucho mas jugable. Anda que no fastidia colisionar con un muro ligeramente curvo y no poder moverte.

TheAzazel

Buenas!

pues vamos a ir por partes, sobre las colisiones de CRM32Pro.. mientras que las dos superfices a comprobar no sean enormes, el sistema ira muy rapido e incluso asi, mientras no haya mucha "transparencia"(=colorkey) ira igual de rapido. Veras, lo primero que hacen esas funciones es comprobar si ambas superfices se solapan, y esto son un par de if nada mas, si no se solapan ya no hara nada mas, pero si se solapan... en el rect que se solapen empieza a comprobar pixel a pixel si hay dos en la misma posicion con valores distintos al "transparente"(=colorkey), y en cuanto encuentra uno, finaliza y da colision.

lo que te dice seryu de resbalar, es casi imprescindible, si no, el control sera bastante malo y eso cabrea jeje, porque como te ha dicho, que se atasque por un pixel y no se mueva...es un poco lo peor :P

y sobre el mapa de durezas... creo que es una de las mejores opciones para comprobar los desplazamientos por un escenario simple. A todo esto, que tipo de juego estais haciendo?, te lo digo porque a veces el mapa de durezas se queda corto dependiendo de lo que quieras conseguir...
pues al tema, el mapa de durezas es otra superficie grafica del mismo tamaño que tu escenario, yo suelo usar mapas de dureza de 8bits que te sirven para almacenar hasta 256 distintas regiones. Pues bien, en la superficie de durezas mas basica solo usaras dos de esas regiones, la primera, pintas usando el color que quieras pero que este en la posicion 0 de la paleta grafica los obstaculos y limites por donde tu personaje no podra moverse, y la segunda, utilizas la posicion 255 de la paleta por donde si puede hacerlo. Ten en cuenta que pueden ser los colores que tu quieras, por ejemplo usa el blanco y negro.., da igual, lo importante sera la posicion en la paleta grafica.

Ojo, como te ha dicho seryu, trata a tu personaje como un rect, vamos que, junto a la x e y, acuerdate de su tamaño en ciertos movimientos(derecha y abajo).

Ahora, si mueves tu personaje, primero debes comprobar que en esa futura posicion en el mapa de durezas es zona para caminar o no.
Puedes usar esta funcion:
TipoDeZona=IPrimitives->GetPixel(MapaDurezas,x actual mas el movimiento que quiero,y actual mas el movimiento que quiero);
Que te devuelve 0? pues no te puedes mover, que te devuelve 1? pues si te puedes mover.

Como siempre en estos casos, si sigues con problemas, cuelga tu imagen del escenario y su mapa de durezas y pon algo de codigo o pasamelo por email y te lo miro, como quieras :)

bueno, pues espero haber despejado dudas en vez de crearlas jeje, si me explico un poco mal pero es por la resaca...anoche fue un poco loca jeje.

Ah, podrias usar mapas de durezas de 16bits y demas y olvidar la paleta, pero tendrias que comprobar los componentes RGB y eso son 3 comprobaciones el lugar de 1 usando 8bits con paleta. En ingles esto seria un Up to you :)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.