Воссоздание инструмента кисти с использованием кода AS3 для разработки приложения рисования (используется класс Bitmap) - PullRequest
1 голос
/ 06 апреля 2011

Я разрабатываю приложение для рисования AS3. То, что я пытаюсь, это в основном подражать MS Paint. Мне нужно создать инструмент кисти. Кисть имеет множество форм (кончик кисти), таких как квадрат, круг, ромб. Изначально я планировал использовать класс графики, но некоторые мудрые ребята посоветовали мне использовать класс Bitmap. Я разработал класс, и, кажется, работает нормально. Но две проблемы, которые затрагивают меня сейчас

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

пакет {

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.*;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.ui.Keyboard;

[SWF(width=600,height=400,backgroundColor=0x000000)]

/**
* Demonstrates BitmapData's draw() command by duplicating the entirety of the stage using draw()
* whenever the space bar is pressed. A smaller copy is also drawn onto the stage to show how draw()
* can be used to transform the pixels in the image being drawn.
*/
public class DrawTest extends Sprite {

    private var _circle:Sprite;
    private var _bitmapData:BitmapData;


    /**
    * Constructor. Creates bitmap that will be drawn into and circle that will follow the mouse.
    * A listener is also set up to handle then a key is pressed.
    */
    public function DrawTest() {

        createBitmap();
        createCircle();

        stage.addEventListener(MouseEvent.MOUSE_DOWN,_handleMouseEventBrush);
        stage.addEventListener(MouseEvent.MOUSE_UP,_handleMouseEventBrush);

    }

    /**
    * Creates bitmap data that the stage contents will be drawn into and adds this to the stage.
    */
    private function createBitmap():void {
        _bitmapData=new BitmapData(stage.stageWidth,stage.stageHeight,true,0x000000);
        var bitmap:Bitmap=new Bitmap(_bitmapData);
        addChild(bitmap);
    }

    /**
    * Creates a circle shape that is set to follow the mouse as it moves.
    */
    private function createCircle():void {
        _circle=new Sprite  ;
        _circle.graphics.beginFill(0xFF0000);
        _circle.graphics.drawCircle(0,0,10);
        _circle.graphics.endFill();
        addChild(_circle);
        _circle.x=stage.mouseX;
        _circle.y=stage.mouseY;
        _circle.startDrag();

    }


    private function _handleMouseEventBrush(e:MouseEvent):void {



        switch (String(e.type)) {

            case "mouseDown" :
                _bitmapData.draw(stage);
                stage.addEventListener(MouseEvent.MOUSE_MOVE,_handleMouseEventBrush);
                break;

            case "mouseUp" :
                stage.removeEventListener(MouseEvent.MOUSE_MOVE,_handleMouseEventBrush);
                break;

            case "mouseMove" :
                _bitmapData.draw(stage);


        }
    }

}

Кто-нибудь знает, как преодолеть это?

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

вы можете попытаться использовать Event.ENTER_FRAME для выполнения команд рисования. MOUSE_MOVE выполняется чаще, и экран перерисовывается вспышкой в ​​зависимости от частоты кадров. Но я не уверен, что это лучше. приветствует

0 голосов
/ 19 сентября 2013

Вы можете использовать такую ​​библиотеку, как Grafitti - http://www.nocircleno.com/graffiti/

Он очень прост в использовании и обладает множеством интересных функций.

Совет: используйте версию 2.5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...