0

スクリプトを手伝ってくれる人はいますか? jsfiddle.net/7QmSz/3を参照してください。

HTML:

<canvas id="canvas" height="1000" width="1000" class="bezier" style="cursor: default;"></canvas>

CSS:

#canvas
{
    position: absolute;
    left: 100px;
    top: 100px;
    background-color: rgba(255, 255, 255, 0.1);
}

JavaScript:

(function() {
    var canvas;
    var ctx; 
    var code; 
    var point;
    var style;
    var drag = null; 
    var dPoint;

    function Init(quadratic) {
        point = {
            p1: { x:50, y:100 },
            p2: { x:200, y:100 },
            p3: { x:50 , y:100 },
            p4: { x:200 , y:100 }
        };

        if (quadratic) {
            point.cp1 = { x: 50, y: 50 };
            point.cp3 = { x: 250, y: -110 };
        }
        else {
            point.cp1 = { x: 50, y: 10 };
            point.cp2 = { x: 200, y: 10 };
            point.cp3 = { x: 50, y: 190 };
            point.cp4 = { x: 200, y: 190 };
        }

        style = {
            curve:  { width: 2, color: "#C0C0C0" },
            cpline: { width: 1, color: "#C0C0C0" },
            point: { radius: 3, width: 1, color: "#C0C0C0", fill: "rgba(200,200,200,0.5)", arc1: 0, arc2: 2 * Math.PI },
        }

        ctx.lineCap = "round";
        ctx.lineJoin = "round";

        canvas.onmousedown = DragStart;
        canvas.onmousemove = Dragging;
        canvas.onmouseup = canvas.onmouseout = DragEnd;

        DrawCanvas();
    }

    function DrawCanvas() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);

        ctx.lineWidth = style.cpline.width;
        ctx.strokeStyle = style.cpline.color;
        ctx.beginPath();
        ctx.moveTo(point.p1.x, point.p1.y);
        ctx.lineTo(point.cp1.x, point.cp1.y);
        if (point.cp2) {
            ctx.moveTo(point.p2.x, point.p2.y);
            ctx.lineTo(point.cp2.x, point.cp2.y);
        }
        else {
            ctx.lineTo(point.p2.x, point.p2.y);
        }
        ctx.stroke();

        ctx.lineWidth = style.cpline.width;
        ctx.strokeStyle = style.cpline.color;
        ctx.beginPath();
        ctx.moveTo(point.p3.x, point.p3.y);
        ctx.lineTo(point.cp3.x, point.cp3.y);
        if (point.cp2) {
            ctx.moveTo(point.p4.x, point.p4.y);
            ctx.lineTo(point.cp4.x, point.cp4.y);
        }
        else {
            ctx.lineTo(point.p4.x, point.p4.y);
        }
        ctx.stroke();

        ctx.lineWidth = style.curve.width;
        ctx.strokeStyle = style.curve.color;
        ctx.beginPath();
        ctx.moveTo(point.p1.x, point.p1.y);
        if (point.cp2) {
            ctx.bezierCurveTo(point.cp1.x, point.cp1.y, point.cp2.x, point.cp2.y, point.p2.x, point.p2.y);
        }
        else {
            ctx.quadraticCurveTo(point.cp1.x, point.cp1.y, point.p2.x, point.p2.y);
        }
        var img = new Image();
        img.src = 'http://img201.imageshack.us/img201/5708/eyeq.jpg';
        var pattern = ctx.createPattern(img, 'repeat')
        ctx.globalAlpha = "1";
        ctx.fillStyle = pattern;
        ctx.fill();
        ctx.stroke();

        ctx.lineWidth = style.curve.width;
        ctx.strokeStyle = style.curve.color;
        ctx.beginPath();
        ctx.moveTo(point.p3.x, point.p3.y);
        if (point.cp3) {
            ctx.bezierCurveTo(point.cp3.x, point.cp3.y, point.cp4.x, point.cp4.y, point.p4.x, point.p4.y);
        }
        else {
            ctx.quadraticCurveTo(point.cp3.x, point.cp3.y, point.p4.x, point.p4.y);
        }
        var img = new Image();
        img.src = 'http://img201.imageshack.us/img201/5708/eyeq.jpg';
        var pattern = ctx.createPattern(img, 'repeat')
        ctx.globalAlpha = "1";
        ctx.fillStyle = pattern;
        ctx.fill();
        ctx.stroke();

        for (var p in point) {
            if(p == 'cp1' || p == 'cp2' || p == 'cp3' || p == 'cp4')
            {
                ctx.lineWidth = style.point.width;
                ctx.strokeStyle = style.point.color;
                ctx.fillStyle = style.point.fill;
                ctx.beginPath();
                ctx.arc(point[p].x, point[p].y, style.point.radius, style.point.arc1, style.point.arc2, true);
                ctx.fill();
                ctx.stroke();
            }
            else
            {
                ctx.lineWidth = style.point.width;
                ctx.strokeStyle = style.point.color;
                ctx.fillStyle = style.point.fill;
                ctx.beginPath();
                ctx.rect(point[p].x - 4,  point[p].y - 4, 7, 7);
                ctx.fill();
                ctx.stroke();
            }
        }
    }

    function DragStart(e) {
        e = MousePos(e);
        var dx, dy;
        for (var p in point) {
            dx = point[p].x - e.x;
            dy = point[p].y - e.y;
            if ((dx * dx) + (dy * dy) < style.point.radius * style.point.radius) {
                if(p == 'cp1' || p == 'cp2' || p == 'cp3' || p == 'cp4')
                {
                    drag = p;
                    dPoint = e;
                    canvas.style.cursor = "move";
                }
                return;
            }
        }
    }

    function Dragging(e) {
        if (drag) {
            e = MousePos(e);
            point[drag].x += e.x - dPoint.x;
            point[drag].y += e.y - dPoint.y;
            dPoint = e;
            DrawCanvas();
        }
    }

    function DragEnd(e) {
        drag = null;
        canvas.style.cursor = "default";
        DrawCanvas();
    }

    function MousePos(event) {
        event = (event ? event : window.event);
        return {
            x: event.pageX - canvas.offsetLeft,
            y: event.pageY - canvas.offsetTop
        }
    }

    canvas = document.getElementById("canvas");
    if (canvas.getContext) {
        ctx = canvas.getContext("2d");
        Init(canvas.className == "quadratic");
    }
})();

問題は、最初にページをロードするかブラウザを更新するときに、スクリプトが背景画像をロードしないことです。代わりに、デフォルトの背景が表示されます。何が問題なのかわからない。

4

1 に答える 1

0

最初に画像のダウンロードが完了するのを待っているわけではないので、画像がまだ利用可能になっていない間、キャンバスは残りのコードを実行します。<img>キャンバスの前に画像の src を持つ要素を配置するか、最初に Image() を作成し、onload ハンドラを指定してから、src 属性を設定し、onload ハンドラがキャンバスのコードを呼び出すようにして、最初にロードするように強制します。

于 2013-04-01T13:43:05.180 に答える