Cristalab

Clase para dibujar líneas de puntos en ActionScript 3

Por: Zguillez + 04.03.2008

Esta es una pequeña clase para dibujar lineas puntuadas con ActionScript 3. Su funcionamiento es muy sencillo, únicamente va dibujando puntos y los posiciona uno detrás del otro simulando la línea.

El resultado sería una linea como esta:



De entrada tendremos una clase Circulo.as que es la que nos dibujará un circulo concreto. Esa es una clase independiente para hacerla más reutilizable, ya que la podremos utilizar siempre que queramos dibujar círculos.

Código :

package com.zguillez.display.graphics
{
   import flash.display.Sprite;
   import flash.display.Shape;
   import flash.display.Graphics;
   //------------------------------------------
   public class Circulo extends Sprite
   {
      private var _clip:Shape;
      private var _size:uint;
      private var _bgColor:uint;
      private var _borderSize:uint;
      private var _borderColor:uint;
      private var _bg:Boolean;
      //------------------------------------------
      public function Circulo(size=10,bgColor=0x000000,bg=true,borderSize=0,bordeColor=0x000000)
      {
         _size = size;
         _bg = bg;
         _bgColor = bgColor;
         _borderSize = borderSize;
         _borderColor = bordeColor;
         dibuja();
      }
      //------------------------------------------
      private function dibuja():void
      {
         _clip = new Shape();
         if (_bg==true) {
            _clip.graphics.beginFill(_bgColor);
         }
         if (_borderSize!=0) {
            _clip.graphics.lineStyle(_borderSize, _borderColor);
         }
         var radio:uint = Math.round(_size/2);
         _clip.graphics.drawCircle(radio, radio, radio);
         if (_bg==true) {
            _clip.graphics.endFill();
         }
         addChild(_clip);
      }
      //------------------------------------------
   }
}


Al constructor de la clase le pasamos el ancho del circulo, el color de fondo, y si lleva linea de borde con sus valores.

Ahora escribiremos una clase LineaPuntuada.as, que generará un Sprite en el que colocará los círculos formando la línea.

Código :

package com.zguillez.display
{
   import flash.display.Sprite;
   import flash.geom.Point;
   import com.zguillez.display.graphics.Circulo;
   //-----------------------------------------
   public class LineaPuntuada extends Sprite
   {
      private var _linea:Sprite;
      private var _size:uint;
      private var _space:uint;
      private var _bgColor:uint;
      private var _point1:Point;
      private var _point2:Point;
      private var _numCirculos:uint;
      //-----------------------------------------
      public function LineaPuntuada(size=3,space=9,bgColor=0x000000)
      {
         _linea = new Sprite();
         _size = size;
         _space = space;
         _bgColor = bgColor;
         addChild(_linea);
      }
      //-----------------------------------------
      public function moveTo(pX:int, pY:int):void
      {
         _point1 = new Point(pX, pY);
         _linea.x = _point1.x;
         _linea.y = _point1.y;
      }
      //-----------------------------------------
      public function lineTo(pX:int, pY:int):void
      {
         _point2 = new Point(pX, pY);
         _numCirculos = Point.distance(_point1, _point2) / _space;
         drawCirculos();
      }
      //-----------------------------------------
      private function drawCirculos():void
      {
         for (var i:uint = 0; i <= _numCirculos; i++)
         {
            var circulo:Circulo = new Circulo(_size, _bgColor);
            circulo.x = (_point2.x - _point1.x) / _numCirculos * i;
            circulo.y = (_point2.y - _point1.y) / _numCirculos * i;
            _linea.addChild(circulo);            
         }
      }
      //-----------------------------------------
   }
}


En el constructor pasaremos los parámetros que queremos para la linea, como el grosos del punto, el color y el espaciado entre puntos.

Utilizaremos los métodos moveTo y lineTo para posicionar la línea sobre el lienzo.

Este sería el código para obtener una linea como la mostrada al inicio del tip.

Código :

import com.zguillez.display.LineaPuntuada;

var linea:LineaPuntuada = new LineaPuntuada(2,5);
linea.moveTo(10,10);
linea.lineTo(490,50);
addChild(linea);

Etiquetas actionscript_3

Comentarios | Enviar un comentario
miau muy bueno Sonrisa
Por: eldervaz
Buen trabajo, faltaría un método lineStyle para definir las propiedades una vez creada, pero cualquiera que esté interesado puede hacerlo en pocos minutos.

Lo que sí se podría hacer es pasar un Array de colores como este: [0xFF0000, 0x00FF00, 0x0000FF] y después la línea se dibujaría con un punto de cada color.
Por: HernanRivas (logout)_blog
Mi desconectado alter ego tiene razón. Eso del Array es buena idea.

El truco es convertir la propiedad privada _bgcolor en un getter privado:

Código :


private static const SOLID:String = "solid";
private static const COLOR_ARRAY:String = "colorarray";

private var colorMode:String = SOLID;

private var currIndex:int = 0;
private var colorArray:Array = new Array (0xFF0000, 0x00FF00, 0x0000FF); // Seteable por el usuario

private var solidColor:uint; // Color definido por el usuario
private function get _bgColor ():uint
{
if (colorMode == COLOR_ARRAY)
{
currIndex = currIndex < colorArray.lenght - 1? currIndex +1 : 0;
return colorArray[currIndex ];
}
else
{
return solidColor;
}
}

Por: HernanRivas
Hola:
Una consulta..
Que programa recomientan para trabajar con ActionScript3 en linux?
Salul2...
Por: Mario_blog
Ecplise con el plugin de Flex3.
Por: HernanRivas (logout)
Gracias Zguillez, había estado buscando algo para solucionar esto, ya que en el Flash se puede dibujar a mano pero con actionscript no. Saludos.
Por: Pablo Mercado_blog
Copio y pego:
"Gracias Zguillez, había estado buscando algo para solucionar esto, ya que en el Flash se puede dibujar a mano pero con actionscript no. Saludos.
Por: Pablo Mercado_blog"

Jajajajajajaja X)
Por: quien yo?_blog
Yo creé mi propia forma de dibujar lineas de trazos en AS2:

Código :

import flash.geom.*;
this.lineStyle(2,0,100);
function lineapuntos(ax, ay, bx, by, trazo, hueco){
   pa = new Point(ax, ay); pb= new Point(bx, by);
   d = Point.distance(pa, pb);
   t = Point.interpolate(pb, pa, trazo/d).subtract(pa);
   h = Point.interpolate(pb, pa, hueco/d).subtract(pa);
   nb = Math.abs((bx-ax-t.x)/(t.x+h.x))
   for(n=0; n<=nb; n++){
      this.moveTo(pa.x, pa.y); pa.offset(t.x, t.y);
      this.lineTo(pa.x, pa.y);
      if((nb-n)<1){dib.moveTo(pb.x,pb.y); dib.lineTo(pa.x-t.x,pa.y-t.y);}
      else dib.lineTo(pa.x,pa.y);
      pa.offset(h.x, h.y);
   }
}
// ejemplo:
lineapuntos(100,50,300,250,12,7);


una vez definido el estilo de linea, solo hay que llamar a la función con los 2 puntos y el trazo y hueco deseados.

Ejemplo de dibujo:


Si quieres, pásala a clase AS3 y añádele algunas cosillas amigo Z Guiño
Por: Teseo

Teseo :

Si quieres, pásala a clase AS3 y añádele algunas cosillas amigo Z Guiño

Ten por seguro que lo haré. Esta genial tu código Thumbs up
Por: Zguillez
Perfecto Z. Así nos ayudamos un poco todos. Muy Feliz

Pero el código correcto es el que sigue. Mezclé partes del ejemplo base y de la demostración y aparece un MC "dib" erróneo en la condición del final de la linea. Sorry. Aw Crap

Código :

import flash.geom.*;
this.lineStyle(2,0,100);
function lineapuntos(ax, ay, bx, by, trazo, hueco){
   pa = new Point(ax, ay); pb= new Point(bx, by);
   d = Point.distance(pa, pb);
   t = Point.interpolate(pb, pa, trazo/d).subtract(pa);
   h = Point.interpolate(pb, pa, hueco/d).subtract(pa);
   nb = Math.abs((bx-ax-t.x)/(t.x+h.x))
   for(n=0; n<=nb; n++){
      this.moveTo(pa.x, pa.y); pa.offset(t.x, t.y);
      this.lineTo(pa.x, pa.y); pa.offset(h.x, h.y);
      if((nb-n)<1){this.moveTo(pb.x,pb.y); this.lineTo(pa.x, pa.y);}
   }
}
// ejemplo:
lineapuntos(100,50,300,250,12,7);

Por: Teseo
bueno, una vez más excelente. Sonrisa
Por: Sisco
Teseo, me podrias pasar el codigo del ejemplo que has puesto. Es que necesito hacer algo muy parecido a eso.
Por: nachoam_blog
Este es el ejemplo:
bajar FLA
Por: Teseo
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.