简体   繁体   English

随机化html5-canvas元素

[英]randomizing html5-canvas elements

Trying to make a scene using HTML5-canvas elements. 尝试使用HTML5画布元素制作场景。

I want to generate 'ice_cell' objects with randomized positions inside the canvas, while also having each element of an 'ice_cell' object have a randomized radius, angles, etc. 我想在画布内生成具有随机位置的“ ice_cell”对象,同时还要使“ ice_cell”对象的每个元素具有随机的半径,角度等。

Here is my (non-working) code: 这是我的(无效)代码:

var can = document.getElementsByTagName('canvas')[0];
if (can.getContext) {
var ctx = can.getContext('2d');

var  ice_cell = function () {

  var posX = Math.random()*can.width();
  var posY = Math.random()*can.height();
  $(this).css({
    "top": y + "px",
    "left": x + "px",
    "transform": "translateX(-50%) translateY(-50%)"
  });

  var radX = [5, 10, 30, 80, 100];
  var rand_radX = radX[Math.floor(radX.length *Math.random())];

  var radY = [5, 10, 30, 80, 100];
  var rand_radY = radY[Math.floor(radY.length *Math.random())];

  var rot = [5, 30, 200];
  var rand_rot = rot[Math.floor(rot.length * Math.random())];

  var start = [0, 2, 5, 10, 50];
  var rand_start = start[Math.floor(start.length * Math.random())];

  var end = [0, 2, 50, 10, 100];
  var rand_end = end[Math.floor(end.length * Math.random())];

  var tranz = [1, 3, 4, 5, 7, 10];
  var rand_tranz = tranz[Math.floor(tranz.length * Math.random())];

  ctx.translate(tranz, 0);

  ctx.ellipse(rand_posX, rand_posY, rand_radX, rand_radY, rand_rot * Math.PI/180, rand_start, rand_end * Math.PI);
};

var colorStroke = function (color, width) {
  ctx.strokeStyle = color;
  ctx.lineWidth = width;
  ctx.stroke();
};

var ice = function () {
  for(var i = 0; i<20;i++){
      colorStroke('cyan', 3);
      colorStroke('white', 1);
    };
  };
};

var degrees = 1;
  for(var i = 0; i < 50; i++){
  ice();
  ctx.rotate(degrees*Math.PI/180);
};

ctx.translate(can.width/2, can.height/2);

Unfortunately my Javascript knowledge is slim to none, so I have been almost guessing what goes where, syntax-wise. 不幸的是,我的Javascript知识简直是薄薄的,所以我几乎一直在猜测语法的去向。

Anyone able to pick out parts that I should just completely re-write? 有人能挑出我应该完全重写的部分吗? Debugging using the console hasn't been getting me very far. 使用控制台进行调试并没有使我走的太远。

Thank you so so much! 非常感谢!

Ellipse is missing from FireFox. FireFox中缺少Ellipse。 Here's a function to make ellipse but I'm not sure how it compares to the official implementation. 这是一个制作椭圆的函数,但是我不确定它与正式实现的比较。 You're also missing the x and y for the css so I commented that out. 您也缺少CSS的x和y,所以我注释掉了。

 var can = document.getElementsByTagName('canvas')[0]; if (can.getContext) { var ctx = can.getContext('2d'); function ellipse(x, y, rx, ry, rotate, startAng, endAng) { ctx.save(); var w = rx * 2; var h = ry * 2; ctx.translate(x + w / 2, y + h / 2); ctx.scale(rx, ry); ctx.rotate(rotate); ctx.beginPath(); ctx.arc(0, 0, 1, startAng, endAng, false); ctx.restore(); } var ice_cell = function() { ctx.beginPath(); var rand_posX = Math.random() * can.width; var rand_posY = Math.random() * can.height; /* $(this).css({ "top": y + "px", "left": x + "px", "transform": "translateX(-50%) translateY(-50%)" }); */ var radX = [5, 10, 30, 80, 100]; var rand_radX = radX[Math.floor(radX.length * Math.random())]; var radY = [5, 10, 30, 80, 100]; var rand_radY = radY[Math.floor(radY.length * Math.random())]; var rot = [5, 30, 200]; var rand_rot = rot[Math.floor(rot.length * Math.random())]; var start = [0, 2, 5, 10, 50]; var rand_start = start[Math.floor(start.length * Math.random())]; var end = [0, 2, 50, 10, 100]; var rand_end = end[Math.floor(end.length * Math.random())]; var tranz = [1, 3, 4, 5, 7, 10]; var rand_tranz = tranz[Math.floor(tranz.length * Math.random())]; ctx.translate(tranz, 0); ellipse(rand_posX, rand_posY, rand_radX, rand_radY, rand_rot * Math.PI / 180, rand_start, rand_end * Math.PI); }; var colorStroke = function(color, width) { ctx.strokeStyle = color; ctx.lineWidth = width; ctx.stroke(); }; var ice = function() { for (var i = 0; i < 20; i++) { colorStroke('cyan', 3); colorStroke('white', 1); }; }; }; var degrees = 1; for (var i = 0; i < 50; i++) { ice_cell(); ice(); ctx.rotate(degrees * Math.PI / 180); }; ctx.translate(can.width / 2, can.height / 2); 
 <canvas></canvas> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM