рдзрд░рд╛рд╢рд╛рдпреА рд░реЗрдЦрд╛ рдирд╣реАрдВ рдЦреАрдВрдЪ рд╕рдХрддреЗ?
рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП +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);
}
};
рдЗрд╕ рдереНрд░реЗрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдХреГрдкрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдмрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдмрд╣реБрднреБрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдзрд░рд╛рд╢рд╛рдпреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
https://codepen.io/unrealnl/pen/aYaxBW