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

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

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

Регистрация: Apr 2009
Сообщений: 30
По умолчанию Критическая ошибка при вызове 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;
}
Никто не знает, что это такое? Спасибо заранее.

Старый 06.01.2010, 13:56
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 2  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
>>плейер выдает критическую ошибку и убивается насмерть.

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

Старый 06.01.2010, 13:57
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 3  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Вдумчиво прочитайте вот эту строчку:
Код AS3:
if (!(p0.output is Shape) && !(p0.output is Sprite)) {_output = null; return;}
А вообще, код в таком оформлении можно только в ванной с выключеным светом показывать
__________________
Hell is the possibility of sanity

Старый 06.01.2010, 14:09
dump13 вне форума Посмотреть профиль Отправить личное сообщение для dump13 Найти все сообщения от dump13
  № 4  
Ответить с цитированием
dump13

Регистрация: Apr 2009
Сообщений: 30
Прекрасная, на мой взгляд, строчка . Если бы вы мне еще подсказали, как нетипизированный "вход" с предыдущего звена проверить на наличие у него свойства graphics, я был бы очень признателен. Я, сколько ни читал референс, другого способа определить это не нашел.

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

Ну а все же, по сабжу?
Изображения
 


Последний раз редактировалось dump13; 06.01.2010 в 14:18.
Старый 06.01.2010, 14:15
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 5  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
>>Ну а все же, по сабжу?
Пожалуйста дайте текст критической ошибки...
__________________
Гоночка

Старый 06.01.2010, 14:35
dump13 вне форума Посмотреть профиль Отправить личное сообщение для dump13 Найти все сообщения от dump13
  № 6  
Ответить с цитированием
dump13

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


Последний раз редактировалось dump13; 06.01.2010 в 14:43. Причина: Битоя сццылко
Старый 06.01.2010, 14:44
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 7  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
>> Прекрасная, на мой взгляд, строчка
да... вот только там должно быть не логическое "и", а логическое "или"... только там весь код в таком же духе, типа круглое носим, квадратное катаем.. выражения внутри 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))
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 06.01.2010 в 15:31.
Старый 06.01.2010, 14:46
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 8  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Цитата:
Сообщение от dump13 Посмотреть сообщение
To Alex Lexcuk: между плеером и системой - среда исполнения, поэтому ошибки, которые выдаются им в обычных условиях (просто при ачипятке в коде), у меня язык не повернется назвать критическими. Текст *критической* ошибки смотрите выше. Если не верите, вот ссылка, проверьте сами.
Слева ставите gc Sprite, справа от него - sp Polygon, снизу под ними обоими - gc GC+SP.
Ставите полигону хотя бы одну точку, дважды кликаете по gc GC+SP. Все.
Ссылка в никуда... Перепишите все, сделайте по другому у меня никогда на Graphics.drawPath() не выдавал никаких ошибок и критеческих тоже. Попробуйте свежий плеер скачать.
__________________
Гоночка

Старый 06.01.2010, 15:26
dump13 вне форума Посмотреть профиль Отправить личное сообщение для dump13 Найти все сообщения от dump13
  № 9  
Ответить с цитированием
dump13

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

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

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

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

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

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

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

Старый 06.01.2010, 15:43
Zik. вне форума Посмотреть профиль Отправить личное сообщение для Zik. Найти все сообщения от Zik.
  № 10  
Ответить с цитированием
Zik.
 
Аватар для Zik.

Регистрация: Nov 2007
Сообщений: 1,724
wvxvw, почему нельзя переменные объявлять в for()?
то есть
Код AS3:
for (var i:int = 0; i < 10; i++) { };
медленее чем
Код AS3:
var i:int = 0;
for (i; i < 10; i++) {};
??

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

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

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


 


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


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