Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Ошибка в работе hitTest при rotation (http://www.flasher.ru/forum/showthread.php?t=113984)

crazyone 15.07.2008 20:44

Хм. Интересная фигня. У меня еще такое вылезло — если заключить ваш код в onMouseDown:
Код:

onMouseDown=function(){
mc.onEnterFrame = function () {
//        this._rotation = 45;  // *1
        for (var i=0; i<400; i++) {  // *2
                this._x += 1; this._y += 1;
                if (this.hitTest(_root.cross._x, _root.cross._y, true)) {
                        delete this.onEnterFrame;
                        break;
                }
        }  // *3
}
}

тоже не работает. А без onMouseDown работает.

Вообще, работая с хитТестом лучше менять координаты, которыми тестишь, а не координаты мувика. Я для себя правилом сделал.
Типа так:
Код:

        mc.onEnterFrame = function() {
                this._rotation = 45;  // *1
                var testx = _root.cross._x;
                var testy = _root.cross._y;
                var sx = testx;
                var sy = testy;
                for (var i = 0; i<400; i++) {                        // *2
                        testx -= 1;
                        testy -= 1;
                        if (this.hitTest(testx, testy, true)) {
                                                        delete this.onEnterFrame;
                                break;
                        }
                }                // *3
                this._x += sx-testx;
                this._y += sy-testy;
                trace(this._x);
        };

Хотя если помучить, можно и эту схему заставить криво работать. Хотя бы если заключить это все в onMouseDown.

Смольный (Smolniy) 15.07.2008 20:56

Боюсь, придется мне переходить к объектам, "тело" которых строго прямоугольно :(:( Переводить координаты в систему коортинат тестируемого объекта, и проверять банально математически попадание в "тело". Очень паршивое ограничение.
Сейчас проверим, как работает в этом случае localToGlobal->globalToLocal Вроде, здесь я косяков не замечал, хотя уже ни в чем не уверен...

crazyone 15.07.2008 21:07

Цитата:

и проверять банально математически попадание в "тело"
Ну, не обязательно банально математически, т.к. hitTest с shapeFlag-ом false нормально работает.

Тоесть как бы вообще без глюков и динамично. Правда сравнивается тогда boundingBox, которая не поворачивается, а расширяется.
Если нужны повороты, тогда да, математически нужно.

chingachgoog 15.07.2008 21:07

Помните тему Флэш забивает на прорисовку мувиков с координатой > 4005 ?
Третий синтаксис hitTest, по-видимому имеет серьезные ограничения и работает именно на принципе прорисовки мувика битмапой.
Поэтому в цикле внутри одного кадра он и не ловит. Наверное внутри одного кадра (одного перехода головки) надо использовать первый синтаксис hitTest.

Смольный (Smolniy) 15.07.2008 21:39

crazyone
Ну если уж потеря формы, т.е. shapeFlag=false, то нафиг он такой нужен hitTest, я и сам четыре проверки написать способен. Тем более, что объект повернут, а flash любит брать ортогональные bounding box (bb), знаем мы его штуки. Тогда и клип-тело не придется делать, он тогда совсем не нужен, достаточно чисел bb.
(ну вот, пока я писал, ты сам сообразил насчет поворотов)

chingachgoog
Очень может быть... было бы только об этом где-то написано... Я два дня рабочего убил, прежде чем заподозрил "не мою ошибку"...

Смольный (Smolniy) 15.07.2008 21:42

Раз уж начал жаловаться - а еще меня убивает тормознутость округления в flash... Я чуть не опух, когда выяснил, что примерно 50% вычислительной мощности в моем проекте уходит на округление чисел. Т.е. когда я закомментил округления, время выполнения главного такта программы уменьшилось вдвое, правда, перестало работать корректно ;)

iNils 15.07.2008 21:53

Цитата:

Сообщение от Смольный (Smolniy) (Сообщение 752273)
Я чуть не опух, когда выяснил, что примерно 50% вычислительной мощности в моем проекте уходит на округление чисел. Т.е. когда я закомментил округления, время выполнения главного такта программы уменьшилось вдвое, правда, перестало работать корректно ;)

К слову, x >> 0 работает быстрее, чем Math.floor (x)

Смольный (Smolniy) 15.07.2008 21:59

Это я знаю, но меня интересует округление с нужной точностью, т.е. Math.round(x*pr)/pr
Кроме того, сдвиг работает не так с отрицательными значениями
trace (-5.6 >> 0) ===> -5
trace (Math.floor(-5.6)) ===> -6

iNils 15.07.2008 22:38

Вложений: 1
Цитата:

Сообщение от Смольный (Smolniy) (Сообщение 752247)
В том и задача - доехать до тайлов, имеющих в себе опорные точки (кресты, условно говоря), и об них удариться, т.е. остановиться.

bitmapData пользоваться не хочу, т.к. уверен в ее тормознутости. Скажем так, для обнаружения коллизии, я двигаю объект, тестю соударение, если оно есть - ищу ближайшую точку несоударения двоичным поиском, поэтому может быть 4-7 итераций за каждый fps для каждого движущегося объекта, что перебор...

Я не знаю полной картины, но в тесте, что в аттаче, битмап существенно шустрее.
Это обычный хиттест
Код:

this.onEnterFrame = hitTestOld;
//this.onEnterFrame = hitTestNew;

Потом раскомментируй строчку с hitTestNew для битмпавского хиттеста и сравни загрузку процессора.

Смольный (Smolniy) 15.07.2008 22:57

Занятно...
Даже не знаю, что сказать... Буду нюхать...


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

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