Pergunta

Eu já tentei explicar o que estou tentando fazer com os outros e falhei terrivelmente. Portanto, se você vai me desculpar, mostrarei o código e tentarei explicar um pouco.

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

    }

Aí está. Se você está se perguntando sobre todas as referências a "animais de estimação", estou fazendo um tamogotchi (ou como você soletra) como jogo para minha irmãzinha.

O problema que tenho é que o valor do MovePetslope [1] ou [0] pode ser positivo ou negativo. Eu criei algumas comparações que funcionam para valores positivos, mas nenhum para valores negativos. Eu acredito que, no seu estado atual, não funciona.

Qualquer ajuda seria muito apreciada.

Desde já, obrigado!

Foi útil?

Solução

Tente usar o Math.abs para simplificar suas comparações. Em geral, o animal de estimação deve continuar se movendo até Math.Abs(pictureBoxPet.Location.X-MovePetTarget[0]) < Math.Abs(MovePetSlope[0]) e analogamente para y e 1. você deve acabar com Muito de código mais simples.

Se o seu animal de estimação estiver se movendo diretamente em direção ao alvo, isso deve fazer o truque:

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

Outras dicas

Uma estratégia diferente:

  1. Defina uma variável de retângulo de tipo que mantém os limites dos alvos nas coordenadas da tela: aumente os limites conforme necessário de acordo com alguma variável limite que você define.

  2. Defina os manipuladores de eventos MouseUp e Mousedown para o PictureBox

  3. Defina uma variável booleana (no escopo do formulário) que é definido como true quando o mouse desce (no manipulador de eventos de Mousedown) na caixa de imagem e false no manipulador de mouseup para o PictureBox.

  4. Defina um manipulador de eventos Mousemove para a caixa de imagem em que:

    uma. Se a variável booleana for verdadeira (o mouse está inativo)

    1. Use o método Rectangle.InterSectSwith para verificar se os limites de corrente da caixa de imagem se sobrepõem ao retângulo dos limites de destino. Msdn retangle.intersectSwith : se você sabe, você pode parar.

IMHO, usando essa velocidade, você pode escrever um código muito simplificado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top