Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   BitmapData и hitTest. Не удается заставить ехать машину по дороге (http://www.flasher.ru/forum/showthread.php?t=152655)

sarjick 21.03.2011 02:32

BitmapData и hitTest. Не удается заставить ехать машину по дороге
 
Вложений: 1
Привет. Вот возникла задача заставить ехать машину по нарисованной дороге. Т.е. есть у меня клип 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" , даже если я вне дороги, прикрепил примерчик на всякий случай.

Подскажите в чем проблема?

goodguy 21.03.2011 07:28

Не самый лучший способ определять дорогу. hitTest - довольно ресурсоемкий метод. Если бы я делал что-то подобное, и у меня дорога отличалась от всего остального, то я бы заюзал getPixel(); Будет работать в разы быстрее и лучше.

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

sarjick 21.03.2011 08:38

Понял, спасибо, попробую с getPixel

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

DaFive 21.03.2011 12:44

Цитата:

Сообщение от sarjick (Сообщение 982345)
А если мне придется в будущем добавлять препятсвия с ними столкновение, как я понимаю, только с помощью hitTest получится сделать, да? Там же может быть неоднородная заливка и т.п. ..

Рисуйте дорогу одним цветом, место где нельзя перемещаться - другим. Препятствия третьим. getPixel() по цвету определит что где находится. А если препятствия создаются динамически и всегда разные - можно хиттестом попробовать или постоянно перерисовывать битмап.

sarjick 21.03.2011 14:32

Ясно, спасибо

goodguy 21.03.2011 15:06

Цитата:

Рисуйте дорогу одним цветом, место где нельзя перемещаться - другим.
Ну и убогая же графика получится. Я бы лучше использовал 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) // проверка уровня цветов на местности для выявления воды
{
        // вода определена
}

При том, что изображение воды было неоднородным. Куча синих оттенков

sarjick 21.03.2011 17:18

Вложений: 1
С наложением битмопов - по-моему отличная идея. Но что-то у меня пока даже самый простой способ так и не заработал :(

Вот у меня 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, может это как-то влияет еще?

Прикрепил пример, если кто захочет глянуть ...

sarjick 21.03.2011 17:36

вроде б понял, там у клипа road scale стоял, вот такая глупая ошибка получилась

goodguy 21.03.2011 18:07

Зачем нужет вот этот код?
Код AS3:

roadRect = road.getBounds(this);
roadBitmapData = new BitmapData(roadRect.width, roadRect.height, true, 0);
roadBitmapData.draw(road);


sarjick 21.03.2011 18:25

а как проще получить битмап road?

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


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

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