Cómo saber si existe cierta posición(X,Y) está ocupada.

Vikkktor

Perdón por el título, "Cómo saber si cierta posición(X,Y) está ocupada por algún objeto".

Buenas,
soy relativamente novato en windows forms,
estaba practicando unas el movimiento de objetos y quería ponerle límites, pero creo que me estoy liando demasiado.

A ver, he puesto como fondo del formulario, una screen de pokémon, he creado un picturebox con el dibujito de un personaje, y al usar las teclas "w,s,a,d", el muñeco se va moviendo por el formulario.

Bien, ahora quería poner límites a ese movimiento, es decir, que cuando llegue a los arbustos, no pueda continuar, a la casa lo mismo, que no pueda atravesar a los otros personajes...

Al principio pensé en hacer:

if (mimuñeco.location.Y>=120) //esto sería que a partir de ahí ya están los arbustos de abajo.
{}
else //si es la posicion esta por encima de los arbustos, podrá moverse.

Pero es demasiado lioso para la casa o los personajes, así no puede hacerse.

También se me ha ocurrido pone picturebox invisibles en los lugares en los que no quiero que pueda pasar mi personaje, y hacer algo en plan "si en el sitio en el que está mi muñeco, hay un picturebox, ya no se avanza más". Pero no sé hacerlo.

Supongo que tampoco será una idea válida, pero a ver si podéis echarme un cable, os lo agradecería.

Se que hay programas especificos para esto, como el RPG Maker, pero quería hacerlo en Windows forms para practicar con ello.

Un saludo.

bLero

#1 A lo que te refieres, en el ámbito de los videojuegos se denomina colisiones.

Tienes varias formas de detectar colisiones, las más comunes son:

1º: Todo lo que aparece en tu mapa, llamémoslo "modelos" (casas, arboles, personas) debe tener unas coordenadas X,Y, ancho y alto. En cada movimiento deberías comprobar que las coordenadas de tu personaje no puedan entrar dentro de las coordenadas de ningún modelo.

Un algoritmo sencillo para detectar estas colisiones es:

/// <summary>
/// Calculale if two rectangles are colisioning between they
/// </summary>
/// <param name="a">Rectangle 1</param>
/// <param name="b">Rectangle 2</param>
/// <returns>bool if an intersection exist if not false</returns>
public static bool RectangleColission( Rectangle a, Rectangle b)
{
    if ( (a.X < b.X + b.Width) && (b.X < a.X + a.Width) && (a.Y < b.Y + b.Height))
    {
        return b.Y < a.Y + a.Height;
    }
     
return false; }

2º: A veces comprobar todas las posiciones de los modelos no es eficiente, sobretodo cuando hay muchos en el mapa. Una solución a ese problema es utilizar mapas de colisiones. Un mapa de colisiones es un mapa paralelo creado a partir del mapa original donde se suelen marcar las zonas que el jugador no puede atravesar con bloques de color, aunque hay muchas implementaciones diferentes.

En este caso, en cada movimiento se debe comprobar el mapa alternativo en vez de el original para detectar estas colisiones.

Espero que te haya servido de algo.

1

Usuarios habituales

  • bLero
  • Vikkktor