Изометрический экран для отображения карты - PullRequest
0 голосов
/ 27 февраля 2012

Я знаю, что по поводу изометрической карты много советов, но я прочитал большинство из них и не решил мою проблему. Я переписываю код для C # для большей простоты (этот код будет использоваться на платформе Android) Мне нужно привести экранные шнуры в изометрические координаты.

Итак, я использовал плитки 1: 2 для себя 64x32, я строю карту алмазов, используя этот код

private void drawIsoGrid(PaintEventArgs e)
{
    for(int y=0;y<20;y++)
        for(int x=0;x<20;x++)
        {
            float rx = (x - y) * (surface.Width) / 2 - globX;
            float ry = (x + y) * (surface.Height) / 2 - globY;
            e.Graphics.DrawImage(surface,rx,ry);
        }

Я также использую глобальный якорь для прокрутки моей карты. код здесь

protected override void OnMouseMove(MouseEventArgs e)
{
    mouseCoordsX = e.X;
    mouseCoordsY = e.Y;
    if(e.Button==MouseButtons.Left)
    {
        globX += prevX - e.X;
        globY += prevY - e.Y;
        this.Invalidate();
    }
    prevX = e.X;
    prevY = e.Y;            
}

Главный вопрос - как получить плитку под мышкой, формула которой будет полезна для меня.

1 Ответ

0 голосов
/ 30 июля 2012

Поскольку на этот вопрос пока нет ответа, и это один из лучших результатов для "изометрического экрана", я решил ответить на это (не говоря уже о том, что я только что закончил).

Поскольку у вас есть функция, которая отображает изо-сетку на экранные координаты, и это линейное преобразование с обратным, мы можем просто вернуться назад, чтобы получить другую функцию. Итак, давайте сделаем это.

Мы хотим перейти от:

rx = (x - y) * (surface.Width) / 2 - globX
ry = (x + y) * (surface.Height) / 2 - globY

до:

x = <something>
y = <something>

Проще всего решить их одновременно. Добавьте глобалы к обеим сторонам:

rx + globX = (x - y) * (surface.Width) / 2
ry + globY = (x + y) * (surface.Height) / 2

Разделите на (surface.Width) / 2 и (surface.Height) / 2:

(rx + globX) / (surface.Width / 2)  = x - y
(ry + globY) / (surface.Height / 2) = x + y

Почти готово, давайте сложим оба уравнения вместе, чтобы избавиться от y:

(rx + globX) / (surface.Width / 2) + (ry + globY) / (surface.Height / 2) = 2 * x

Теперь, чтобы избавиться от x, вычтите первое уравнение из второго:

(ry + globY) / (surface.Height / 2) - (rx + globX) / (surface.Width / 2) = 2 * y

Разделите оба уравнения на 2, и мы предварительно сделали:

x = ((rx + globX) / (surface.Width / 2) + (ry + globY) / (surface.Height / 2)) / 2
y = ((ry + globY) / (surface.Height / 2) - (rx + globX) / (surface.Width / 2)) / 2

Круто, теперь у вас есть координаты сетки в терминах экрана. Давайте разберемся с этим, поскольку у нас в основном (a / (b / c)) / c, что совпадает с a / b, мы можем избавиться от c, в данном случае 2:

x = (rx + globX) / surface.Width + (ry + globY) / surface.Height
y = (ry + globY) / surface.Height - (rx + globX) / surface.Width

Таким образом, вы должны иметь возможность написать функцию, которая занимает на экране позиции x и y и возвращает позиции сетки x и y. Я не очень хорошо знаком с c #, поэтому я не знаю, как он обрабатывает значения с плавающей точкой, которые должны быть целыми числами, но, поскольку вы работаете с этим на Android, я полагаю, это не имеет большого значения.

...