[XNA] Jugando con las Leyes de Newton con XNA (I de II)

Las maravillosas leyes de newton… ¿quién no las recuerda? No nos engañemos, son amadas y “odiadas” por igual. Pero vayamos a ver un ejemplo basado en XNA, que seguro que lo hará más ameno (lástima que no estaba XNA cuando estudié esto :-P).

No voy a dar la vara recordando las leyes de newton… pero sí que enumeraré, a modo de recordatorio, lo que podemos calcular con ellas:

  • I = m · v (I= Inercia, m = masa, v = velocidad)
  • A = F/m (F = Fuerza, a = aceleración, m = masa)
  • Para cada acción, existe una reacción opuesta (esto lo veremos en la segunda parte del artículo con mayor detalle)

A partir de estas leyes, conociendo muy poco XNA, y paciencia, queremos hacer una pantalla en la que aparezcan objetos, los cuales al ser “clicados” con el ratón, se desplacen en base a unas leyes de newton.

En la segunda parte del artículo, utilizaremos la tercera ley de newton para detectar las colisiones entre unos objetos y otros (en la primera parte sólo se detectará la colisión entre el puntero del ratón y el propio objeto).

Lo que vamos a obtener con el código de esta primera parte es algo parecido a lo siguiente:
Lo primero que haremos es crear nuestro proyecto XNA y añadir una clase, la llamaremos “ObjetoFisico”. Muestro los atributos privados más destacados (son bastante autodescriptivos):

  • public Vector2 posicion
  • public Vector2 acceleracion
  • public Vector2 velocidad
  • public Vector2 friccion: indica la fuerza de fricción en un momento determinado
  • public float masa: masa del objeto
  • const float coeficienteFriccion: coeficiente de fricción (es un porcentaje sobre la velocidad)
  • public Texture2D textura: representa la textura que se “pintará” en pantalla

Básicamente lo que haremos será construir una lista de objetos de tipo “ObjetoFisico” y repartirlos por la pantalla. Con el constructor (public ObjetoFisico(Vector2 inPosicion, Texture2D inTextura)) de esta clase podremos inicializar la posición al valor deseado, así como la textura. La aceleración y velocidad son de uso interno, y las inicializaremos a cero (Vector2.Zero).

Ahora vamos a construir la lógica del objeto. Crearemos un método público: Update(). Este calculará la fricción, aceleración, velocidad, y finalmente posición. Además leerá el “input” del usuario. Pulsando el botón izquierdo del ratón sobre el objeto alteraremos su posición. Cuanto más cerca del centro del objeto pinchemos, con mayor aceleración este será “despedido”. Esto lo hacemos con las líneas de código siguientes:

// Establecemos el vector fuerza, cuanto más cerca del centro “impacte” el puntero del objeto
// más suave será la fuerza

Vector2 fuerza = new Vector2(posicion.X – Mouse.GetState().X + this.textura.Width / 2, posicion.Y – Mouse.GetState().Y + this.textura.Height / 2);

// Ahora aplicaremos la fuerza a la aceleración del objeto (según newton aceleración = fuerza / masa), así pues…

this.acceleracion.X += (fuerza.X * 10) / masa;
this.acceleracion.Y += (fuerza.Y * 10) / masa;

Para terminar con la clase, añadiremos un método que dibuje el objeto en pantalla “Draw()”.

La clase principal de la aplicación -Game.cs- inicializará una lista de “ObjetoFisico”, con valores más o menos aleatorios, y una textura predeterminada. El método update() y draw() de esta clase se limitarán a recorrer la lista de objetoFisico y llamar a los respectivos métodos: Update() y Draw(). Esto es así de sencillo:
Para el método Update():

// Actualizamos todos los objetos de la lista

foreach (ObjetoFisico objeto in objetos)
{

    objeto.Update(gameTime);

}

Finalmente ejecutamos y pulsamos sobre los “objetos” que hay por la pantalla. Veremos como los objetos se mueven con una aceleración proporcional a la distancia del centro de la textura respecto la cual hagamos click. Los objetos llegarán al estado de reposo (1a ley de newton) gracias a la fricción.

En el próximo “episodio” los objetos podrá interactuar unos con otros (rebotando básicamente), completando este experimento.

Podéis encontrar el código adjunto a este artículo

5 comentarios en “[XNA] Jugando con las Leyes de Newton con XNA (I de II)”

  1. Muy buenas Jesús,
    Estupendo que ya te hayas puesto a contar cosas interesantes…y XNA mola, no hay mucha gente en Geeks que trate el tema.

    JC’s

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *