Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [Алгоритмы] Изометрия: Позиционирование крупных объектов на тайловой сетке (http://www.flasher.ru/forum/showthread.php?t=212278)

PainKiller 14.01.2016 02:46

Изометрия: Позиционирование крупных объектов на тайловой сетке
 
Вложений: 2
Очень давно я не писал тут, решил вспомнить прошлое))
Никогда не работал с изометрией, только когда то очень давно разбирался с тьюториалом на demiart'e
основные свои знания по этому предмету я почерпнул оттуда. Недавно решил ковырнуть сей предмет снова и сразу споткнулся на таком моменте - как позиционировать на тайловой сетке крупные предметы (крупные в смысле состоящие из нескольких тайлов).
В приведенном тьюториале для позиционирования однотайловых кубиков по клику используется такой код:
Код AS3:

private function onWorldClick(event:MouseEvent):void
{
                        var box:DrawnIsoBox = new DrawnIsoBox( TILE_SIZE, Math.random() * 0xffffff,  BUILDING_HEIGHT);
                        var pos:Point3D = IsoUtils.screenToIso(new Point(_world.mouseX, _world.mouseY));
 
                        pos.x = Math.round(pos.x / TILE_SIZE) * TILE_SIZE;
                        pos.y = Math.round(pos.y / TILE_SIZE) * TILE_SIZE;
                        pos.z = Math.round(pos.z / TILE_SIZE) * TILE_SIZE;
 
                        box.position = pos;
                        _world.addChildToWorld(box);
 
}

На всякий случай привожу функцию пересчета координат в iso из тьюториала
Код AS3:

     /**
                * Из двухмерного пространства в трехмерное, высота у равна нулю.
                * @arg point точка в двухмерном пространстве.
                */

                public static function screenToIso(point:Point):Point3D
                {
                        var xpos:Number = point.y + point.x * .5;
                        var ypos:Number = 0;
                        var zpos:Number = point.y - point.x * .5;
                        return new Point3D(xpos, ypos, zpos);
                }

и он прекрасно работает, и четко вписывает кубик в основание тайла по координатам клика мыши. Но если задать размер кубика в виде size * TILE_SIZE (допустим размером 2 на 2 тайла) то я получаю такую картину:
http://www.flasher.ru/forum/attachme...1&d=1452724903

У синего объекта, размером 2х2 экранные координаты выставлены в 0, 0 (т.е. он должен вписываться в крайний верхний квадрат 2х2 тайлов) но наблюдается смещение которое меняется в зависимости от размера объекта. Бьюсь уже весь вечер и формулу нащупать не получается, даже непонятно какая из этих двух функций виновата, и даже не знаю что почитать.

Заранее спасибо за помощь, проект прикрепляю (сделан в FB 4.7)

alatar 14.01.2016 12:23

У вас боксы и плитки неправильно отрисовываются. Работать будет только для случая, когда размеры равны 1х1 тайл.

Добавлено через 29 минут
Должно быть как-то так:
DrawnIsoTile
Код AS3:

protected function draw():void
{
        graphics.clear();
        graphics.beginFill(_color);
        graphics.lineStyle(0, 0, .5);
        graphics.lineTo(size, size * .5);
        graphics.lineTo(0, size);
        graphics.lineTo(-size , size * .5);
        graphics.lineTo(0, 0);
}

DrawnIsoBox
Код AS3:

override protected function draw():void
{
        graphics.clear();
        var red:int = _color >> 16;
        var green:int = _color >> 8 & 0xff;
        var blue:int = _color & 0xff;
 
        var leftShadow:uint = (red * .5) << 16 | (green * .5) << 8 | (blue * .5);
        var rightShadow:uint = (red * .75) << 16 | (green * .75) << 8 | (blue * .75);
 
        var h:Number = _height * Y_CORRECT;
        // draw top
        graphics.beginFill(_color);
        graphics.lineStyle(0, 0, .5);
        graphics.moveTo(0, -h);
        graphics.lineTo(size, size * .5 - h);
        graphics.lineTo(0, size - h);
        graphics.lineTo(-size , size * .5 - h);
        graphics.lineTo(0, -h);
 
        graphics.endFill();
 
        // draw left
        graphics.beginFill(leftShadow);
        graphics.lineStyle(0, 0, .5);
        graphics.moveTo(-size , size * .5 - h);
        graphics.lineTo(0, size - h);
        graphics.lineTo(0, size);
        graphics.lineTo(-size , size * .5);
        graphics.lineTo(-size , size * .5 - h);
        graphics.endFill();
 
        // draw right
        graphics.beginFill(rightShadow);
        graphics.lineStyle(0, 0, .5);
        graphics.moveTo(0, size - h);
        graphics.lineTo(size, size * .5 - h);
        graphics.lineTo(size, size * .5);
        graphics.lineTo(0, size);
        graphics.lineTo(0, size - h);
        graphics.endFill();
}


PainKiller 14.01.2016 22:15

Действительно все работает, alatar спасибо большое, вы как всегда выручили. Чуть попозже, попробую изменить код так чтобы можно было строить строение размера например 1 х 3 или 3 х 1, а не только квадратные как сейчас


Часовой пояс GMT +4, время: 17:34.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.