Cómo simplificar la detención del movimiento de la imagen cuando se encuentra dentro del umbral del objetivo

StackOverflow https://stackoverflow.com/questions/2076388

  •  21-09-2019
  •  | 
  •  

Pregunta

Ya intenté explicar a los demás lo que intento hacer y fracasé terriblemente.Por lo tanto, si me disculpan, simplemente les mostraré el código e intentaré explicarlo un poco.

        if (MovePetMoving)
        {
            if (MovePetSlope[0] > 0)
            {
                if (MovePetSlope[1] > 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSlope[0] <= MovePetTarget[0] && Convert.ToDouble(pictureBoxPet.Location.Y) + MovePetSlope[1] <= MovePetTarget[1])
                {
                    MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
                    //MsgBox("MovePetSlope[0] > 0 and MovePetSlope[1] > 0", "");
                }
                else if (MovePetSlope[1] < 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSlope[0] <= MovePetTarget[0] && Convert.ToDouble(pictureBoxPet.Location.Y) + MovePetSlope[1] >= MovePetTarget[1])
                {
                    MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
                    //MsgBox("MovePetSlope[0] > 0 and MovePetSlope[1] < 0", "");
                }
                else
                {
                    MovePetMoving = false;
                    //MsgBox("Error", "");
                }
            }
            else if (MovePetSlope[0] < 0)
            {
                if (MovePetSlope[1] > 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSlope[0] >= MovePetTarget[0] && Convert.ToDouble(pictureBoxPet.Location.Y) + MovePetSlope[1] <= MovePetTarget[1])
                {
                    MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
                    //MsgBox("MovePetSlope[0] < 0 and MovePetSlope[1] > 0", "");
                }
                else if (MovePetSlope[1] < 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSlope[0] >= MovePetTarget[0] && Convert.ToDouble(pictureBoxPet.Location.Y) + MovePetSlope[1] >= MovePetTarget[1])
                {
                    MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
                    //MsgBox("MovePetSlope[0] < 0 and MovePetSlope[1] < 0" + Convert.ToString(pictureBoxPet.Location.X) + MovePetSlope[0] + MovePetTarget[0], "");
                }
                else
                {
                    MovePetMoving = false;
                    //MsgBox("Error", "");
                }
            }
        }

    }

Ahí está.Si te preguntas acerca de todas las referencias a "mascota", estoy haciendo un juego tipo tamogotchi (o como se escriba) para mi hermanita pequeña.

El problema que tengo es que el valor de MovePetSlope[1] o [0] puede ser positivo o negativo.Se me ocurrieron algunas comparaciones que funcionan para valores positivos, pero ninguna para valores negativos.Creo que en su estado actual no funciona en absoluto.

Cualquier ayuda sería muy apreciada.

¡Gracias de antemano!

¿Fue útil?

Solución

Intente usar Math.Abs ​​para simplificar sus comparaciones.En general la mascota debe seguir moviéndose hasta Math.Abs(pictureBoxPet.Location.X-MovePetTarget[0]) < Math.Abs(MovePetSlope[0]) y de manera análoga para Y y 1.Deberías terminar con mucho código más simple.

Si su mascota se mueve directamente hacia el objetivo, esto debería funcionar:

if (MovePetMoving)
{
    if (Math.Abs(pictureBoxPet.Location.X-MovePetTarget[0]) < Math.Abs(MovePetSlope[0]))
        MovePetMoving = false;
    else
        MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
}

Otros consejos

Una estrategia diferente:

  1. definir una variable de tipo rectangular que contiene los límites objetivos en pantalla las coordenadas:. Aumentar los límites cuando sea necesario de acuerdo con alguna variable umbral se define

  2. definir MouseUp y MouseDown controladores de eventos para el PictureBox

  3. definir una variable booleana (en forma de alcance) que se establece en verdadero cuando el ratón se cae (en el MouseDown controlador de eventos) en el cuadro de imagen, y falso en el controlador MouseUp para el PictureBox.

  4. definir un controlador MouseMove de eventos de la PictureBox en los que:

    a. si la variable booleana es verdadera (ratón está presionado)

    1. utilizar el método Rectangle.IntersectsWith para ver si los límites actuales de la PictureBox se solapa con el rectángulo límites de destino. MSDN rectángulo. IntersectsWith :. si lo hace usted sabe que puede detener

mi humilde opinión, el uso de este stragety puede escribir código muy simplificado.

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