2012-11-17 4 views
1

나는 행렬 함수를 사용하여 그리려면 셰이프 브러시를 사용하는 페인트 프로그램을 작성하고 있습니다. 모든 것이 원활하지 않다는 사실 외에도 잘 작동합니다. 마우스를 고속으로 움직이면 그림에 간격이 생길 것입니다.Actionscript 3 매트릭스를 사용하여 브러시로 bitmapdata.draw

나는 어디 론가 보였지만 어떤 해결책도 찾을 수 없었습니다.

이 코드는 기본적으로 다음과 같다 : 사람이 나 드로잉을 부드럽게하는 방법을 알아내는 데 도움 수 있다면

//Press mouse within container. Uses Matrix to draw instances of the brush. 
    private function handleMouseDown_drawContainer(e:MouseEvent):void 
    { 
      _matrix.identity(); 
      _matrix.translate(mouseX - 10, mouseY - 30); 
      _layout.bitmapData.draw(_layout.brush, _matrix); 

      _layout.drawContainer.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove_drawContainer); 
      _layout.drawContainer.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp_drawContainer) 

    } 

    //Move mouse within container. Uses Matrix to draw instances of the brush. 
    private function handleMouseMove_drawContainer(e:MouseEvent):void 
    { 
      _matrix.identity(); 
      _matrix.translate(mouseX - 10, mouseY - 30); 
      _layout.bitmapData.draw(_layout.brush, _matrix); 
    } 

, 나는 영원히 감사하게 될 거라고! = p

미리 감사드립니다.

답변

0

마우스 위치 사이에 어떤 종류의 보간이 필요할 것입니다. 물론 여러 가지가 있습니다. 구현하기가 쉽지만 미세 조정하기가 어렵습니다. 기본적으로 각 마우스 위치에서 그리기 대신 약간의 지연 시간이있는 마우스 뒤의 이징 방정식을 사용합니다. 이렇게하면 설명 된 선이 더 부드럽게 처리되어 각 마우스 위치 사이에 몇 번 그려집니다.
그래서 대신하고 (의사) :

onMouseMove { 
    draw(mouseX, mouseY); 
} 

당신이 그런 짓을 :

x = 0; 
y = 0; 
onEnterFrame { 
    x += (mouseX - x) * 0.2; 
    y += (mouseY - y) * 0.2; 
    draw(x, y); 
} 

어쩌면 당신이 정말 필요로하는 점 사이의 최대 거리를 제한하는 방법은 그래서 마우스의 경우, 비록 한 프레임에서 더 많이 움직이면, 두 위치 사이의 점을 보간하고 필요에 따라 여러 번 그립니다.
또는 부드러운 선 (날카로운 모서리는 피함)을 찾고 있다면 결과 선을 제어하는 ​​데 베 지어를 사용해야 할 수도 있습니다.
어쨌든, 그것은 모두 당신이 찾고있는 그림의 종류에 따라 다릅니다.