Pregunta

he estado tratando de ida y vuelta, pero no puedo averiguar la matemáticas sobre cómo desplazarse mi punto de vista (o más bien compensado todos los objetos) cuando se utiliza el gesto de película. Me gustaría que el desplazamiento a tener algún tipo de facilidad de salida.

    public override void Update(GameTime gameTime, bool otherScreenHasFocus, bool coveredByOtherScreen)
    {
        float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;

        //Some math to change 'matrixOffsetY'
        //I use 'matrixOffsetY' to offset my objects in Draw()

        base.Update(gameTime, otherScreenHasFocus, coveredByOtherScreen);
    }

Este es el evento de gesto

    public override void HandleInput(InputState input)
    {
        if (input == null)
            throw new ArgumentNullException("input");

        while (TouchPanel.IsGestureAvailable)
        {
            GestureSample gesture = TouchPanel.ReadGesture();

            switch (gesture.GestureType)
            {
                case GestureType.Flick:
                    {
                        //Set a variable with some math? Using:
                        //gesture.Delta

                        //gesture.Delta gives us pixels/sec
                        break;
                    }
                default: return;
            }
        }
    }

Esto no debería ser tan difícil, pero tengo un cerebro-congelación :) me ayude por favor hacia fuera!

¿Fue útil?

Solución

Puede "lerp" (lineal interpolar) entre dos valores que se hacen cada vez más cerca (a partir rápido, terminando poco a poco).

Asumo que está desplazándose en 2D. Por lo que la posición es un Vector2.

intentar algo como esto:

position; //current position of the object.
targetPosition; //set by scrolling, position should gradually come close to this
float weigth; //how much the weight is of the targetPosition compared to the position
//practically this means how fast position approaches targetPosition. 
//First try values between 0 and 1, for example 0.8f for starters.
public void Scroll(Vector2 ammount)
{
   //We assume scrolling the scrollbar 1 pixel down, means the object should go 1 pixel up.
   //So the targetPosition should move the same ammount opposite.
   //If you don't want scrolling to correspond 1:1, you can multiply ammount by a float.
   targetPosition -= ammount;   
}

public void Update(GameTime gameTime)
{
    //..
    //Executed every update, position closes in on targetPosition pretty fast.     
    position = Vector2.Lerp(position, targetPosition, weigth);

    //Because we Lerp position will only get extremely close to targetPosition. Never exactly at it.
    //most of the time this is good enough, if this isnt use the following code

    float omega = 0.05f; // the minimum dinstance between position and targetPosition before we clamp
    if(Vector2.Distance(position, targetPosition) < omega)
    {
        position = targetPosition;
    }
    //..
}

public void Draw(GameTime gameTime)
{
    //..
    spriteBatch.Begin();
    spriteBatch.Draw(texture, position, Color.White);
    spriteBatch.End();
    //..
}

Otros consejos

Asumo que quiere decir con "aliviar a cabo" que lo hace poco a poco lo que se supone que debe hacer (que no estoy muy claro en (no sé mucho acerca de paneles táctiles y gestos).

Hay varias maneras de hacer esto. Se podría adoptar un enfoque físico y la ley de Newton uso y simplemente resolver la ecuación diferencial.

La forma general hago este tipo de cosas (como una parada gradual cuando se desplaza una ventana con el ratón), es simplemente reducir la velocidad gradualmente usando alguna función con parámetros que puedo modificar para conseguir la sensación que quiero.

En su caso, he entiendo lo que tratamos de hacer, lo único que desea actualizar la posición en base a la velocidad.

Supongamos que estás haciendo en forma horizontal (en general, que va a hacer que para 2D),

X_new = X_old + velocidad * dt velocidad = max (0, velocidad * 0,95 hasta 0,2)

Lo que esto hace que se mueven gradualmente la coordenada x (X_old convierte X_new cada vez a través del bucle (que se le suele hacer en un hilo)) de manera que en lugar de detenerse por completo continúa moviéndose hasta que la velocidad ha llegado a cero. Yo uso una simple función pow a reducirlo gradualmente, pero se puede llegar a cualquier tipo de función.

También puede realmente tener en cuenta la distancia del puntero hasta el borde. Lo hago en uno de mis programas, de manera que cuando el cursor del ratón se mueve fuera del borde de la velocidad se desplaza depende de lo lejos (Así que si quieres desplaza un poco se mueve un poco y muchos se mueve mucho).

Tenga en cuenta que tendrá que manejar esto en un hilo probablemente porque es algo que sigue ocurriendo. También se podría calcular la aceleración y el uso de la física simples para calcular la posición basada en ella. x = x0 + x '* t + 1/2 * x' '* t ^ 2 tipo de cosas.

Como de costumbre, si se trata de XNA, Shawn ha resuelto probablemente su problema ya. En un par de mensajes, explica transiciones utilizando Lerp, SmoothStep y otras operaciones matemáticas , y una la física enfoque basado en . Los ejemplos utilizan el proyecto de Gestión de juego del estado, pero las ideas se pueden utilizar en cualquier lugar.

Y, por cierto, es posible que desee considerar no mover todos los objetos a su alrededor con respecto a la cámara. Puede almacenar un vector2 o cameraOffset vector3 en algún lugar y utilizar un transformMatrix en SpriteBatch.Begin. Por supuesto, esto es muy útil si se utiliza uno o dos ciclos SpriteBatch para pintar todos sus objetos del mundo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top