我正在使用基于在线教程的canvas元素进行操作,并构建了以下页面here。
这是我的标记:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Canvas Game</title>
<link rel="stylesheet" href="style.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script src="script.js"></script>
</head>
<body>
<header>
<h1>Cool Canvas Bouncing Effect!</h1>
<p>Which would you like to see bounce around?</p>
<input id="beachBallButton" type="button" value="Beach Ball" />
<input id="avatarButton" type="button" value="Avatar" />
</header>
<br />
<canvas id="myCanvas" width="600" height="400">
Your browser does not support canvas!
</canvas>
</body>
</html>
这是我的JavaScript:
$(document).ready(function() {
const FPS;
var x = 0;
var y = 0;
var xDirection = 1;
var yDirection = 1;
var image = new Image();
image.src = null;
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
$('#avatarButton').click(function() {
x = 0;
y = 0;
FPS = 30;
image.src = 'avatar.png';
setInterval(draw, 1000 / FPS);
function draw() {
ctx.clearRect(0,0,canvas.width,canvas.height);
ctx.fillRect(0,0,canvas.width,canvas.height);
ctx.drawImage(image, x, y);
x += 1 * xDirection;
y += 1 * yDirection;
if (x >= 500)
{
x = 500;
xDirection = -1;
}
else if (x <= 0)
{
x = 0;
xDirection = 1;
}
if (y >= 300)
{
y = 300;
yDirection = -1;
}
else if (y <= 0)
{
y = 0;
yDirection = 1;
}
}
});
$('#beachBallButton').click(function() {
x = 0;
y = 0;
FPS = 60;
image.src = 'beachball.png';
setInterval(draw, 1000 / FPS);
function draw() {
ctx.clearRect(0,0,canvas.width,canvas.height);
ctx.fillRect(0,0,canvas.width,canvas.height);
ctx.drawImage(image, x, y);
x += 5 * xDirection;
y += 5 * yDirection;
if (x >= 450)
{
x = 450;
xDirection = -1;
}
else if (x <= 0)
{
x = 0;
xDirection = 1;
}
if (y >= 250)
{
y = 250;
yDirection = -1;
}
else if (y <= 0)
{
y = 0;
yDirection = 1;
}
}
});
});
现在,假设您点击Avatar
按钮,然后点击Beach Ball
,FPS就会加快速度。但是,我在两个函数的click
函数内重置了FPS变量。我还重置了x
和y
变量。
此外,我可以继续点击相同的按钮,速度也会大幅提升。
有人可以帮忙解释为什么会这样吗?
谢谢!
答案 0 :(得分:4)
MMM ..... const FPS; &lt; ---这是什么?
据我记忆,javascript中没有常量。无论如何,如果它是一个常量,为什么你试着稍后设置它的值几次?我认为这个语句失败了,第一次设置FPS时,你创建了一个全局变量,后来这个全局变量被所有函数共享。
此外,您不使用clearInterval,并且每次单击时都要调用一个新的setInterval,因此如果在“beachBallButton”中单击3次,则将运行3个setIntervals函数,每个函数都执行码。这很可能导致“加速”。
答案 1 :(得分:2)
这个工作示例=&gt; http://www.jsfiddle.net/steweb/sLpCA/
对亚历杭德罗所说的(这是正确的)只是一些'补充',JS中没有常量。所以你需要在开头'声明'var FPS
。
此外,你必须设置一个'intervalID'变量,这是setInterval在你调用时返回的变量。但是,在每次setInterval调用之前,你需要调用remove the 'active' interval actions(注意第一次没有什么要清除)
var myInterval;
/* ... */
clearInterval(myInterval)
myInterval = setInterval(draw,1000/FPS)