Преобразование местоположения экрана в изометрическое расположение плитки с масштабированием

Я пытаюсь перевести положение мыши на экране в конкретную плитку на карте. Используя приведенную ниже функцию, я считаю, что нахожусь в правильном направлении, однако я не могу заставить ее правильно масштабироваться при увеличении. Есть идеи, почему?

Вот функция, которую я использую:

    Vector2 TranslationVectorFromScreen(Vector2 toTranslate)
    {
        Vector2 output = new Vector2();

        toTranslate -= offset; // Offset is the map's offset if the view has been changed

        toTranslate.X /= tileBy2; // tileBy2 is half of the each tile's (sprite) size
        toTranslate.Y /= tileBy4; // tileBy2 is a quarter of the each tile's (sprite) size

        output.X = (toTranslate.X + toTranslate.Y) / 2;
        output.Y = (toTranslate.X - toTranslate.Y) / 2;

        return output;
    }

Согласно моей отладочной информации, X и Y увеличиваются, когда я перемещаю мышь вдоль линий плитки, однако все их значения неверны, потому что масштаб не учитывается. Я пытался включить масштаб в приведенную выше функцию, но везде, где я добавляю его, кажется, что это только усугубляет ситуацию. Для справки: масштаб хранится как число с плавающей запятой, где 1.0f означает отсутствие масштабирования (на всякий случай).

Вот скриншот на случай, если он поможет пролить свет:

введите здесь описание изображения

Изменить:

При изменении функции на приведенную ниже число по-прежнему увеличивается в тех же точках (т. е. увеличивается на 1 или уменьшается на 1 вдоль соответствующей оси на плитку), однако результаты по-прежнему кажутся слишком масштабными. Например, если результаты равны 100, 100, при увеличении масштаба они могут измениться на 50, 50, даже если указатель мыши находится над той же плиткой.

Новая функция:

    Vector2 TranslationVectorFromScreen(Vector2 toTranslate)
    {
        Vector2 output = new Vector2();

        toTranslate -= offset;

        toTranslate.X /= (tileBy2 * scale); // here are the changes
        toTranslate.Y /= (tileBy4 * scale); // 

        output.X = (toTranslate.X + toTranslate.Y) / 2;
        output.Y = (toTranslate.X - toTranslate.Y) / 2;

        return output;
    }

person Lyise    schedule 21.01.2013    source источник


Ответы (1)


Немного повозившись с кодом, я, кажется, нашел решение. Оставлю здесь, вдруг кому пригодится:

    Vector2 TranslationVectorFromScreen(Vector2 toTranslate)
    {
        Vector2 output = new Vector2();
        Vector2 tempOffset = offset; // copy of the main screen offset as we are going to modify this

        toTranslate.X -= GraphicsDevice.Viewport.Width / 2;
        toTranslate.Y -= GraphicsDevice.Viewport.Height / 2;
        tempOffset.X /= tileBy2;
        tempOffset.Y /= tileBy4;

        toTranslate.X /= tileBy2 * scale;
        toTranslate.Y /= tileBy4 * scale;

        toTranslate -= tempOffset;

        output.X = (toTranslate.X + toTranslate.Y) / 2;
        output.Y = (toTranslate.X - toTranslate.Y) / 2;

        output += new Vector2(-1.5f, 1.5f); // Normaliser - not too sure why this is needed

        output.X = (int)output.X; // rip out the data that we might not need
        output.Y = (int)output.Y; // 

        return output;
    }

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

Наконец, вот скриншот, иллюстрирующий его работу в левом верхнем углу:

введите здесь описание изображения

person Lyise    schedule 21.01.2013