Pixi.js: рдЕрдиреБрдкрд▓рдмреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛: рдбреИрд╢ рд▓рд╛рдЗрди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдЬрдире░ 2015  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pixijs/pixi.js

рдзрд░рд╛рд╢рд╛рдпреА рд░реЗрдЦрд╛ рдирд╣реАрдВ рдЦреАрдВрдЪ рд╕рдХрддреЗ?

ЁЯЩП Feature Request

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдмрд╣реБрднреБрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдзрд░рд╛рд╢рд╛рдпреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
https://codepen.io/unrealnl/pen/aYaxBW

рд╕рднреА 9 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП +1ред рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рд╛рдЗрди рдЯреВ + рдореВрд╡ рдЯреВ рдСрдкрд░реЗрд╢рдВрд╕ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдзрд░рд╛рд╢рд╛рдпреА рд░реЗрдЦрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рд╕рдВрднрд╡рддрдГ рдХреИрдирд╡рд╛рд╕ 2 рдбреА рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред WebGL рдореЗрдВ рдЖрдк рднреА рдРрд╕рд╛ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рд╢реЗрдбрд░ рдореЗрдВ рдбреИрд╢ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдХреБрдЫ рдЕрдирд╛рд╡рд╢реНрдпрдХ рднрд░рдг-рджрд░ рдХреА рдУрд░ рднреА рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реАрд░реНрд╖ рдмреИрдВрдбрд╡рд┐рдбреНрде рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд╛рдЧрдд рдХрдо рд╣реЛрддреА рд╣реИред рдПрдХ рдЕрдиреНрдп рддрд░реАрдХрд╛ рд╕реНрдЯрд┐рдкрд▓рд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмрдирд╛рд╡рдЯ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

рдЖрдИрдПрдордПрдЪрдУ рдХреЛ рдкрд┐рдХреНрд╕реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдк рдЬреЛ рд╕рдорд╛рдзрд╛рди рдЪреБрдирддреЗ рд╣реИрдВ рд╡рд╣ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ @mattdesl рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдбреИрд╢ рд▓рд╛рдЗрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдзреА рд░реЗрдЦрд╛ред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╡рдХреНрд░ рдФрд░ рд╕реНрдкреНрд▓рд┐рди рд╕рд╣рд┐рдд рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкрд┐рдХреНрд╕реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдкрд┐рдХреНрд╕реА рдХреЗ рд▓рд┐рдП рдЖрджрд┐рдо рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рдж @GoodBoyDigital рдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдЯреВрдбреВ рд╕реВрдЪреА рдореЗрдВ рд╣реИ (рдпрд╣рд╛рдВ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ: http://www.goodboydigital.com/pixi-webgl-primitives/)ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдЬрд▓реНрдж рдЖрдиреЗ рдХреА рдЙрдореНрдореАрдж рдереАред

рдФрд░ рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдХреНрд╕реА рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╣ рдХрдо рд╕реЗ рдХрдо рдХреИрдирд╡рд╛рд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдбреНрд░рд╛рдЗрдВрдЧ рдСрдкрд░реЗрд╢рдВрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗред

рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрдВрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдмрд┐рдВрджреАрджрд╛рд░ рд░реЗрдЦрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдорд┐рд▓рд╛, рдФрд░ рдЗрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред
рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ:

function drawdash(x0,y0,x1,y1,linewidth){
        var dashed = new PIXI.Graphics();
        dashed.lineStyle(1, 0x59e3e8, 1); // linewidth,color,alpha
        dashed.moveTo(0, 0);
        dashed.lineTo(linewidth,0);
        dashed.moveTo(linewidth*1.5,0);
        dashed.lineTo(linewidth*2.5,0);
        var dashedtexture = dashed.generateCanvasTexture(1,1);
        var linelength=Math.pow(Math.pow(x1-x0,2) + Math.pow(y1-y0,2) , 0.5);
        var tilingSprite = new PIXI.extras.TilingSprite(dashedtexture, linelength, linewidth);
        tilingSprite.x=x0;
        tilingSprite.y=y0;
        tilingSprite.rotation = angle(x0,y0,x1,y1)*Math.PI/180;
        tilingSprite.pivot.set(linewidth/2, linewidth/2);
        return tilingSprite;
        function angle(x0,y0,x1,y1){
                var diff_x = Math.abs(x1 - x0),
                    diff_y = Math.abs(y1 - y0);
                var cita;
               if(x1>x0){
                    if(y1>y0){
                        cita= 360*Math.atan(diff_y/diff_x)/(2*Math.PI);
                    }else
                   {
                        if(y1<y0){ 
                            cita=-360*Math.atan(diff_y/diff_x)/(2*Math.PI);
                        }else{  
                            cita=0;
                        }
                    }
                }else
                {
                    if(x1<x0){
                        if(y1>y0){
                            cita=180-360*Math.atan(diff_y/diff_x)/(2*Math.PI);
                        }else
                        {
                            if(y1<y0){ 
                                cita=180+360*Math.atan(diff_y/diff_x)/(2*Math.PI);
                            }else{  
                                cita=180;
                            }
                        } 
                    }else{ 
                        if(y1>y0){ 
                            cita=90;
                        }else
                        {
                            if(y1<y0){ 
                                cita=-90;
                            }else{  
                                cita=0;
                            }
                        }
                    }
                }
                return cita;
        }
}

usage:

var linewidth=5;
var tilingSprite = drawdash(100,100,100,400,linewidth);
app.stage.addChild(tilingSprite);
app.ticker.add(function(delta) {
    tilingSprite.tilePosition.x += 0.5*delta;
});

рдХреНрдпрд╛ рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдХреНрдпрд╛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ? CanvasRenderingContext2D рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рдорд╛рдирддрд╛ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдмрд╣реБрднреБрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдзрд░рд╛рд╢рд╛рдпреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
https://codepen.io/unrealnl/pen/aYaxBW

рдзрд░рд╛рд╢рд╛рдпреА рд░реЗрдЦрд╛ рдХрд╛ рдПрдХ рдФрд░ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:

https://codepen.io/bokos/pen/EeBXgR

PIXI.Graphics.prototype.drawDashLine = function(toX, toY, dash = 16, gap = 8) {
  const lastPosition = this.currentPath.shape.points;

  const currentPosition = {
    x: lastPosition[lastPosition.length - 2] || 0,
    y: lastPosition[lastPosition.length - 1] || 0
  };

  const absValues = {
    toX: Math.abs(toX),
    toY: Math.abs(toY)
  };

  for (
    ;
    Math.abs(currentPosition.x) < absValues.toX ||
    Math.abs(currentPosition.y) < absValues.toY;
  ) {
    currentPosition.x =
      Math.abs(currentPosition.x + dash) < absValues.toX
        ? currentPosition.x + dash
        : toX;
    currentPosition.y =
      Math.abs(currentPosition.y + dash) < absValues.toY
        ? currentPosition.y + dash
        : toY;

    this.lineTo(currentPosition.x, currentPosition.y);

    currentPosition.x =
      Math.abs(currentPosition.x + gap) < absValues.toX
        ? currentPosition.x + gap
        : toX;
    currentPosition.y =
      Math.abs(currentPosition.y + gap) < absValues.toY
        ? currentPosition.y + gap
        : toY;

    this.moveTo(currentPosition.x, currentPosition.y);
  }
};

рдЗрд╕ рдереНрд░реЗрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдХреГрдкрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдмрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

MRVDH picture MRVDH  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lunabunn picture lunabunn  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lucap86 picture lucap86  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

samueller picture samueller  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

softshape picture softshape  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ