Movimiento de un objeto cada x tiempo 2D
-
jueves, 29 de marzo de 2012 8:48
Estoy intentando mover un objeto para que se mueva el solo cada x tiempo pero no lo consigo, la logica de la accion es, yo pincho con el raton en el objeto y luego pincho en otro luegar del mapa y quiero que se desplace a ese lugar, lo he intentado hacer para que cada x segundos se desplace un pixel a la derecha, os dejo el codigo por si me podeis echar un cable.
private MouseState ms, mouseStatePrevious; private bool seleccionado = false; private Rectangle = new Rectangle(200, 200, 40, 40); private float timer = 1000.0f; private float timeRemaining = 0.0f; public void Update(GameTime gameTime) { ms = Mouse.GetState(); KeyboardState ks = Keyboard.GetState(); if (ms.LeftButton == ButtonState.Pressed && mouseStatePrevious.LeftButton == ButtonState.Released && seleccionado == true) { while (posSprite01.X < ms.X) { if (timeRemaining == 0.0f) { posSprite01.X += 1; timeRemaining = timer; } timeRemaining = MathHelper.Max(0.0f, timeRemaining - (float)gameTime.ElapsedGameTime.TotalSeconds); } seleccionado = false; } }
Todas las respuestas
-
jueves, 29 de marzo de 2012 10:52
Buenas,
supongo que el estado seleccionado lo calculas previamente y que esto se ejecuta cuando haces el click en la posicion de destino
if (ms.LeftButton == ButtonState.Pressed && mouseStatePrevious.LeftButton == ButtonState.Released && seleccionado == true)
{
posFinal = new Vector2(ms.X, ms.Y);
seleccionado = false;
}
posSprite01 = posSprite01 + (posFinal - PosSprite01) * 0.1f;
if (Vector2.LengthSquared(posSprite01 , posFinal)>0.05f) posSprite01 = posFinal;
Lo puedes hacer en un tiempo determinado, pero te complica la vida, y esto hace un bonito efecto de aceleración,
quizas tengas que cambiar el factor 0.1f por otro, ya que lo he puesto a ojo;
si lo quieres por tiempo,
if (ms.LeftButton == ButtonState.Pressed && mouseStatePrevious.LeftButton == ButtonState.Released && seleccionado == true)
{
posFinal = new Vector2(ms.X, ms.Y);
recorrido = posFinal - posSprite01;
tiempo_andando = recorrido.Length() / velocidad;
recorrido.Normalize();
seleccionado = false;
}
if (tiempo_andando>0) {
tiempo_andando -= gametime.elapsedtime.totalseconds;
if (tiempo_andando>0) {
tiempo_andando = 0;
posSprite01 = posFinal;
} else {
posSprite01 += recorrido * gametime.elapsed.totalseconds;
}
}
No lo he probado pero deberia funcionar...
Un saludo
Tambien conocido como Blau www.youtube.com/malditis www.charcostudios.com
- Marcado como respuesta hectorrp jueves, 29 de marzo de 2012 10:56
- Editado CharcoStudios jueves, 29 de marzo de 2012 11:07

