μ μ μ 그릴 μ μμ΅λκΉ?
μ΄ κΈ°λ₯μ λν΄ +1μ λλ€. μμΌλ©΄ λ§€μ° μ’μ κ²μ λλ€.
λ§μ lineTo + moveTo μμ μ μννλ ν¨μλ μ μ μ μ»μ μ μμ΅λλ€.
λ΄λΆμ μΌλ‘ μ΄κ²μ μλ§λ canvas2Dμμ μνλλ λ°©μμΌ κ²μ λλ€. WebGLμμ λμΌν μμ μ μννκ±°λ νλκ·Έλ¨ΌνΈ μ °μ΄λμ λμλ₯Ό μ μ©ν μ μμ΅λλ€. νμλ λ 볡μ‘νκ³ λΆνμν μ±μ°κΈ° μλλ₯Ό μ λ°νμ§λ§ μ μ λμν μΈ‘λ©΄μμ λΉμ©μ΄ μ κ² λλλ€. λ λ€λ₯Έ μ κ·Ό λ°©μμ λ°λ³΅λλ ν μ€μ² ν¨ν΄μ μ¬μ©νμ¬ μ μ μ λ§λλ κ²μ λλ€.
IMHO μ΄κ²μ ꡬνλ μ μλ λ§μ λ°©λ²μ΄ μκ³ μ νν μ΄λ€ μ루μ μ μ ννλμ§κ° μ ν리μΌμ΄μ μ ν¬κ² μμ‘΄ν μ μκΈ° λλ¬Έμ Pixiμ μΌλΆμΌ νμκ° μμ΅λλ€.
λλ @mattdesl μ κ΄μ μ μ΄ν΄ν μ μκ³ μλ₯Ό λ€μ΄ μ§μ μ λν λμ λΌμΈμ ꡬννλ κ²μ 그리 μ΄λ ΅μ§ μμ΅λλ€. κ·Έλ¬λ 곑μ κ³Ό μ€νλΌμΈμ ν¬ν¨νμ¬ κ½€ 볡μ‘ν κ·Έλν½μ΄ μλ νλ‘μ νΈμμ μμ ν λ pixiμ μ΄ κΈ°λ₯μ΄ ν¬ν¨λλ©΄ λ§€μ° μ’μ κ²μ λλ€.
pixi @GoodBoyDigital μ ν리미ν°λΈ λ°ν ν ν μΌ λͺ©λ‘μ μλ€κ³ λ°νμ΅λλ€(μ¬κΈ° μ£Όμ: http://www.goodboydigital.com/pixi-webgl-primitives/). κ·Έλμ μ λ§ λΉ¨λ¦¬ λμ°©νκΈ°λ₯Ό λ°λμ΅λλ€.
κ·Έλ¦¬κ³ μ μ΄λ μΊλ²μ€μμ μ¬μ©ν μ μλ 그리기 μμ μ pixiμμ μ§μνλ κ²μ΄ μ’μ κ²μ΄λΌκ³ μκ°ν©λλ€.
μμ§ μ μ μ ꡬνν κ³νμ΄ μμΌλ―λ‘ μ§κΈμ λ«μ΅λλ€. κ°μ¬ ν΄μ!
λλ λνμ΄ λ¬Έμ λ₯Ό λ§λ¬κ³ κ°λ¨ν λ°©λ²μΌλ‘ ν΄κ²°νμ΅λλ€.
μ½λλ λ€μκ³Ό κ°μ΅λλ€.
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