перемещение прямоугольников один за другим

#c# #xna

#c# #xna

Вопрос:

Я создал несколько прямоугольников в своей программе XNA. Следующий шаг — выбрать их и перемещать один за другим.

Чтобы выбрать их, я использую код

 MouseState mouse = Mouse.GetState();

bool IsSelect1=false;
bool IsSelect2 = false;
bool IsSelect3 = false;
int IsSelectNum=0;

//To set the value of IsSelectNum
if ((mouse.X > drawRectangle.X amp;amp; mouse.X <= mouse.X   currentCharacter.Width
   amp;amp; mouse.Y >= drawRectangle.Y amp;amp; mouse.Y <= drawRectangle.Y   currentCharacter.Height) 
   amp;amp; (mouse.LeftButton == ButtonState.Pressed))
            { IsSelectNum = 1; }

else if ((mouse.X > drawRectangle2.X amp;amp; mouse.X <= mouse.X   currentCharacter2.Width
   amp;amp; mouse.Y >= drawRectangle2.Y amp;amp; mouse.Y <= drawRectangle2.Y   currentCharacter2.Height)
   amp;amp; (mouse.LeftButton == ButtonState.Pressed))
            { IsSelectNum = 2; }

else if ((mouse.X > drawRectangle3.X amp;amp; mouse.X <= mouse.X   currentCharacter3.Width
   amp;amp; mouse.Y >= drawRectangle3.Y amp;amp; mouse.Y <= drawRectangle3.Y   currentCharacter3.Height)
   amp;amp; (mouse.LeftButton == ButtonState.Pressed))
            { IsSelectNum = 3; }

//To choose figure using switch function
switch (IsSelectNum)
{
    case 1:
        IsSelect1 = true;
        break;
    case 2:
        IsSelect2 = true;
        break;
    case 3:
        IsSelect3 = true;
        break;
    default:
        break;
}
 

Для их перемещения я использую

     //If selective, then it can be moved
    if (IsSelect1 == true)
    {
        drawRectangle.X = mouse.X - currentCharacter.Width / 2;
        drawRectangle.Y = mouse.Y - currentCharacter.Width / 2;

        //To finally locate figure in the top
        if (drawRectangle.X <= 70 amp;amp; drawRectangle.Y <= 15)
        {
            drawRectangle.X=50;
            drawRectangle.Y=10;
            IsSelect1 = false;
            IsSelectNum = 0;
        }
    }

    else if(IsSelect2==true)
   {
    drawRectangle2.X = mouse.X - currentCharacter2.Width / 2;
    drawRectangle2.Y = mouse.Y - currentCharacter2.Width / 2;
    //To finally locate figure in the top
    if (drawRectangle2.X  >= 250 amp;amp; drawRectangle2.X <= 320 amp;amp; drawRectangle2.Y <= 15)
    {
        drawRectangle2.X = 280;
        drawRectangle2.Y = 10;
        IsSelect2 = false;
        IsSelectNum = 0;
    }
   }

 else if (IsSelect3 == true)
   {
    drawRectangle3.X = mouse.X - currentCharacter3.Width / 2;
    drawRectangle3.Y = mouse.Y - currentCharacter3.Width / 2;
    //To finally locate figure in the top
    if (drawRectangle3.X >= 400 amp;amp; drawRectangle3.X <= 520 amp;amp; drawRectangle3.Y <= 15)
    {
        drawRectangle3.X = 510;
        drawRectangle3.Y = 10;
        IsSelect3 = false;
        IsSelectNum = 0;
    }

   }
 

Однако здесь что-то не совсем так. После того, как я переместил один прямоугольник и хочу переместить другой. Но я не могу отменить выбор предыдущего прямоугольника. Что я должен изменить, пожалуйста?

Дополнительные обновления. Спасибо dbc, я исправляю свой код следующим образом

Я исправляю код следующим образом: `bool Select1 = true; bool Select2 = true; bool Select3 = true;

         int IsSelectNum=0;

        //To set the value of IsSelectNum
        if ((mouse.X > drawRectangle.X amp;amp; mouse.X <= drawRectangle.X   currentCharacter.Width
           amp;amp; mouse.Y >= drawRectangle.Y amp;amp; mouse.Y <= drawRectangle.Y   currentCharacter.Height) 
           amp;amp; (mouse.LeftButton == ButtonState.Pressed))
        { IsSelectNum = 1; }

        else if ((mouse.X > drawRectangle2.X amp;amp; mouse.X <= drawRectangle2.X   currentCharacter2.Width
           amp;amp; mouse.Y >= drawRectangle2.Y amp;amp; mouse.Y <= drawRectangle2.Y   currentCharacter2.Height)
           amp;amp; (mouse.LeftButton == ButtonState.Pressed))
                    { IsSelectNum = 2; }

        else if ((mouse.X > drawRectangle3.X amp;amp; mouse.X <= drawRectangle3.X   currentCharacter3.Width
           amp;amp; mouse.Y >= drawRectangle3.Y amp;amp; mouse.Y <= drawRectangle3.Y   currentCharacter3.Height)
           amp;amp; (mouse.LeftButton == ButtonState.Pressed))
                    { IsSelectNum = 3; }

        //To choose figure using switch function
        switch (IsSelectNum)
        {
            case 1:
                if(Select1){
             drawRectangle.X = mouse.X - currentCharacter.Width / 2;
             drawRectangle.Y = mouse.Y - currentCharacter.Width / 2;

                    //To finally locate figure in the top
                    if (drawRectangle.X <= 70 amp;amp; drawRectangle.Y <= 15)
                    {
                        drawRectangle.X = 50;
                        drawRectangle.Y = 10;
                        Select1 = false;

                    }
                }
                break;

            case 2:
                if (Select2)
                {
                    drawRectangle2.X = mouse.X - currentCharacter2.Width / 2;
                    drawRectangle2.Y = mouse.Y - currentCharacter2.Width / 2;
                    //To finally locate figure in the top
                    if (drawRectangle2.X >= 250 amp;amp; drawRectangle2.X <= 320 amp;amp; drawRectangle2.Y <= 15)
                    {
                        drawRectangle2.X = 280;
                        drawRectangle2.Y = 10;
                        Select2 = false;
                    }
                }
                break;

            case 3:
                if (Select3)
                {
                    drawRectangle3.X = mouse.X - currentCharacter3.Width / 2;
                    drawRectangle3.Y = mouse.Y - currentCharacter3.Width / 2;
                    //To finally locate figure in the top
                    if (drawRectangle3.X >= 400 amp;amp; drawRectangle3.X <= 520 amp;amp; drawRectangle3.Y <= 15)
                    {
                        drawRectangle3.X = 510;
                        drawRectangle3.Y = 10;
                        Select3 = false;

                    }
                }
                break;

            default:
               break;
        } 
 

`

Кажется, все в порядке. Пожалуйста, есть еще какие-нибудь предложения?

Ответ №1:

Непонятно, что вы здесь делаете, но в XNA MouseState — это переменная состояния, а не переменная события, поэтому mouse .leftButton == buttonState .Нажатое остается истинным, пока пользователь удерживает левую кнопку мыши нажатой.

Если вы хотите вызвать что-то при изменении состояния мыши, например, при нажатии вниз, вам нужно запомнить предыдущее состояние и сравнить его с текущим состоянием. Для получения более подробной информации см., Например, Эту статью: Ввод и обработка XNA с помощью мыши.

Кстати, ваши проверки, чтобы увидеть, выбран ли прямоугольник, выглядят подозрительно. Проверки обрабатывают X и Y асимметрично, что мне кажется неправильным, хотя вы не определили ни один из этих объектов для нас. Может быть, следующее будет работать лучше?

         if ((mouse.X >= drawRectangle.X amp;amp; mouse.X <= drawRectangle.X   currentCharacter.Width
           amp;amp; mouse.Y >= drawRectangle.Y amp;amp; mouse.Y <= drawRectangle.Y   currentCharacter.Height)
 

Кстати, вы должны извлечь это в надлежащий метод.

Комментарии:

1. Привет, дорогой dbc. Большое спасибо за подсказку. Я исправил проблему в соответствии с вашими советами. Да, ваш код верен. Раньше у меня была опечатка. Кстати, то, что я хочу сделать в своем коде, это то, что когда я нажимаю левую кнопку, я выбираю прямоугольник и перемещаю его туда, где я хочу, чтобы он был.

Ответ №2:

Хотя @dbc, безусловно, отвечает на ваш вопрос, я чувствую, что нужно нечто большее.

Я бы посоветовал вам создавать прямоугольник в каждом кадре, основываясь на координатах мыши X / Y и ширине / высоте символов. Таким образом, вы можете использовать встроенный прямоугольник.Пересечение или Прямоугольник.Содержит методы.

Также составьте список прямоугольников (или во что бы вы их ни завернули. Блоки, Npc, w/ e). Затем создайте метод, который возвращает выбранную модель, например:

 public Rectangle? GetSelected(List<Rectangle> squares)
{
    Rectangle mousePosition = new Rectangle(mouseX, mouseY, charWidth, charheight);

    foreach (var rect in squares)
    {
        if (rect.Contains(mousePosition))
        {
            return rect;
        }
    }

    return null;
}
 

Затем проверьте, возвращает ли функция getSelected() значение null . Если это так, курсор в данный момент не наведен ни на что.
Однако, если это не так, теперь вы можете перемещать указанный прямоугольник, потому что у вас есть ссылка на него.

Примечание: на самом деле это не будет работать с прямоугольниками из-за того, что прямоугольник является структурой. И структуры ПЕРЕДАЮТСЯ НЕ по ссылке, а по Значению. Это означает, что прямоугольник, который вы получаете из getSelected() , будет просто представлением выбранного вами квадрата, но не самого квадрата. Это означает, что если вы измените X, Y, ширину или высоту, они не будут изменены в прямоугольниках в списке.

Вот почему я лично всегда рекомендую иметь оболочку вокруг всех типов структур, которые вы «подключили» к чему-либо. Например, Вектор2 для определения положения. Пусть это будет свойство в классе «GameObject» и всегда ссылайтесь на весь класс. Таким образом, при редактировании содержимого Position все равно будет изменена правильная позиция GameObject.

Для получения дополнительной информации я настоятельно рекомендую КАК прочитать больше о различиях между структурами и классами, так и поиграть с этим самостоятельно, чтобы увидеть, как это работает.

Комментарии:

1. Спасибо за это. Я буду работать над классом и скоро добавлю новые обновления