Come semplificare l'arresto del movimento dell'immagine quando si trova all'interno della soglia del target

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

  •  21-09-2019
  •  | 
  •  

Domanda

Ho già provato a spiegare cosa sto cercando di fare agli altri e ho fallito orribilmente.Pertanto, se vuoi scusarmi, ti mostrerò semplicemente il codice e cercherò di spiegarlo un po'.

        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", "");
                }
            }
        }

    }

Eccolo.Se ti stai chiedendo quali sono i riferimenti a "animale domestico", sto creando un gioco simile al tamogotchi (o come lo scrivi) per la mia sorellina.

Il problema che ho è che il valore di MovePetSlope[1] o [0] può essere positivo o negativo.Ho trovato alcuni confronti che funzionano per valori positivi, ma nessuno per valori negativi.Credo che allo stato attuale non funzioni affatto.

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie in anticipo!

È stato utile?

Soluzione

Prova a utilizzare Math.Abs ​​per semplificare i confronti.In generale l'animale dovrebbe continuare a muoversi fino al Math.Abs(pictureBoxPet.Location.X-MovePetTarget[0]) < Math.Abs(MovePetSlope[0]) e analogamente per Y e 1.Dovresti finire con tanto codice più semplice.

Se il tuo animale domestico si sta muovendo direttamente verso il bersaglio, questo dovrebbe funzionare:

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]);
}

Altri suggerimenti

Una strategia diversa:

  1. definire una variabile di tipo Rectangle che contiene i target limiti a schermo coordinate:. Aumentare i limiti, se necessario, secondo alcuni variabile di soglia si definisce

  2. definire MouseUp e MouseDown gestori di eventi per il controllo PictureBox

  3. definire una variabile booleana (in ambito form) che viene impostata su true quando il mouse va giù (nel gestore di eventi MouseDown) sulla PictureBox, e falso nel gestore MouseUp per il controllo PictureBox.

  4. definire un gestore MouseMove eventi per il controllo PictureBox in cui:

    a. se la variabile booleana è vero (mouse è in basso)

    1. utilizzare il metodo Rectangle.IntersectsWith per vedere se i limiti attuali della PictureBox si sovrappone al rettangolo di limiti di destinazione. MSDN rettangolo. IntersectsWith :. se lo fa si conosce si può fermare

imho, utilizzando questo stragety è possibile scrivere codice molto semplificato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top