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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 02.03.2012, 13:34
s3dworld вне форума Посмотреть профиль Отправить личное сообщение для s3dworld Найти все сообщения от s3dworld
  № 11  
Ответить с цитированием
s3dworld

Регистрация: Apr 2010
Сообщений: 170
Всем доброго дня!

Ни одна формула не заработала как надо. Первая формула рассчитывала строки не верно. Тыкаю в клетку 4, а она показывает 14. Вторая формула была не точна. Тыкаю на одну и ту же клетку, но в разные места, и значения целые были разные. А третья формула показывает значение строки 800, когда тыкаю к строку 0. Сейчас попробую сам пересчитать всё это с листочком и ручкой, а пока считаю, дам Вам информацию для размышления.

Все тайлы карты я рисую в один большой Bitmap. Для его рассчёта я определяю положения крайних точек:

Код AS3:
// Рассчитываем размер изображения
var imageWidth:uint=0;
var imageHeight:uint=0;
var mapX1:int=0;
var mapY1:int=0;
var mapX2:int=0;
var mapY2:int=0;
 
mapX1=(0*Game.fieldWidth/2)-((map.mapRows-1)*Game.fieldWidth/2);
mapY1=(0*Game.fieldHeight/2)+(0*Game.fieldHeight/2);
 
mapX2=((map.mapColumns-1)*Game.fieldWidth/2)-(0*Game.fieldWidth/2)+Game.fieldWidth;
mapY2=((map.mapColumns-1)*Game.fieldHeight/2)+((map.mapRows-1)*Game.fieldHeight/2)+Game.fieldHeight;
 
imageWidth=(-1*mapX1)+mapX2;
imageHeight=mapY1+mapY2;
 
var bitmapData:BitmapData=new BitmapData(imageWidth,imageHeight,true,0);
Теперь у меня есть область для заполнения тайлов. И в цикле я её заполняю:

Код AS3:
for(var j:uint=0;j<map.mapRows;j++)
{
	for(var i:uint=0;i<map.mapColumns;i++)
	{
		var matrix:Matrix=new Matrix();
		matrix.translate((-1*mapX1)+(i*Game.fieldWidth/2)-(j*Game.fieldWidth/2),(i*Game.fieldHeight/2)+(j*Game.fieldHeight/2));
		bitmapData.draw(mapLoad.GetData(map.fieldObjects[j * map.mapColumns + i].id),matrix);
	}
}
 
bitmap=new Bitmap(bitmapData);
Как видите, я к каждому тайлу прибавляю по оси X значение, обратное началу моего квадрата, так, чтобы тайлы выводились правильно (а то бы они начали рисоваться с самого левого края изображения, а надо почти от середины). Именно это обратное значение я и запоминаю как смещение:

Код AS3:
offsetScreenX=-1*mapX1;
Теперь на этот Bitmap я вешаю событие мышки MOUSE_DOWN и определяю координаты куда мы тыкнули через localX и localY. Как реализовать обратное преобразование?

Добавлено через 26 минут
Вот для размышления. Красный прямоугольник - это Bitmap, по которому мышкой тыкаем.


Старый 02.03.2012, 14:40
Stitch512 вне форума Посмотреть профиль Отправить личное сообщение для Stitch512 Найти все сообщения от Stitch512
  № 12  
Ответить с цитированием
Stitch512

Регистрация: Nov 2010
Сообщений: 150
Цитата:
а пока считаю, дам Вам информацию для размышления.
Спасибо тебе, Белый Господин, мы будем денно и нощно размышлять во славу твою....

Лошадь пусть размышляет - у нее голова большая.

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

Старый 02.03.2012, 16:51
s3dworld вне форума Посмотреть профиль Отправить личное сообщение для s3dworld Найти все сообщения от s3dworld
  № 13  
Ответить с цитированием
s3dworld

Регистрация: Apr 2010
Сообщений: 170
Есть рисунок, на который должны быть выведены изометрические тайлы. Количество колонок и столбцов на карте задано:

Код AS3:
public var mapRows:uint=30;
public var mapColumns:uint=30;
Ширина и высота тайлов задана:

Код AS3:
public var fieldWidth:uint=100;
public var fieldHeight:uint=54;
Рассчитывается размер изображения со всеми выведенными тайлами:

Код AS3:
var imageWidth:uint=0;
var imageHeight:uint=0;
var mapX1:int=0;
var mapY1:int=0;
var mapX2:int=0;
var mapY2:int=0;
 
mapX1=(0*Game.fieldWidth/2)-((map.mapRows-1)*Game.fieldWidth/2);
mapY1=(0*Game.fieldHeight/2)+(0*Game.fieldHeight/2);
 
mapX2=((map.mapColumns-1)*Game.fieldWidth/2)-(0*Game.fieldWidth/2)+Game.fieldWidth;
mapY2=((map.mapColumns-1)*Game.fieldHeight/2)+((map.mapRows-1)*Game.fieldHeight/2)+Game.fieldHeight;
 
imageWidth=(-1*mapX1)+mapX2;
imageHeight=mapY1+mapY2;
 
offsetScreenX=-1*mapX1;
 
var bitmapData:BitmapData=new BitmapData(imageWidth,imageHeight,true,0);
Рисуются все тайлы:

Код AS3:
for(var j:uint=0;j<map.mapRows;j++)
{
  for(var i:uint=0;i<map.mapColumns;i++)
  {
    var matrix:Matrix=new Matrix();
    matrix.translate(offsetScreenX+(i*Game.fieldWidth/2)-(j*Game.fieldWidth/2),(i*Game.fieldHeight/2)+(j*Game.fieldHeight/2));
    bitmapData.draw(mapLoad.GetData(map.fieldObjects[j * map.mapColumns + i].id),matrix);
  }
}
 
bitmap=new Bitmap(bitmapData);
Получается такая вот карта:



При этом каждый тайл ограничен прямоугольной областью:



Но все они лежат в картинке:



На картинку подписано событие MOUSE_DOWN. Нужно определить столбец и строку тайла, на который тыкнули мышкой. Есть какие-то идеи?

Старый 02.03.2012, 17:01
Stitch512 вне форума Посмотреть профиль Отправить личное сообщение для Stitch512 Найти все сообщения от Stitch512
  № 14  
Ответить с цитированием
Stitch512

Регистрация: Nov 2010
Сообщений: 150
Вы пример то хоть смотрели. Там есть общая формула преобразования из экранных координат в изометрические. А по изометрическим координатам, зная шаг сетки, определить строку и столбец думаю труда не составит.

Старый 02.03.2012, 19:55
s3dworld вне форума Посмотреть профиль Отправить личное сообщение для s3dworld Найти все сообщения от s3dworld
  № 15  
Ответить с цитированием
s3dworld

Регистрация: Apr 2010
Сообщений: 170
Stitch512
Посмотрел. Даже скопировал функцию перевода. Но не помогло(((

Старый 02.03.2012, 19:57
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 16  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
hitTestPoint? Узнать какой тайл под мышкой...

Старый 02.03.2012, 20:04
Stitch512 вне форума Посмотреть профиль Отправить личное сообщение для Stitch512 Найти все сообщения от Stitch512
  № 17  
Ответить с цитированием
Stitch512

Регистрация: Nov 2010
Сообщений: 150
Цитата:
Посмотрел. Даже скопировал функцию перевода. Но не помогло(((
Ну вам для начала нужно определиться с системой координат в изометрической проекции, где какие оси и куда направлены. А вы как то странно поступили, сначала просто нарисовали картинку а потом по ней пытаетесь вычислить координаты... Какие координаты, относительно чего, где вообще начало, где оси... Перевод в изометрическую и обратно - это по факту набор преобразований. У вас же ничего похожего на математику я не заметил. Так что, или копайте изометрию, либо, как заметил MikroAcse, - hitTestPoint, но не рекомендую ибо это как то через ж...

Добавлено через 1 минуту
Цитата:
hitTestPoint? Узнать какой тайл под мышкой...
Не сработает, все тайлы блитятся в одну bitmapData.

Старый 02.03.2012, 22:03
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 18  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
По-моему во 2-м и 3-м посте просто потеряли 2-ку. Всё справа ещё умножить на 2. Должно сработать. Если нет, то проверьте и нарисуйте на ваших картинках, где находится screenX и screenY, если x = y = 0. Должна быть точка в верхнем углу.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

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

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

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


 


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


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