Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





duda sobre colisiones de pacman

Iniciado por platinio, 12 de Abril de 2014, 02:06:17 AM

« anterior - próximo »

platinio

 ^_^' bueno como el titulo lo dice tengo una duda a la hora de programar pacman en java, la cosa es que entiendo el hecho de formar el mapa con una matriz bidimensional con pequeñas imágenes, pero tengo mis dudas con eso por ejemplo como haría para comprobar si pacman colisiona con una pared? se que se podria acer por ejemplo que una pared fuera un 0 en la matriz y pacman un 1 pero eso no haria que el movimiento dejara de ser fluido? o con que algoritmo se podria hacer? o tendria que guardar rectangulos de todas las paredes y comprobar las colisiones una a una?, y otra cosa con respecto al movimiento si por ejemplo yo digo que pacman esta en matriz[0][1] y luego lo desplazo a matriz[0][2] de golpe el movimiento no se veria fluido como se podria hacer? se que son muchas dudas pero que se hace cuando unos es novato   0:-)  >.< , gracias de antemano si alguien puede sacarme de mi error  :)

Darago_malaga

Veo que tienes claro lo de la matriz de dos dimensiones para determinar los obstáculos en el terreno de juego.
0=los espacios en blanco
1=los puntos que tienes q comerte
2=los muros
....
Etc.

Como bien dices si estas en la casilla [0,0] y quieres moverte a la [1,0] (una casilla a la derecha por ejemplo) si lo haces de golpe va ha haber un salto muy grande y se va a ver muy tosco. Como haces eso...en realidad solo compruebas que puedes ir al siguiente punto de la matriz una sola vez. Luego te mueves 10 pixeles a la derecha si comprobar nada. Por lo tanto tu posición en la matriz es tu posición en pantalla dividido por 10.


platinio

#2
hola Darago he estado leyendo bastante sobre el tema y echándole cabeza y tu respuesta me lo acaba de confirmar ayer empece a echarle código por lo que entiendo solo seria una condición que comprueba que la casilla a la que desea llegar sea una casilla por decir así pisable y si lo es le permito su desplazamiento no mover lo de sopetón como pensaba , corrígeme si me equivoco por favor, pero me surge otra duda perdonen lo pregunto pero hay que aprovechar a la gente que sabe  :D , supongamos que pacman esta en la casilla[0][1] y se quiere mover a la casilla[0][2] en el transcurso de su movimiento antes de llegar completamente a la casilla[0][2] (que suponiendo que los tiles tenga un ancho y alto de 10 serian las coordenadas x=0 y=200) pacman ocupara 2 casillas? por que lo pienso así?, por que entonces para implementar las colisiones primero debería comprobar que ningún numero se quiera poner encima de otro por decirlo así si esto sucede pues ya iría a la colisión real a ver si en realidad sucede. bueno no se si supe explicarme pero solo quiero aprender  :D .

Darago_malaga

#3
Creo que tendrías que tratar de forma independiente la colisión con las paredes y la colisión con los fantasmas.

Imagínate que pacman esta en la casilla [0,1] y quiere moverse a la posición [0,2]

1) comprobamos que en la posición destino no hay un muro. Si es asi iniciamos el movimiento en 10 pasos en los que no podemos cambiar de dirección. Si en uno de esos pasos nuestra posición en pantalla es igual que la un fantasma --> Game Over.


Desde el punto de vista del fantasma...
Imagínate que pacman esta en la posición [0,1] y quiere moverse a la posición [0,2] y que el fantasma esta en la posición [0,3] y vemos que el pacman esta en la misma "x" (que es 0) pero en una "y" inferior,  pues decidimos ir a la siguiente casilla siempre y cuando no este ocupada por un muro [0,2]... pacman y el fantasma iniciaran una serie de 10 movimientos que dará como resultado que pacman y el fantasma ocupen la casilla [0,2] y la misma posición en pantalla... resultado --> Game Over.

otro ejemplo....

Pacman esta [0,1] y quiere ir a la posición [0,2]
y hay un fantasma en la posición [0,2] que determina que quiere ir a la [0,1]
los dos inician una serie de 10 movimientos en los que no pueden cambiar de dirección... resultado...cuando llevan 5 pasos ocupan la misma posición en pantalla y--->Game Over.

Otro ejemplo mas..
Pacman está esta vez en la posicion [0,2] y quiere moverse a la posion [0,3]
y un fantasma esta en la posicion [0,1] y determina moverse a la posicion [0,2]
Los dos inician una serie de 10 movimientos que da como resultado que nunca llegan a ocupar la misma posicion de pantalla ya que cuando el fantasma llega a la poscion [0,2] pacman ya ha dejado completamente esa casilla y ocupa la [0,3]


Conclusion... La Matriz de 2 simensiones te sirve para ver si la posición de destino es "Transitable" para pacman y los fantasmas.. pero las colisiones entre los fantasmas y pacman se hacen por posicion de pantalla.

Tambien puedes hacer que la colision de los fantasmas y pacman no sean por una posicion exacta e pantalla... del estilo

if(pacman.x==fantasma.x AND pacman.y==fantasma.y)
{
        GameOver();
}

si no por un margen de unos pixeles (por ejemplo 4 pixeles a la redonda)

if( (pacman.x>(fantasma.x-4) AND pacman.x<(fantasma.x+4) ) AND (pacman.y>(fantasma.y-4) AND pacman.y<(fantasma.y+4) ) )
{
        GameOver();
}



Pd.Perdona si las condicionales son son exactas pero es que ya es tardecillo y estoy espesote. Lo importante es el concepto.

Pd.2 Decimos que una vez decidida la dirección de destino iniciamos una serie de 10 pasos y en esos 10 pasos no podemos cambiar de dirección porque el gameplay del pacman es asi... si hacemos otra clase de juego... por ejemplo un rpg cenital u otra cosa... el gameplay cambia y podemos decidir en medio de esos 10 pasos queremos regresar...pues si llevamos 2...hacemos los cálculos para dar solo 2 en la otra dirección..pero eso ya es otro tema que a lo mejor no te interesa.

platinio

mmm gracias Darago la verdad si estaba entonces bastante equivocado  ^_^' me has sacado de una gran duda, con los ejemplos me ha quedado todo bien claro  ^_^

Darago_malaga

Un placer. Si tienes mas dudas... Y muestra por aqui los resultados que esas cositas nos gustan mucho a los Strateros.






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.