ΠΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠ½ΠΊΡΠΈΡΠ½ΡΡ Π»ΠΈΠ½ΠΈΡ?
+1 Π·Π° ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ. ΠΡΠ»ΠΎ Π±Ρ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΈΡΡΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ.
Π€ΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ lineTo + moveTo, ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠ½ΠΊΡΠΈΡΠ½ΡΡ Π»ΠΈΠ½ΠΈΡ.
ΠΠ½ΡΡΡΠ΅Π½Π½Π΅ ΡΡΠΎ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π±ΡΠ΄Π΅Ρ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² canvas2D. Π WebGL Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΈΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΠΈΡΠ΅ Π²ΠΎ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ½ΠΎΠΌ ΡΠ΅ΠΉΠ΄Π΅ΡΠ΅. ΠΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΠΈ ΡΠΎΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π»ΠΈΡΠ½Π΅ΠΌΡ ΡΠΈΠ»Π»ΡΠ΅ΠΉΡΡ, Π½ΠΎ ΡΡΠΎΠΈΡ ΠΌΠ΅Π½ΡΡΠ΅ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΏΡΡΠΊΠ½ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ Π²Π΅ΡΡΠΈΠ½. ΠΡΡΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠ΅Π³ΠΎΡΡ ΡΠ·ΠΎΡΠ° ΡΠ΅ΠΊΡΡΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΡΠΈΡ ΠΎΠ²ΠΊΠΈ.
ΠΠΠ₯Π, ΡΡΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ°ΡΡΡΡ Pixi, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΈ ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²Ρ Π²ΡΠ±Π΅ΡΠ΅ΡΠ΅, ΠΌΠΎΠΆΠ΅Ρ ΡΠΈΠ»ΡΠ½ΠΎ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π― ΠΌΠΎΠ³Ρ ΠΏΠΎΠ½ΡΡΡ ΡΠΎΡΠΊΡ Π·ΡΠ΅Π½ΠΈΡ @mattdesl , ΠΈ Π½Π΅ ΡΠ°ΠΊ ΡΠΆ ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ½ΠΊΡΠΈΡΠ½ΡΡ Π»ΠΈΠ½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΠΏΡΡΠΌΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ. ΠΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π°Π΄ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ Ρ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π³ΡΠ°ΡΠΈΠΊΠΎΠΉ, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΊΡΠΈΠ²ΡΠ΅ ΠΈ ΡΠΏΠ»Π°ΠΉΠ½Ρ, Π±ΡΠ»ΠΎ Π±Ρ ΠΎΡΠ΅Π½Ρ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π² pixi.
ΠΠΎΡΠ»Π΅ Π°Π½ΠΎΠ½ΡΠ° ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ² Π΄Π»Ρ pixi @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