Imagen dentro de otra imagen

Started by Arcontus, March 07, 2013, 01:35:07 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Arcontus

Me interesa colocar objetos dentro de zonas delimitadas por tiles y no quiero que el objeto pueda sobresalir de las tiles.
Como puedo saber si una imagen está dentro de otra teniendo en cuenta el aplha, size, angle, mirrors,..., de ambas? Es como un collision pero en vez de buscar colisiones, busca lo contrario (ojo no confundir, no es el negativo del resultado de la función collision).

Gracias.

5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

fulgorelizz

Quote from: Arcontus on March 07, 2013, 01:35:07 PM
Me interesa colocar objetos dentro de zonas delimitadas por tiles y no quiero que el objeto pueda sobresalir de las tiles.
Como puedo saber si una imagen está dentro de otra teniendo en cuenta el aplha, size, angle, mirrors,..., de ambas? Es como un collision pero en vez de buscar colisiones, busca lo contrario (ojo no confundir, no es el negativo del resultado de la función collision).

Gracias.

tienes algun screenshot representativo de lo que deseas hacer??? .... quizas pueda ayudarte un poco!!
Compiling code -- generating exe...

Arcontus

Quote from: fulgorelizz on March 07, 2013, 02:15:41 PM
tienes algun screenshot representativo de lo que deseas hacer??? .... quizas pueda ayudarte un poco!!

Si, por supuesto.



Si clicais se verá más grande, pero básicamente, el unico que estaría dentro sería el tercer caso.

5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

warrior_rockk

Asi a bote pronto, entiendo que la dificultad de tu problema se basa en que quieres controlar la colisión de una forma irregular con otra forma irregular, esto es, que no es ni cuadrada, ni elíptica, ni ninguna otra forma definida, si no un polígono de forma irregular.
Lo que se me ocurre es que recorras los pixeles a lo ancho y alto del proceso "a" y los compares con los pixeles en la misma coordenada del tile. Si ningún pixel de color transparente del proceso "a" coincide con algún pixel de color transparente del tile, es que estás completamente dentro del tile.

SplinterGU

hacerlo desde el prg podria ser lento...

que hay si no tienes un tile lo suficientemente grande como para contener el proceso?

creo que la solucion rapida seria usar tiles completos...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Es muy fácil, se puede usar la misma técnica que para una colisión de cajas.
Solo tienes que comprobar que la esquina superior izquierda y la esquina inferior derecha de tu imagen pequeña, estén ambas dentro de tu imagen grande.

Si no sabes el algoritmo dibújate en ese papel las cuatro coordenadas (2 coordenadas de las dos esquinas involucradas de cada imagen)  para todos los casos que propones y mirar que condiciones hacen que se cumplan que están dentro, es decir si x+x1>quetal, y+y1 < que tal, etc.


Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

FreeYourMind

o si lo prefieres,  la esquina superior derecha y la esquina inferior izquierda  ;D

SplinterGU

Quote from: DCelso on March 08, 2013, 02:52:25 PM
Es muy fácil, se puede usar la misma técnica que para una colisión de cajas.
Solo tienes que comprobar que la esquina superior izquierda y la esquina inferior derecha de tu imagen pequeña, estén ambas dentro de tu imagen grande.

Si no sabes el algoritmo dibújate en ese papel las cuatro coordenadas (2 coordenadas de las dos esquinas involucradas de cada imagen)  para todos los casos que propones y mirar que condiciones hacen que se cumplan que están dentro, es decir si x+x1>quetal, y+y1 < que tal, etc.




para eso se pueden usar las funciones de regiones... pero la cosa es que segun entiendo tiene tiles no completos, a menos que use tiles completos, colision por cajas no servira de nada...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

El método de las cajas se me había ocurrido, pero no me sirve al 100%, ya que algunas de mis tiles son irregulares.

Lo que pretendo es que el jugador pueda poner procesos del tipo torreta defensiva solo dentro de las tiles, y tenga en cuenta las irregularidades que pudieran tener dichas tiles.
Las tiles son 128x128 pixeles, las torretas algo menos.
Me queda claro que solo habría de comprobar si está dentro de la tile en el caso de que colisionen ambos procesos con el método "collision_box", que es el más rápido.

Estoy pensando que hay otro problema que no había contemplado anteriormente para hacer esto de manera correcta, ya que si dos tiles se juntan para crear una plataforma mayor, con un algoritmo que valide si una imagen está dentro de otra tampoco funcionaría si queremos poner una torreta en la plataforma usando las 2 tiles como base.

¿Alguna idea más?
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

DCelso

Pues no se, usar una imagen máscara del escenario final. blanco si se puede poner torreta, y negro si no se puede, y cuando la vayas a poner compruebas que los pixeles distintos de transparente de tu torreta estén encima de un pixel blanco de tu mascara.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Arcontus

#10
Vale, creo que ya lo tengo :) , al menos creo que servirá casi al 100%:
1 Cojo el proceso torreta y le pinto 4 (o más) puntos de control dentro del gráfico a modo de perímetro.
2 busco esos puntos del gráfico donde están respecto al scroll.
3 dibujo un pixel y compruebo si colisiona con los procesos TILE (todos), que son su plataforma.
4 si los 4 puntos dan colision asumo que la torreta está lo suficientemente dentro como para ser aceptable y permito colocarla.

Creo que funcionará, ya os contaré.
Si a alguien se le ocurre una forma mejor que la comente.

Un saludo.
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Arcontus

Quote from: DCelso on March 08, 2013, 05:20:18 PM
Pues no se, usar una imagen máscara del escenario final. blanco si se puede poner torreta, y negro si no se puede, y cuando la vayas a poner compruebas que los pixeles distintos de transparente de tu torreta estén encima de un pixel blanco de tu mascara.
Hum, si, es una posibilidad, lo tendré en cuenta si no me sale lo anterior.
Gracias.
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

DCelso

De nada, la máscara es un concepto básico, ya inventado en los primeros juegos de ordenador, tampoco dije nada del otro mundo ;).
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

si montas tu mapa por tiles, tienes que hacer lo mismo con tu máscara,a cada tile tienes que crearle su máscara, y al crear el mapa con tiles, creas también tu mapa máscara, y sobre ese compruebas, tendrás dos imágenes del tamaño del mapa, pero así te será mas facil comprobar, porque ya te da igual que caiga en medio de dos o tres o cuatro tiles que como es una máscara grande no le importará :D.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

#14
Quote from: Arcontus on March 08, 2013, 05:11:43 PM
El método de las cajas se me había ocurrido, pero no me sirve al 100%, ya que algunas de mis tiles son irregulares.

Lo que pretendo es que el jugador pueda poner procesos del tipo torreta defensiva solo dentro de las tiles, y tenga en cuenta las irregularidades que pudieran tener dichas tiles.
Las tiles son 128x128 pixeles, las torretas algo menos.
Me queda claro que solo habría de comprobar si está dentro de la tile en el caso de que colisionen ambos procesos con el método "collision_box", que es el más rápido.

Estoy pensando que hay otro problema que no había contemplado anteriormente para hacer esto de manera correcta, ya que si dos tiles se juntan para crear una plataforma mayor, con un algoritmo que valide si una imagen está dentro de otra tampoco funcionaría si queremos poner una torreta en la plataforma usando las 2 tiles como base.

¿Alguna idea más?


2 opciones

1) mapa de durezas
2) reducir el tamaño del tile y hacer que los tienes sean completos y regulares, al menos en las zonas donde se pueden poner las torretas... de hecho deberia ser asi... piensa en el tile como un casillero en un tablero de ajedres o damas... es mas, quizas combinando esto con un mapa de durezas dinamico.

otra opcion

tambien puedes usar 2 puntos de control (el 1 y el 2 por ejemplo) y hacer que uno sea el centro del area donde se puede poner la torreta y en 2do el radio o distancia maxima... con esto, si pones un grafico que exceda de esta distancia (considerando angulo+size+ancho+alto) ya lo tienes... aunque es bastante molesto calcular el radio de cada grafico, pero bueno, supongo que peor es poner 4 puntos como mencionas.

incluso podrias tener varios grupos de estos puntos de control, si el objeto es muy irregular (por ejemplo, la L del ejemplo, podrias tener 3 centro+radio)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2