mercredi 20 mars 2019

Advanced JavaScript/HTML5 canvases

I am learning about HTML5 (canvases) and advanced JavaScript (modules, prototypes, etc.) and would like to re-factor a basic snippet I have put together.

How can I reuse my function to work with multiple canvas elements on the same page? I found this post that describes the general idea I am hoping to achieve. However, I run into issues because I am calling my draw() method when I update an input on the page, which causes me to lose the context. Here is a snippet of what I have so far:

var sliderModule = (function(win, doc) {

  win.onload = init;

  // canvas and context variables
  var canvas1, canvas2, canvas3;
  var context1, context2, context3;

  function init() {
    // draw the initial pattern
    drawPattern1();
    drawPattern2();
    drawPattern3();
  }


  // called whenever the slider value changes
  function drawPattern1() {
    const canvas = document.getElementById('bullsEye1');
    const context = canvas.getContext('2d');
    canvas.width = 100;
    canvas.height = 100;

    const colors = ['#F00', '#00F'];
    const outerRadius = 50;
    let bandSize = doc.getElementById("bandWidth1").value;
    doc.getElementById("currentBandWidth1").innerHTML = bandSize;
    for (
      let r = outerRadius, colorIndex = 0; r > 0; r -= bandSize, colorIndex = (colorIndex + 1) % colors.length
    ) {
      context.fillStyle = colors[colorIndex];
      context.beginPath();
      context.arc(canvas.width / 2, canvas.height / 2, r, 0, Math.PI * 2);
      context.closePath();
      context.fill();
    }
  }

  function drawPattern2() {
    const canvas = document.getElementById('bullsEye2');
    const context = canvas.getContext('2d');
    canvas.width = 100;
    canvas.height = 100;

    const colors = ['#F00', '#00F'];
    const outerRadius = 50;
    let bandSize = doc.getElementById("bandWidth2").value;
    doc.getElementById("currentBandWidth2").innerHTML = bandSize;
    for (
      let r = outerRadius, colorIndex = 0; r > 0; r -= bandSize, colorIndex = (colorIndex + 1) % colors.length
    ) {
      context.fillStyle = colors[colorIndex];
      context.beginPath();
      context.arc(canvas.width / 2, canvas.height / 2, r, 0, Math.PI * 2);
      context.closePath();
      context.fill();
    }
  }

  function drawPattern3() {
    const canvas = document.getElementById('bullsEye3');
    const context = canvas.getContext('2d');
    canvas.width = 100;
    canvas.height = 100;

    const colors = ['#F00', '#00F'];
    const outerRadius = 50;
    let bandSize = doc.getElementById("bandWidth3").value;
    doc.getElementById("currentBandWidth3").innerHTML = bandSize;
    for (
      let r = outerRadius, colorIndex = 0; r > 0; r -= bandSize, colorIndex = (colorIndex + 1) % colors.length
    ) {
      context.fillStyle = colors[colorIndex];
      context.beginPath();
      context.arc(canvas.width / 2, canvas.height / 2, r, 0, Math.PI * 2);
      context.closePath();
      context.fill();
    }
  }

  return {
    drawPattern1: drawPattern1,
    drawPattern2: drawPattern2,
    drawPattern3: drawPattern3
  };

})(window, document);
main {
  width: 100%;
}

div {
  width: 30%;
}

#left {
  float: left;
  margin-left: 2%;
}

#middle {
  position: relative;
  left: 0px;
  right: 0px;
  margin: auto;
}

#right {
  float: right;
  margin-right: 2%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!DOCTYPE html>
<html>
<title>Bulls Eye</title>

<head>
</head>

<body>
  <main>
    <div id="left">
      <canvas id="bullsEye1" style="border: 1px solid;">                  </canvas><br>
      <label for="bandWidth1">BandWidth:</label>
      <input type="range" id="bandWidth1" min="5" max="50" step="5" value="25" oninput="sliderModule.drawPattern1()"></input>
      <p>Current band width: <span id="currentBandWidth1"></span></p>
    </div>
    <div id="right">
      <canvas id="bullsEye2" style="border: 1px solid;"></canvas><br>
      <label for="bandWidth2">BandWidth:</label>
      <input type="range" id="bandWidth2" min="5" max="50" step="5" value="25" oninput="sliderModule.drawPattern2()"></input>
      <p>Current band width: <span id="currentBandWidth2"></span></p>
    </div>
    <div id="middle">
      <canvas id="bullsEye3" style="border: 1px solid;"></canvas><br>
      <label for="bandWidth3">BandWidth:</label>
      <input type="range" id="bandWidth3" min="5" max="50" step="5" value="25" oninput="sliderModule.drawPattern3()"></input>
      <p>Current band width: <span id="currentBandWidth3"></span></p>
    </div>
    <br style="clear:both;" />
  </main>

</html>

Aucun commentaire:

Enregistrer un commentaire