javascript - Javascript:第一次尝试状态引擎不工作
问题描述
我刚开始学习编码,我开始学习 javascript,主要是为了上课,但是我已经开始超越课堂,并尝试学习新事物。现在我正在尝试制作一个简单的游戏,它从一个级别到另一个级别,我的问题是我无法弄清楚如何准确地创建一个状态引擎,它可以跳转到下一个级别并从 HTML 画布中删除前一个级别.
使用下面的脚本,我试图通过制作一个闪烁的三框格式来测试使用状态引擎。当我想在 switch 语句中转到下一个案例时,问题就出现了,我调用的前一个案例的方法仍然存在。
这就是我所拥有的。
<!DOCTYPE html>
<html>
<body>
<body onload="init()">
<canvas id="myCanvas" width="1024" height="1024" style="border:1px solid #d3d3d3;">
</canvas>
<script>
var FPS = 60;
var counter = 0;
var currentState = 0;
var intervalTime = 300;
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
function init(){
ticker();
}
function ticker(){
setInterval(initGame, FPS)
}
function initGame(){
checkState();
counter++;
}
function drawBox(x,y){
ctx.fillStyle="#FF0000";
ctx.fillRect(x, y, 50, 50);
}
function checkState(){
switch(currentState){
case 0:
console.log("case 0");
drawBox(0,0);
if (counter === intervalTime){
counter = 0;
currentState = 1;
}
break;
case 1:
console.log("case 1");
drawBox(50,0);
if (counter === intervalTime){
counter = 0;
currentState = 2;
}
break;
case 2:
console.log("case 2");
drawBox(100,0);
if (counter === intervalTime){
counter = 0;
currentState = 0;
}
break;
}
}
</script>
</body>
</html>
我是新手,所以如果上述任何内容的格式不正确,或者我根本没有以正确的方式解决这个问题,我深表歉意。
解决方案
你正在寻找ctx.clearRect(x, y, width, height)
. 您可以像这样在代码中使用它:
function drawBox(x,y){
ctx.clearRect(0, 0, 300, 50);
ctx.fillStyle="#FF0000";
ctx.fillRect(x, y, 50, 50);
}
这将在每次重绘之前清除框所在的画布部分。对于更复杂的应用程序,您可能需要清除整个画布。
完整的工作代码如下:
<!DOCTYPE html>
<html>
<body>
<body onload="init()">
<canvas id="myCanvas" width="1024" height="1024" style="border:1px solid #d3d3d3;">
</canvas>
<script>
var FPS = 60;
var counter = 0;
var currentState = 0;
var intervalTime = 300;
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
function init(){
ticker();
}
function ticker(){
setInterval(initGame, FPS)
}
function initGame(){
checkState();
counter++;
}
function drawBox(x,y){
ctx.clearRect(0,0,300,50);
ctx.fillStyle="#FF0000";
ctx.fillRect(x, y, 50, 50);
}
function checkState(){
switch(currentState){
case 0:
console.log("case 0");
drawBox(0,0);
if (counter === intervalTime){
counter = 0;
currentState = 1;
}
break;
case 1:
console.log("case 1");
drawBox(50,0);
if (counter === intervalTime){
counter = 0;
currentState = 2;
}
break;
case 2:
console.log("case 2");
drawBox(100,0);
if (counter === intervalTime){
counter = 0;
currentState = 0;
}
break;
}
}
</script>
</body>
</html>
推荐阅读
- cucumber - 具有有效和无效输入的黄瓜表
- c# - “This”关键字的确切用途是什么
- javascript - 如何在 React 中执行函数?
- c - 无限循环,我不知道为什么
- r - 在 R 编程 Shiny App 中,inherits(x, "character") 不是 TRUE
- sql - SQL如何将行“收集”成一行
- mysql - 将 phpmyadmin 数据库中的 http 替换为 https
- r - 如何用R更清晰地绘制社交网络图?
- crystal-lang - 有没有办法使用“本机”Crystal 来确定它是否在交互式 shell 会话中运行?
- javascript - How does this snippet in Chapter 7 of Eloquent Javascript work?