Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   lineTo тормозит - SOLVED! (http://www.flasher.ru/forum/showthread.php?t=187663)

uglan 22.11.2012 14:06

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

код:
Код AS3:

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

Код AS3:

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 что отдельно
Код AS3:

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

Вложений: 1
Код AS3:

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   (1.2 Кб)

uglan 22.11.2012 14:39

Цитата:

Сообщение от caseyryan (Сообщение 1105607)
uglan попробуйте как я написал, с updateAfterEvent()

O! Вот так заработало:) Не знал про такую фишку. Спасибо!

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


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

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