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

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

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

Регистрация: Aug 2005
Сообщений: 106
По умолчанию BitmapData и hitTest. Не удается заставить ехать машину по дороге

Привет. Вот возникла задача заставить ехать машину по нарисованной дороге. Т.е. есть у меня клип road и car. Car движется с помощью клавиш стрелочек.

Делал так:

Код AS3:
carRect = car.getBounds(this);
carBitmapData = new BitmapData(carRect.width, carRect.height, true, 0);
carBitmapData.draw(car);
 
roadRect = road.getBounds(this);
roadBitmapData = new BitmapData(roadRect.width, roadRect.height, true, 0);
roadBitmapData.draw(road);
 
addEventListener(Event.ENTER_FRAME, runGame);

а сама функция runGame

Код AS3:
private function runGame(e:Event):void {
      if(carBitmapData.hitTest(new Point(carRect.x, carRect.y), 255, roadBitmapData, new Point(roadRect.x, roadRect.y), 255))
      {
	      trace("on the road");
      }
      else
      {
	      trace("out");
      }
}

вроде б же все правильно? а мне трейс всегда показывает "on the road" , даже если я вне дороги, прикрепил примерчик на всякий случай.

Подскажите в чем проблема?
Вложения
Тип файла: zip car_road.zip (15.7 Кб, 102 просмотров)

Старый 21.03.2011, 07:28
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Не самый лучший способ определять дорогу. hitTest - довольно ресурсоемкий метод. Если бы я делал что-то подобное, и у меня дорога отличалась от всего остального, то я бы заюзал getPixel(); Будет работать в разы быстрее и лучше.

Собственно, уже доводилось делать определение воды на карте таким образом, и дорогу как-то раз определал. Но дорога у меня была нарисована на битмапке с альфа каналом, и была простая проверка, если альфа полученного пикселя != 0, то машина на дороге

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

Регистрация: Aug 2005
Сообщений: 106
Понял, спасибо, попробую с getPixel

Добавлено через 1 час 47 минут
А если мне придется в будущем добавлять препятсвия с ними столкновение, как я понимаю, только с помощью hitTest получится сделать, да? Там же может быть неоднородная заливка и т.п. ..

Старый 21.03.2011, 12:44
DaFive вне форума Посмотреть профиль Отправить личное сообщение для DaFive Посетить домашнюю страницу DaFive Найти все сообщения от DaFive
  № 4  
Ответить с цитированием
DaFive
 
Аватар для DaFive

Регистрация: May 2008
Адрес: {0,0}
Сообщений: 754
Записей в блоге: 1
Отправить сообщение для DaFive с помощью ICQ
Цитата:
Сообщение от sarjick Посмотреть сообщение
А если мне придется в будущем добавлять препятсвия с ними столкновение, как я понимаю, только с помощью hitTest получится сделать, да? Там же может быть неоднородная заливка и т.п. ..
Рисуйте дорогу одним цветом, место где нельзя перемещаться - другим. Препятствия третьим. getPixel() по цвету определит что где находится. А если препятствия создаются динамически и всегда разные - можно хиттестом попробовать или постоянно перерисовывать битмап.
__________________
Кодинг, багинг, алгоритминг. me @

Старый 21.03.2011, 14:32
sarjick вне форума Посмотреть профиль Отправить личное сообщение для sarjick Найти все сообщения от sarjick
  № 5  
Ответить с цитированием
sarjick
 
Аватар для sarjick

Регистрация: Aug 2005
Сообщений: 106
Ясно, спасибо

Старый 21.03.2011, 15:06
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 6  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Рисуйте дорогу одним цветом, место где нельзя перемещаться - другим.
Ну и убогая же графика получится. Я бы лучше использовал 2 битмапки, одну поверх другой, одну для фона, другую для препятствий. Та, что с препятствиями, содержит альфа канал. Естественно, препятствия будут не прозрачным, значит если уровень альфа канала > 0 - объект натолкнулся на препятствие.

Есть другой вариант, определять диапазон цветов, вместо конкретного цвета.
Вот так у меня в игре определялась вода:

Код AS3:
var pixel:uint = _background.bitmapData.getPixel(this.x, this.y);			
var r:uint = (pixel >> 16)  & 0xff;
var g:uint = (pixel >> 8)  & 0xff;  
var b:uint = pixel & 0xff;  
 
if (b > 90 && r < 20 && g > 80) // проверка уровня цветов на местности для выявления воды
{
	// вода определена
}
При том, что изображение воды было неоднородным. Куча синих оттенков

Старый 21.03.2011, 17:18
sarjick вне форума Посмотреть профиль Отправить личное сообщение для sarjick Найти все сообщения от sarjick
  № 7  
Ответить с цитированием
sarjick
 
Аватар для sarjick

Регистрация: Aug 2005
Сообщений: 106
С наложением битмопов - по-моему отличная идея. Но что-то у меня пока даже самый простой способ так и не заработал

Вот у меня road (мувик с трассой) стоит в x:0, y:0. А car - крутится в разные стороны клавишами. Отсчет координат идет у машинки от левого верхнего угла. Ну вот хотя бы по нему и пробую определить цвет фона, т.е. делаю так:

Код AS3:
roadRect = road.getBounds(this);
roadBitmapData = new BitmapData(roadRect.width, roadRect.height, true, 0);
roadBitmapData.draw(road);
а на Enter_Frame проверяю
Код AS3:
if (roadBitmapData.getPixel(car.x, car.y).toString(16) != "ffffff") {
и не отрабатывает как надо ... Это уже не говорю, если я road хочу сдвинуть вверх, так там вообще совпадения не ощущаются, хотя и пишу в этом случае
Код AS3:
if (roadBitmapData.getPixel(car.x - road.x, car.y - road.y).toString(16) != "ffffff") {
а при повороте я смещаю car на speedX , а всю область на -speedX, может это как-то влияет еще?

Прикрепил пример, если кто захочет глянуть ...
Вложения
Тип файла: zip road.zip (23.8 Кб, 84 просмотров)

Старый 21.03.2011, 17:36
sarjick вне форума Посмотреть профиль Отправить личное сообщение для sarjick Найти все сообщения от sarjick
  № 8  
Ответить с цитированием
sarjick
 
Аватар для sarjick

Регистрация: Aug 2005
Сообщений: 106
вроде б понял, там у клипа road scale стоял, вот такая глупая ошибка получилась

Старый 21.03.2011, 18:07
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 9  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Зачем нужет вот этот код?
Код AS3:
roadRect = road.getBounds(this);
roadBitmapData = new BitmapData(roadRect.width, roadRect.height, true, 0);
roadBitmapData.draw(road);

Старый 21.03.2011, 18:25
sarjick вне форума Посмотреть профиль Отправить личное сообщение для sarjick Найти все сообщения от sarjick
  № 10  
Ответить с цитированием
sarjick
 
Аватар для sarjick

Регистрация: Aug 2005
Сообщений: 106
а как проще получить битмап road?

Добавлено через 6 минут
Еще возник вопрос, может goodguy или кто другой подскажите? У меня карта максимум может быть 4000 пикселей, да? А если надо больше, то придется кусками атачить, правильно я понял?

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

Теги
bitmapdata , hittest
Опции темы
Опции просмотра

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

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


 


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


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