Просмотр полной версии : работа с графикой
lisenok100
27.09.2014, 12:36
Всем привет:)!. Возник вот такой вопрос. С какой частотой можно менять цвет отрисовки линии в shape через .graphics.lineStyle() ? Немного поясню. Мне нужно в shape рисовать несколько прямых разноцветных кривых. Каждые 10 милисекунд я для каждой кривой знаю текущую и следующую координату "головы". В функции я задаю цвет линии, эти координаты и рисую маленькую прямую, из которых и состоят кривые. Вот так
function drawTochkaLine(zmeya,x1,y1,x2,y2) {
totalShape.graphics.lineStyle(3,zmeya.zmeykaColor,1);
if (zmeya == zm2) {
totalShape.graphics.moveTo(x1,y1);
totalShape.graphics.lineTo(x2,y2);
}
if (zmeya == zm) {
totalShape.graphics.moveTo(x1,y1);
totalShape.graphics.lineTo(x2,y2);
}
}
А получается черт знает что:o! Цвета змеек меняются местами, а одна змея вообще разноцветная! Дело в слишком высокой скорости смены цвета?
Дело в слишком высокой скорости смены цвета?
А Вам сложно вместо 10 поставить 50 или 100 и посмотреть?
delay (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/utils/Timer.html#Timer())
Задержка в миллисекундах между событиями таймера. Не рекомендуется задавать свойству delay значение меньше 20 миллисекунд. Частота объекта Timer ограничена 60 кадрами в секунду, то есть задержка меньше 16,6 миллисекунд вызывает проблемы во время выполнения.
lisenok100
27.09.2014, 16:47
Спасибо за ответ, попробовал увеличить. Но понял, что дело не в этом. Чудеса появляются, когда shape залит другим цветом.. Почему так, не знаете?
Сделайте хоть скрин и кода побольше покажите, а то для Вас чудеса, это изменение цвета,
а для меня чудеса , это -
рисовать несколько прямых разноцветных кривых
Я не знаю что такое прямая кривая.
lisenok100
27.09.2014, 17:40
прямая кривая... :mosking: я хотел сказать, кривая из маленьких прямых).
Вот код и скрин. Верхняя просто рисуется синей, а у второй синяя только "голова", а все остальное красное:o
var mainTimer:Timer = new Timer(500,0);
var a = 50;
var totalShape:Shape = new Shape();
totalShape.graphics.beginFill(0xff8e00);//если убрать эту строку, то все в порядке
totalShape.graphics.lineStyle(1,0xff0000,1);
totalShape.graphics.moveTo(0,0);
totalShape.graphics.lineTo(650,0);
totalShape.graphics.lineTo(650,600);
totalShape.graphics.lineTo(0,600);
totalShape.graphics.lineTo(0,0);
addChild(totalShape);
mainTimer.start();
mainTimer.addEventListener(TimerEvent.TIMER, tik);
function tik(e:TimerEvent) {
totalShape.graphics.lineStyle(10,0xFF0000,1);//цвет верхней змеи должен быть красным
totalShape.graphics.moveTo(a,200);
a+=10;
totalShape.graphics.lineTo(a,200);
a-=10;
totalShape.graphics.lineStyle(10,0x0000FF,1);//цвет нижней змеи должен быть синим
totalShape.graphics.moveTo(a,300);
a+=10;
totalShape.graphics.lineTo(a,300);
}
Это весь код который рисует и рассчитывает линии? Я плохо знаком с рисованием в graphics и может быть по этому
мне кажется, что в данном коде нет ошибки.
А вот под оранжевым слоем у Вас нет синего и красного слоя? А то может это не рисунки, а дырки?)
lisenok100
27.09.2014, 21:11
Я написал другой код, который отражает суть проблемы (я не написал в него лишь несколько 'import'). В основном коде было бы долго разбираться:). Можно просто взять все это и скопировать себе, дописав вверху
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.display.Shape;
Если не сложно, посмотрите:). А то я никак не могу понять, что это за ерунда:o
С какой частотой можно менять цвет отрисовки линии в shape через .graphics.lineStyle()? Каждые 10 милисекунд <я рисую>
Обычный цикл рисования для меня выглядит как-то просто и незамысловато:
Дожидаемся события EnterFrame
Graphics#clear();
Graphics <draw>;
Может быть он и вам подойдет? Обратите особое внимание на инструкцию clear().
Добавлено через 16 минут
Кстати, очевидно, что проблема в том, что вы не очищаете graphics после предыдущего рисования на нем.
Но не на это я хочу обратить внимание. Ваш подход с рисованием по таймеру имеет более глубокие последствия. Дело в том, что flash player имеет свой т.н. elastic racetrack (http://www.craftymind.com/2008/04/18/updated-elastic-racetrack-for-flash-9-and-avm2/) и он палец о палец не ударит, чтобы отрисовать заказанное вами, ранее, чем наступит Render Action. Получается, что какая-то часть кода, рисовавшего по таймеру просто нагревало процессор и ничего не существенного не делало. Есть, конечно, читерский способ заставить flash player рендерить экран. Имя ему #updateAfterEvent(). Но дети мне подсказывают, что вам это пока не нужно.
Если не сложно, посмотрите
Мне не сложно, мне просто сейчас не на чем это сделать.
А должно у Вас как быть? Верхняя все красная, а нижняя синяя?
lisenok100
28.09.2014, 17:12
dimarik, мне не нужно движение, мне нужна линия из точки:). Проблема решена, моя ошибка заключалась в том, что я забыл написать endFill(), после этого все пришло в порядок.
А теперь про таймер.. Честно, я почти ничего не понял:). Вы можете посоветовать что-то конкретное:)? Сейчас я столкнулся с проблемой скорости. Я хочу сделать приложение для вконтакте, сейчас залил, и fps упало примерно до 10:(. Заменил timer на enter_frame, ничего не изменилось..
cleptoman
29.09.2014, 18:57
попробуйте по таймеру (если вам нужна куча точек и отрезков между прорисовками) складывать в некий буффер (массив), а в обработчике ентерфрейма, непосредственно, рисовать этот буффер, очищая его после этого или не очищая (зависит от контекста задачи). возможно, методы графикса вызывают инвалидацию сцены каждые ваши 10 мс (тут не могу утверждать. изысканий не проводил). и будь я на месте флэш плеера, то я бы сильно на вас ругался.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.