Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.01.2016, 02:46
PainKiller вне форума Посмотреть профиль Отправить личное сообщение для PainKiller Найти все сообщения от PainKiller
  № 1  
Ответить с цитированием
PainKiller
 
Аватар для PainKiller

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
По умолчанию Изометрия: Позиционирование крупных объектов на тайловой сетке

Очень давно я не писал тут, решил вспомнить прошлое))
Никогда не работал с изометрией, только когда то очень давно разбирался с тьюториалом на 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 тайла) то я получаю такую картину:


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

Заранее спасибо за помощь, проект прикрепляю (сделан в FB 4.7)
Миниатюры
Нажмите на изображение для увеличения
Название: iso.png
Просмотров: 451
Размер:	7.7 Кб
ID:	31966  
Вложения
Тип файла: zip iso.zip (68.1 Кб, 46 просмотров)

Старый 14.01.2016, 12:23
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 2  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
У вас боксы и плитки неправильно отрисовываются. Работать будет только для случая, когда размеры равны 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();
}
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 14.01.2016, 22:15
PainKiller вне форума Посмотреть профиль Отправить личное сообщение для PainKiller Найти все сообщения от PainKiller
  № 3  
Ответить с цитированием
PainKiller
 
Аватар для PainKiller

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
Действительно все работает, alatar спасибо большое, вы как всегда выручили. Чуть попозже, попробую изменить код так чтобы можно было строить строение размера например 1 х 3 или 3 х 1, а не только квадратные как сейчас

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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