Strona 1 z 1

Kolorowanka w JS

: 16 kwie 2012, 15:21
autor: norvoles
Powstała dziś rano idea stworzenia kolorowanki, czyli stronki z obrazkiem po którym można sobie bazgrać. I teraz problem jest taki, że stworzyłem coś co kompletnie nie działa i nie mam żadnej koncepcji dlaczego :D
Generalnie za pomocą <canvas> robię sobie trzy warstwy: na obrazek, na bazgroły i na pędzel, no i próbuję to jakoś połączyć.

kolorowanka.html

Kod: Zaznacz cały

<html>
  <head>
    <title>Fun!</title>
    <script language="javascript" type="text/javascript" src="kolorowanka.js"></script>
    <link href="kolorowanka.css" type="text/css" rel="stylesheet">
  </head>

  <body>
    <div style="position: relative;">
      <canvas id="toplayer" width="600" height="600" style="z-index: 1;"></canvas>
      <canvas id="drawlayer" width="600" height="600" style="z-index: 2;"></canvas>
      <canvas id="imagelayer" width="600" height="600" style="z-index: 3;"></canvas>
    </div>
  </body>
</html>
kolorowanka.js

Kod: Zaznacz cały

window.onload = function() {
    var mousePos = {x: 20, y: 20};
    var top_layer_canvas = document.getElementById("toplayer");
    var draw_layer_canvas = document.getElementById("drawlayer");
    var image_layer_canvas = document.getElementById("imagelayer");
    var top_layer_context = document.getElementById("toplayer").getContext("2d");
    var draw_layer_context = document.getElementById("drawlayer").getContext("2d");
    var image_layer_context = document.getElementById("imagelayer").getContext("2d");
    var offsetY = 20;
    var offsetX = 20;
    var brush_size = 15;

    top_layer_canvas.onmousemove = handleMouseMove;
    top_layer_canvas.onclick = draw;
    setInterval( drawBrush, 10); 

    function handleMouseMove(event) {
        mousePos = {
            x: event.clientX - offsetX,
            y: event.clientY - offsetY
        };
        console.log(mousePos);
    }

    function draw(event) {
        alert(mousePos.x + ' ' + mousePos.y);

        draw_layer_context.fillStyle = "rgba(0,0,0,0.4)";
        draw_layer_context.strokeStyle = "rgba(0,153,255,0.4)";
        draw_layer_context.arc(mousePos.x, mousePos.y, brush_size, 0, 2*Math.PI, false);
        draw_layer_context.fill();
    }


    function drawBrush() {
        top_layer_context.clearRect(0, 0, top_layer_canvas.width, top_layer_canvas.height);
        top_layer_context.fillStyle = "rgba(0,0,0,0.4)";
        top_layer_context.strokeStyle = "rgba(0,153,255,0.4)";
        top_layer_context.arc(mousePos.x, mousePos.y, brush_size, 0, 2*Math.PI, false);
        top_layer_context.fill();
    }
}
kolorowanka.css

Kod: Zaznacz cały

canvas {
    border: 2px solid #000;
    float: center;
    margin-right: 20px;
    margin-bottom: 20px;
    position: absolute;
    left: 0;
    top: 0; 
}
Wielkie dzięki za wszelkie sugestie.

Re: Kolorowanka w JS

: 18 kwie 2012, 23:32
autor: kobylecki

Kod: Zaznacz cały

float: center;
jest zbyteczny przy

Kod: Zaznacz cały

position: absolute;
Dziwna konwencja tworzenia canvasu dla pędzla, zwłaszcza, że pędzel będzie myszką sterowany (może css cursor wystarczy?). Ja zrobił tylko jeden canvas, chociaż obrazek we tle też może sobie wisieć.

Re: Kolorowanka w JS

: 24 kwie 2012, 07:57
autor: apb77
Ja bym zaczął od wyrzucenia funkcji poza deklarację zdarzenia window.onload.

Re: Kolorowanka w JS

: 24 kwie 2012, 11:00
autor: ethanak
apb77 pisze:Ja bym zaczął od wyrzucenia funkcji poza deklarację zdarzenia window.onload.
No nie, poważnie? Możesz podać jakiś sensowny powód rezygnacji z closures i śmiecenia po globalnej przestrzeni nazw?

Re: Kolorowanka w JS

: 26 kwie 2012, 22:57
autor: norvoles
Ach, zapomniałem napisać co było źle, a to banał :P
Po prostu źle (odwrotnie) ustawiłem z-index. Element najwyżej powinien mieć największą wartość, a nie najmniejszą.
Po różnych późniejszych przeróbkach zadziałało jak miało.