Come semplificare l'arresto del movimento dell'immagine quando si trova all'interno della soglia del target
-
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!
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:
-
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
-
definire MouseUp e MouseDown gestori di eventi per il controllo PictureBox
-
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.
-
definire un gestore MouseMove eventi per il controllo PictureBox in cui:
a. se la variabile booleana è vero (mouse è in basso)
- 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.