'How can I use JSON array value to display random images in JS?
I am developping a little avatar generator. Each hairstyles come in 2 parts (front and back) but since every asset is loaded randomly the colors don't match, so I created a JSON file to put them in arrays by colors, so for example, every ginger fronthair/backhair and eyebrows always load together.
Now the tricky part is that I cannot figure how to implement the values in the random load, and I can't seem to find any answer to this problem.
(I just started learning how to use JSON, so it's fairly new to me).
Does anyone have any advice/leads :-)?
Here is my JS script:
document.addEventListener("DOMContentLoaded", function() {
let canvas = document.getElementById('canvas');
if (canvas.getContext) {
let ctx = canvas.getContext('2d');
let download_btn = document.getElementById('download_btn');
let background_btn = document.getElementById('background_btn');
let colors = ["lightcoral", "lightblue", "lightpink", "lightgreen"];
let path = "img/";
let backhair_nbr = get_random_image(20, 1);
let body_nbr = get_random_image(25, 1);
let clothes_nbr = get_random_image(12, 1);
let eyebrows_nbr = get_random_image(20, 1);
let eyes_nbr = get_random_image(30, 1);
let mouth_nbr = get_random_image(5, 1);
let nose_nbr = get_random_image(4, 1);
let fronthair_nbr = get_random_image(20, 1);
let backhair_img = new Image();
let body_img = new Image();
let clothes_img = new Image();
let eyebrows_img = new Image();
let eyes_img = new Image();
let mouth_img = new Image();
let nose_img = new Image();
let fronthair_img = new Image();
backhair_img.crossOrigin = "anonymous";
body_img.crossOrigin = "anonymous";
clothes_img.crossOrigin = "anonymous";
eyebrows_img.crossOrigin = "anonymous";
eyes_img.crossOrigin = "anonymous";
nose_img.crossOrigin = "anonymous";
mouth_img.crossOrigin = "anonymous";
fronthair_img.crossOrigin = "anonymous";
backhair_img.src = path + "backhair/man/backhair" + backhair_nbr;
body_img.src = path + "body/body" + body_nbr;
clothes_img.src = path + "clothes/clothes" + clothes_nbr;
eyebrows_img.src = path + "eyebrows/eyebrows" + eyebrows_nbr;
eyes_img.src = path + "eyes/man/eyes" + eyes_nbr;
mouth_img.src = path + "mouth/man/mouth" + mouth_nbr;
nose_img.src = path + "nose/nose" + nose_nbr;
fronthair_img.src = path + "fronthair/man/fronthair" + fronthair_nbr;
let background_color = get_random_color();
window.onload = function() {
draw_avatar();
}
background_btn.addEventListener('click', function(e) {
background_color = get_random_color();
draw_avatar();
});
download_btn.addEventListener('click', function(e) {
var link = document.createElement('a');
link.download = 'avatar.png';
link.href = canvas.toDataURL()
link.click();
link.delete;
});
function draw_avatar() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = background_color;
ctx.fillRect(0, 0, 500, 500);
ctx.drawImage(backhair_img, 0, 0);
ctx.drawImage(body_img, 0, 0);
ctx.drawImage(clothes_img, 0, 0);
ctx.drawImage(eyebrows_img, 0, 0);
ctx.drawImage(eyes_img, 0, 0);
ctx.drawImage(mouth_img, 0, 0);
ctx.drawImage(nose_img, 0, 0);
ctx.drawImage(fronthair_img, 0, 0);
}
function get_random_image(a, b) {
return Math.floor(Math.random() * a) + b + ".png";
}
function get_random_color() {
return colors[parseInt(Math.random() * colors.length)];
}
}
else {alert('Sorry, your browser do not support canvas ...');}
});
And here is a part of my JSON file for example:
{
"img": "/img/backhair/man/backhair1.png",
"color": "blond"
},
{
"img": "/img/backhair/man/backhair2.png",
"color": "ginger"
},
{
"img": "/img/backhair/man/backhair3.png",
"color": "auburn"
},
{
"img": "/img/backhair/man/backhair4.png",
"color": "chestnut"
},
{
"img": "/img/backhair/man/backhair5.png",
"color": "black"
},
Solution 1:[1]
So you have
let backhair_nbr = get_random_image(20, 1); // should match
let body_nbr = get_random_image(25, 1);
let clothes_nbr = get_random_image(12, 1);
let eyebrows_nbr = get_random_image(20, 1); // should match
let eyes_nbr = get_random_image(30, 1);
let mouth_nbr = get_random_image(5, 1);
let nose_nbr = get_random_image(4, 1);
let fronthair_nbr = get_random_image(20, 1); // should match
Then the easiest approach is randomize once, repeat in the others
let matched = get_random_image(20, 1); // should match
let backhair_nbr = matched;
let body_nbr = get_random_image(25, 1);
let clothes_nbr = get_random_image(12, 1);
let eyebrows_nbr = matched;
let eyes_nbr = get_random_image(30, 1);
let mouth_nbr = get_random_image(5, 1);
let nose_nbr = get_random_image(4, 1);
let fronthair_nbr = matched;
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | malarres |
