Форум 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=206402)

Wizlight 02.02.2014 06:45

Пересечение объекта с другими объектами
 
Вложений: 1
Здравствуйте. Имеем одноколесный велосипед - состоит из сидушки и колеса. Колесо крутится при передвижении мыши как и сам велосипед целиком, только по горизонтали. Если есть препятствие на пути - велосипед его "переезжает" поднимаясь вверх на соответствующее расстояние, потом снова опускается. Реализовано с помощью hitTestObject()

Код AS3:

var vr:Number=cycle.y; // запоминаем координату велосипеда по оси ОУ
 
stage.addEventListener(Event.ENTER_FRAME,onFrameLoop);
 
function onFrameLoop(evt:Event):void
{
        cycle.x = mouseX; // велосипед по оси ОХ двигается за мышкой
        cycle.wheel.rotation = mouseX; // колесо велосипеда крутится от движения мышки
        if (cycle.hitTestObject(st)) // проверяем не столкнулся ли велосипед с объектом st, если да - "переезжаем"
        {
                cycle.y = vr-st.height ;
        } else {
                cycle.y = vr;
        }
}

не получается вставить .swf, вот скрин
Вложение 30434

Вопрос: Как реализовать сценарий, чтобы велосипед "переезжал" произвольное количество препятствий, а не конкретно вбитое. Спс

КорДум 02.02.2014 12:50

Самое простое — загнать ссылки на столбы в массив и проверять столкновение в цикле. Это не оптимизированно, поэтому после наличия столкновения хотя бы break из цикла делайте и пройденные столбы из массива выкидывайте.

Wizlight 02.02.2014 17:35

Спасибо за помощь
Код AS3:

var obj1:Array= new Array(); // Тут будут хранится все объекты которые мы видим на сцене
var obj2:Array= new Array(); // Тут только те, которые имеют класс Stone - это наши столбы, камни
 
for (var i:int = 0; i< this.numChildren; i++) // Проходим все дочернии объекты, если встречается объект класса Stone - закидываем его в массив obj2 с которым и будем работать
{
        obj1[i] = this.getChildAt(i);
        if (obj1[i] is Stone)
        {
                obj2.push(obj1[i]);
        }
}
 
var vr:Number = cycle.y;
 
stage.addEventListener(Event.ENTER_FRAME,onFrameLoop);
 
 
function onFrameLoop(evt:Event):void
{
        cycle.x = mouseX;
        cycle.wheel.rotation = mouseX;
    for (var j:int = 0; j< obj2.length; j++){
 
        if (cycle.hitTestObject(obj2[j]))
        {
        cycle.y = vr - obj2[j].height;
        break;
        }
        else
        {
        cycle.y = vr;
        }
  }
}

Цитата:

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

П.С. Да, это самый "прямой метод" над которым я и сначала думал, но... он очень ресурсозатратный, с каждым кадром нужно проходить цикл...

Можно ли как то реализовать столкновение как тут cycle.hitTestObject(st), но не с конкретным объектом st , а с классом объектов, например с классом Stone ?

samana 02.02.2014 17:44

Цитата:

Можно ли как то реализовать столкновение как тут cycle.hitTestObject(st), но не с конкретным объектом st , а с классом объектов, например с классом Stone ?
Можно поместить все столбы в контейнер и проверять столкновение только с ним. Но вам это не подойдёт, так как высота столбов разная и в любом случае нужно искать конкретный столб, с которым столкнулись.

КорДум 02.02.2014 18:15

а с классом объектов, например с классом Stone ?
Нет, класс - штука невидимая и неосязаемая. Проверять столкновения можно только с его экземплярами. Идея с массивом никуда не уходит, просто добавляйте в массив только те столбы, которые видны на экране, и убирайте те, которые скрыты.


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

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