PDA

Просмотр полной версии : lineTo тормозит - SOLVED!


uglan
22.11.2012, 14:06
Привет всем!)
Вот такая странная ситуация сложилась. Код предельно простой на отрисовку линии последством стандартного GraphicsAPI c moveTo, lineTo функциями. Однако проблема в том что при тесте мувика во флеше линия рисуется адекватно(верхний скрин),
http://support.kurchenko.ru/lines.jpg
но если запустить полученный swf самостоятельно то линии получаются резкие, когда ведешь отклик соответствующий 5-10 FPS. А оригинальный FPS = 60, это же показывает счетчик, то есть тормозит не ролик а сама функция... Возникает вопрос, почему имеет место такая разность в скорости и как это исправить?
Спасибо)

код:
addChild(sprt);
sprt.graphics.lineStyle(4,0x333333,1);
addChild(new Stats());// - счетчик
stage.addEventListener(MouseEvent.MOUSE_DOWN,downDraw);
stage.addEventListener(MouseEvent.MOUSE_UP,upDraw);
stage.addEventListener(Event.ENTER_FRAME,LetsDraw);
// -------------------------------------------------//
function downDraw(e:MouseEvent):void{
sprt.graphics.moveTo(mouseX,mouseY);
canDraw = true;
}
// -------------------------------------------------//
function upDraw(e:MouseEvent):void{
canDraw = false;
}
// -------------------------------------------------//
function LetsDraw(e:Event):void{
//
if(canDraw){
sprt.graphics.lineTo(mouseX,mouseY);
}
}

Hauts
22.11.2012, 14:08
addChild(sprt);
sprt.graphics.lineStyle(4,0x333333,1);
addChild(new Stats());// - счетчик
stage.addEventListener(MouseEvent.MOUSE_DOWN,downDraw);
stage.addEventListener(MouseEvent.MOUSE_UP,upDraw);
stage.addEventListener(MouseEvent.MOUSE_MOVE,LetsDraw);
// -------------------------------------------------//
function downDraw(e:MouseEvent):void{
sprt.graphics.moveTo(mouseX,mouseY);
canDraw = true;
}
// -------------------------------------------------//
function upDraw(e:MouseEvent):void{
canDraw = false;
}
// -------------------------------------------------//
function LetsDraw(e:MouseEvent):void{
//
if(canDraw){
sprt.graphics.lineTo(mouseX,mouseY);
}
}

В каждом кадре-то зачем рисовать? Рисуйте по движению мыши.

uglan
22.11.2012, 14:17
Так я тоже пробовал, так в целом плавнее получается, но при начале рисования каждой линии стабильно с жестких углов начинает. Как будто ему разгон нужен.
http://support.kurchenko.ru/lines2.jpg

Hauts
22.11.2012, 14:27
Тогда есть вариант другой. Держите битмапу в нижнем слое и шэйп в верхнем. Зажали курсор — рисуем в шэйпе. Отжали курсор — шэйп отрисовываем в битмапу, шэйп очищаем.

caseyryan
22.11.2012, 14:31
У меня нормально рисует, что из IDE что отдельно

package {
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
/**
* ...
* @author casey ryan
*/

public class Main extends Sprite {

private var _sprite: Sprite = new Sprite();
private var _drawing: Boolean = false;

public function Main() {
addChild(_sprite);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
_sprite.graphics.lineStyle(3, 0x000000);
}

private function onMouseUp(e:MouseEvent):void {
_drawing = false;
}

private function onMouseDown(e:MouseEvent):void {
_drawing = true;
_sprite.graphics.moveTo(mouseX, mouseY);
}

private function onMouseMove(e:MouseEvent):void {
if (_drawing == false) return;
_sprite.graphics.lineTo(mouseX, mouseY);
e.updateAfterEvent();
}
}
}

uglan
22.11.2012, 14:32
хм. А что изменится? Дело в не очищении спрайтовой графики?
А битмапа вроде не содержит graphics функций? Лучше уж graphics.copyTo в другой шейп использовать. Ща попробую...

caseyryan
22.11.2012, 14:34
uglan попробуйте как я написал, с updateAfterEvent()

uglan
22.11.2012, 14:35
У меня нормально рисует, что из IDE что отдельно
Может дело в самом плеере? Я под 11.2 компиллирую.

Hauts
22.11.2012, 14:38
import flash.display.Shape;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.events.MouseEvent;

var canDraw:Boolean = false;
var shape:Shape = new Shape();
var bitmapData:BitmapData = new BitmapData(2000,1000,true,0x000000);
var bitmap:Bitmap = new Bitmap(bitmapData);

addChild(bitmap);
addChild(shape);

stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHadler);
stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHadler);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHadler);

function mouseDownHadler(e:MouseEvent):void {
canDraw = true;
shape.graphics.lineStyle(5,0x000000);
shape.graphics.moveTo(mouseX, mouseY);
}
function mouseUpHadler(e:MouseEvent):void {
canDraw = false;
bitmapData.draw(shape);
shape.graphics.clear();
}
function mouseMoveHadler(e:MouseEvent):void {
if (canDraw) {
shape.graphics.lineTo(mouseX, mouseY);
e.updateAfterEvent();
}
}

Вот мой вариант, попробуйте.
draw_example.swf

uglan
22.11.2012, 14:39
uglan попробуйте как я написал, с updateAfterEvent()
O! Вот так заработало:) Не знал про такую фишку. Спасибо!

Добавлено через 1 минуту
Hauts, ваш способ тоже работает! Всем спасибо!