J'ai une fonction nommée generateNoise()
qui crée un élément canvas et peint des valeurs RGBA aléatoires dessus; ce qui donne l'apparence de bruit.
Ma Question
Quel serait le meilleur moyen d'animer indéfiniment le bruit pour donner l'apparence de mouvement. Afin qu'il ait plus de vie?
function generateNoise(opacite) {
if(!!!document.createElement('canvas').getContext) {
return false;
}
var canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d'),
x,y,
r,g,b,
opacite = opacite || .2;
canvas.width = 55;
canvas.height = 55;
for (x = 0; x < canvas.width; x++){
for (y = 0; y < canvas.height; y++){
r = Math.floor(Math.random() * 255);
g = Math.floor(Math.random() * 255);
b = Math.floor(Math.random() * 255);
ctx.fillStyle = 'rgba(' + r + ',' + b + ',' + g + ',' + opacite + ')';
ctx.fillRect(x,y,1,1);
}
}
document.body.style.backgroundImage = "url(" + canvas.toDataURL("image/png") + ")";
}
generateNoise(.8);
1 votes
window.setInterval('generateNoise(.8)',50);
1 votes
Vous pouvez réduire vos appels
Math.random
etMath.floor
en faisant quelque chose commex = Math.floor(Math.random() * 0xffffff); r = x & 0xff; g = (x & 0xff00) >>> 8; b = (x & 0xff0000) >>> 16;
0 votes
Quelques conseils: 1)
!!!document.createElement('canvas').getContext
en!document.createElement('canvas').getContext
2) mettre en place des instructions conditionnelles pour que les utilisateurs qui n'ont pas de canvas ne reçoivent pas d'erreurs 3) ajouter des espaces entre les virgules et le texte qui suit, et un espace entre(param) {
pour les fonctions0 votes
@PaulS. fais-je fonctionner? je suis complètement un nerb? ça a l'air correct mais je n'arrive pas à le faire fonctionner; nouvelles couleurs: r = Math.floor(Math.random() * 155); g = Math.floor(Math.random() * 255); b = Math.floor(Math.random() * 155);
1 votes
Aussi tout ce que j'ai ajouté était
requestAnimationFrame(generateNoise);
et cela fait ce dont vous avez besoin, placez-le dans la première ligne de la fonction. jsfiddle.net/eS9cc0 votes
Aussi éviter de repeindre un canvas trop souvent, car cela consomme des ressources. Si vous pouvez utiliser la boucle for améliorée cela aidera. Configurez un canvas qui n'a que 10px, et dispersez-le, vous économiserez beaucoup de peinture. Vérifiez les outils de développement de Chrome ou Firebug pour les performances. Quelque chose qui pourrait le rendre vivant est d'utiliser une animation css pour le déplacer très rapidement. Jetez un œil à mon pen et voyez ce que je veux dire. Vous pouvez jouer avec les valeurs et le timing.
0 votes
@IlanBiala, pourriez-vous effectuer les corrections math.random() que Paul S. a mentionnées et fournir une réponse officielle ?
0 votes
@llan Biala, c'est une façon intéressante de le faire, cependant cela semble un peu étrange, pas vraiment comme du bruit réel.
0 votes
@Mouseroot, sauriez-vous pourquoi lorsque je le fais à votre manière, l'opacité ne fonctionne pas?
0 votes
Il se peut que vous itérez sur les positions des pixels x, y tandis que je parcours chaque pixel et ajoute 4 pour r, g, b et alpha. J'utilise 255 (noir) pour les valeurs r, g, b et une valeur aléatoire entre 155 et 254. De plus, je modifie directement les pixels alors que vous placez chaque pixel individuellement. Donc, ma boucle modifie tous les pixels dans le tableau puis les applique, tandis que la vôtre modifie chaque pixel et le règle.
0 votes
@Mouseroot Bien. RAF est génial, mais vous pourriez probablement obtenir le même résultat avec une animation css sur la position de fond du corps. Je pense que RAF n'est pas encore entièrement pris en charge selon caniuse.com/#feat=requestanimationframe
0 votes
@MatthewHarwood tu veux une démo de la mienne ou quelque chose d'autre?
0 votes
Il n'est pas entièrement pris en charge dans tous les navigateurs, mais il existe un polyfill pour les navigateurs qui dépendent encore des préfixes vendeurs et qui utilisent setInterval pour les navigateurs qui ne prennent tout simplement pas en charge rAF.