Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Критическая ошибка при вызове Graphics.drawPath() (http://www.flasher.ru/forum/showthread.php?t=134625)

dump13 06.01.2010 13:21

Критическая ошибка при вызове Graphics.drawPath()
 
Здравствуйте, у меня вопрос по Graphics.drawPath(). Писал когда-то работоспособный простенький редактор сплайнов, отрисовку производил с помощью Graphics.drawGraphicsData(). Выглядело это так:

Код AS3:

public function redraw ():void {
        var gdata:Vector.<IGraphicsData>=new Vector.<IGraphicsData> ();
        var path:GraphicsPath=_spline.toGraphicsPath ();
        gdata.push (new GraphicsStroke ( 0, false, "normal", "none", "round", 3.0, new GraphicsSolidFill (_bodyColor, _bodyAlpha) ));
        gdata.push (path);
        _body.graphics.clear ();
        _body.graphics.drawGraphicsData (gdata);
        // ... ...
}

То есть я не использовал drawPath() напрямую, и проблем не возникало.
Сейчас я произвожу модификацию сплайна или шейпа (вернее, их graphics) с помощью последовательных вызовов lineStyle(), beginFill(), endFill() из других объектов. Между ними я планировал вставлять вызовы drawPath(). Вот "рабочая лошадка":

Код AS3:

override public function process ():void {
        var p0:AGUnit = _parents[0], p1:AGUnit = _parents[1];
        if (p0 == null) {_output = null; return;}
        if (!(p0.output is Shape) && !(p0.output is Sprite)) {_output = null; return;}
        var gr:Graphics = p0.output.graphics;
        if (p1 != null && p1.output != null && (p1.output is AGSpline)) {
                var path:GraphicsPath = (p1.output as AGSpline).toGraphicsPath ();
                gr.drawPath (path.commands, path.data, path.winding);
        }
        _output = p0.output;
}

Когда этот метод вызывается, плейер выдает критическую ошибку и убивается насмерть. На всякий случай, вот так производится сборка GraphicsPath:

Код AS3:

public override function toGraphicsPath ():GraphicsPath {
        var gp:GraphicsPath=new GraphicsPath ();
        if (_points.length==0) {return gp;}
        var p:AGPoint=_points[0];
        gp.moveTo (p.x, p.y);
        for (var n:uint=1; n<_points.length; n++) {
                p=_points[n];
                gp.lineTo (p.x, p.y);
        }
        if (_closed) {p=_points[0]; gp.lineTo (p.x, p.y);}
        return gp;
}

Никто не знает, что это такое? Спасибо заранее.

Alex Lexcuk 06.01.2010 13:56

>>плейер выдает критическую ошибку и убивается насмерть.

А текст выводящейся ошибки (секрет) или вы считаете, что это неважно, потому что я сначала смотрю на текст ошибки, а потом думаю, че с ней делать. Как правило плеер сам говорит вам в тексте ошибки, чего ему не нравится.

wvxvw 06.01.2010 13:57

Вдумчиво прочитайте вот эту строчку:
Код AS3:

if (!(p0.output is Shape) && !(p0.output is Sprite)) {_output = null; return;}

А вообще, код в таком оформлении можно только в ванной с выключеным светом показывать ;)

dump13 06.01.2010 14:09

Вложений: 1
Прекрасная, на мой взгляд, строчка :). Если бы вы мне еще подсказали, как нетипизированный "вход" с предыдущего звена проверить на наличие у него свойства graphics, я был бы очень признателен. Я, сколько ни читал референс, другого способа определить это не нашел.

@Alex Lexcuk: во вложениях вам и текст ошибки.

Ну а все же, по сабжу?

Alex Lexcuk 06.01.2010 14:15

>>Ну а все же, по сабжу?
Пожалуйста дайте текст критической ошибки...

dump13 06.01.2010 14:35

To Alex Lexcuk: между плеером и системой - среда исполнения, поэтому ошибки, которые выдаются им в обычных условиях (просто при ачипятке в коде), у меня язык не повернется назвать критическими. Текст *критической* ошибки смотрите выше. Если не верите, вот ссылка, проверьте сами.
Слева ставите gc Sprite, справа от него - sp Polygon, снизу под ними обоими - gc GC+SP.
Ставите полигону хотя бы одну точку, дважды кликаете по gc GC+SP. Все.

wvxvw 06.01.2010 14:44

>> Прекрасная, на мой взгляд, строчка
да... вот только там должно быть не логическое "и", а логическое "или"... только там весь код в таком же духе, типа круглое носим, квадратное катаем.. выражения внутри if() блока всегда приводятся к Boolean в AS3, поэтому писать if (someObject == null) бессмысленно т.как вы будете Boolean к Boolean кастовать в таком случае, переменные нельзя объявлять внутри if() / for() и т.п. блоков, использовать uint для итератора бессмысленно, если значений никогда не будет больше 0x7FFFFFFF (т.как он медленнее), проверять длинну массива в каждой итерации при том, что вы не изменяете ее - это тоже сильно... Ну и плюс ко всему всунуть значения констант вместо ссылок на них - тоже как бы...
Что касается ошибки - поставьте не бета плеер (10.0.28, а лучше 10.0.32).

EDIT:
А хотя нет, с условием погарячился - прошу прощения. Я не понял сразу, что оно должно делать.
Но все равно если делать по-нормальному, то _output должен был быть типа Graphics, ну или в самом худшем случае:
Код AS3:

if (!o.hasOwnProperty("graphics") || !(o.graphics is Graphics))


Alex Lexcuk 06.01.2010 14:46

Цитата:

Сообщение от dump13 (Сообщение 877125)
To Alex Lexcuk: между плеером и системой - среда исполнения, поэтому ошибки, которые выдаются им в обычных условиях (просто при ачипятке в коде), у меня язык не повернется назвать критическими. Текст *критической* ошибки смотрите выше. Если не верите, вот ссылка, проверьте сами.
Слева ставите gc Sprite, справа от него - sp Polygon, снизу под ними обоими - gc GC+SP.
Ставите полигону хотя бы одну точку, дважды кликаете по gc GC+SP. Все.

Ссылка в никуда... Перепишите все, сделайте по другому у меня никогда на Graphics.drawPath() не выдавал никаких ошибок и критеческих тоже. Попробуйте свежий плеер скачать.

dump13 06.01.2010 15:26

@wvxvw: ну, в том коде как раз и должно стоять логическое И: если объект - Спрайт, то он не будет Шейпом (|| выдаст false), если он Шейп, Спрайтом ему не быть (опять false), и тело выполняться не будет. Во всем остальном - спасибо за ценную инфу :), особенно по тормозности uint, я этого действительно не знал.

Цитата:

писать if (someObject == null) бессмысленно
здесь я не совсем понял, т.е. следует писать if (someObject) {} ?

Цитата:

переменные нельзя объявлять внутри if() / for() и т.п. блоков
кто сказал? А я думал, Adobe облегчает нам жизнь :)

Цитата:

проверять длинну массива в каждой итерации
обычно я избегаю повторных вызовов геттеров/сеттеров, почему у меня это происходит в каждом цикле, ума не приложу. Наверно, адоубовские хелпы виноваты.

Цитата:

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

Цитата:

Что касается ошибки - поставьте не бета плеер (10.0.28, а лучше 10.0.32).
Вот. Самые очевидные вещи приходят в голову в самом конце.

@Alex Lexcuk: ссылку поправил, так, на всякий случай.

Zik. 06.01.2010 15:43

wvxvw, почему нельзя переменные объявлять в for()?
то есть
Код AS3:

for (var i:int = 0; i < 10; i++) { };

медленее чем
Код AS3:

var i:int = 0;
for (i; i < 10; i++) {};

??


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

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