在矩形画布中创建彩虹效果 [英] Creating a Rainbow Effect in Rectangle Canvas

查看:321
本文介绍了在矩形画布中创建彩虹效果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道如何在我的画布中以填充样式创建彩虹效果,就像它以特定间隔或当我不断按键时更改颜色一样。类似于从红色到蓝色等,类似于如何为文本添加彩虹效果。

I would like to know how to create a rainbow effect in my canvas in the fill style, like for it to change colors at certain intervals or when I continually press a key. Like from red to blue, etc, similar to how you can add a rainbow effect to text.

<script type="text/javascript">
var GAME_SPEED = 1000/60; //game rate
var x = 100;
var y = 100;
var sideLength = 10;

var leftKey = false;
var rightKey = false;
var upKey = false;
var downKey = false;
var spaceKey = false;

window.onload = function()
	{
		c = document.getElementById("marCanvas2");
		c.width = window.innerWidth*0.9;
		c.height = window.innerHeight*0.9;
		window.setInterval("draw()" , GAME_SPEED);
	}

document.onkeyup = function(event)
{
	switch(event.keyCode)
	{
		case 37: leftKey =false;
		break;
		case 39: rightKey = false;
		break;
		case 38: upKey = false;
		break;
		case 40: downKey = false;
		break;
		case 32: spaceKey = false;
		break;
	}
}

document.onkeydown = function(event)
{
	switch(event.keyCode)
	{
		case 37: leftKey =true;
		break;
		case 39: rightKey = true;
		break;
		case 38: upKey = true;
		break;
		case 40: downKey = true;
		break;
		case 32: spaceKey = true;
		break;
	}
}


function draw()
{
	if(leftKey == true)
{
	x--;
}

if(rightKey == true)
{
	x++;
}

if(upKey == true)
{
	y--;
}

if(downKey == true)
{
	y++;
}

if(spaceKey == true)
{
	sideLength++;
}
	var c = document.getElementById("marCanvas2");
	var cntxt = c.getContext("2d");
	cntxt.fillStyle= " ";
	cntxt.fillRect(x, y, sideLength, sideLength);
}
</script>
</head>
	<body>
	<!--Marlon Jacques -->
<canvas id="marCanvas2" style="border: 5px solid
#000000;">
Your browser does not support the canvas element.
</canvas>
</body>
</html>

推荐答案

您可以通过动态定义渐变的开始和结束来完成此操作。你想要什么颜色取决于你,但你可以使用例如HSL颜色模型来旋转一个颜色范围,以不同的速度开始和结束。

You can do this by dynamically defining the start and end of the gradient. What colors you want is up to you, but you can use for example HSL color model to "rotate" through a color range with different speed for start and end.

var ctx = document.querySelector("canvas").getContext("2d"),
    angleA = Math.random() * 360,                                // start angle (for HSL)
    angleB = Math.random() * 360,
    stepA = 1.2, stepB = 0.7;                                    // "speed" for change

function createGradient() {
  var gr = ctx.createLinearGradient(0, 0, 500, 0);               // create gradient
  gr.addColorStop(0, "hsl(" + (angleA % 360) + ",100%, 50%)");   // start color
  gr.addColorStop(1, "hsl(" + (angleB % 360) + ",100%, 50%)");   // end color
  ctx.fillStyle = gr;                                            // set as fill style
  ctx.fillRect(0, 0, 500, 150);                                  // fill area
}

// demo loop
(function anim() {
  createGradient();
  ctx.clearRect(8,8,484,134);
  // =========> DRAW YOUR FRONT OBJECTS HERE <=========
  angleA += stepA;                                               // increase angles
  angleB += stepB;
  requestAnimationFrame(anim)
})();

<canvas width=500></canvas>

在上面的演示中,开始和结束颜色或多或少是随机的,你只需先给一个开头,然后另一个跟随:

In the demo above the start and end colors are more or less random, you can instead just give one a head start so the other follows:

var ctx = document.querySelector("canvas").getContext("2d"),
    angle = Math.random() * 360,                                 // start angle (for HSL)
    angleDlt = 60,                                               // 60° ahead
    step = 1;                                                    // "speed" for change

function createGradient() {
  var gr = ctx.createLinearGradient(0, 0, 500, 0);               // create gradient
  gr.addColorStop(0, "hsl(" + (angle % 360) + ",100%, 50%)");    // start color
  gr.addColorStop(0.5, "hsl(" + ((angle + (angleDlt/2)) % 360) + ",100%, 50%)");
  gr.addColorStop(1, "hsl(" + ((angle + angleDlt) % 360) + ",100%, 50%)");
  ctx.fillStyle = gr;                                            // set as fill style
  ctx.fillRect(0, 0, 500, 150);                                  // fill area
}

// demo loop
(function anim() {
  createGradient();
  ctx.clearRect(8,8,484,134);
  angle += step;                                               // increase angles
  requestAnimationFrame(anim)
})();

<canvas width=500></canvas>

这篇关于在矩形画布中创建彩虹效果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆