菜鸟canvas自学之路

178 阅读3分钟

学习内容

canvas开发猜数字游戏

主要内容

首先呢打开编辑器(我习惯用vs code,如果有好用的大佬们可以给推荐推荐)

HTML

新建个html文件,里面写上基础的html页面,body里放一个canvas标签(大佬们我就不多BB了,直接上代码)

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>猜字母</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        html,body{
            width: 100%;
            height: 100%;
            display: block;
        }

    </style>
    <script src="./js/canvasGuess.js" defer></script>
</head>
<body>
        <canvas id="canvasOne" width="800" height="800">您的浏览器不支持Canvas请换一个吧</canvas>
</body>
</html>

JS

通过js去判断是否猜中选中的字母,已经猜的次数,猜过的字母以及在画布上显示出来对应提示的文字

主要用到的技术

通过getElementById获取到canvas的dom

var theCanvas = document.getElementById("canvasOne")

通过dom.getContext('2d')来创建一个可操作的2D环境,(提示:在未来,如果 canvas 标签扩展到支持 3D 绘图,getContext() 方法可能允许传递一个 "3d" 字符串参数。)

var context = theCanvas.getContext('2d')

之后通过context的各种属性去在页面上去干各种骚操作就可以了,用到的属性如下所示

1.fillStyle设置或返回用于填充绘画的颜色、渐变或模式。(这边只用到设置颜色)
2.fillRect(x,y,width,height)绘制一块带着颜色的矩形(默认是黑色背景,fillStyle得在他前面先设置颜色,先选色后绘制)
3.font设置字体属性
4.fillText('文字',x,y) (如果字体想添加颜色同矩形)

顾某:思路呢就是通过监听windows的键盘事件去获取按下去的键,之后判断是否是为选中的那一个,选中就game over,没选中就记录按下的键是哪个,并且次数加1,比较按下的和选中的字母在数组的下标去判断是大了还是小了

js代码

window.addEventListener('load',eventWindowLoaded,false)

function eventWindowLoaded(){
    canvasApp()
}
// canvas主体
function canvasApp(){
    if(!canvasSupport){
        return ;
    }
    console.log("调用canvas")

    var theCanvas = document.getElementById("canvasOne")
    // 创建环境
    var context = theCanvas.getContext('2d')

    // 游戏变量
    var guesses = 0; //猜的次数
    var message = "请猜a-z之间的字母"; //提示
    //字母
    var letters = [
          "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o",
          "p","q","r","s","t","u","v","w","x","y","z"
          ];
    var today = new Date(); //时间没有任何实际性作用
    var letterToGuess = ""; //当前秘密字母
    var higherOrLower = ""; //提示文本
    var lettersGuessed; //猜过的字母合计
    var gameOver = false; //游戏是否结束
    var letterIndex = 0;
    initGame()
    // 初始化游戏
    function initGame(){
        console.log('init')
        letterIndex = Math.floor(Math.random()*letters.length)
        letterToGuess = letters[letterIndex]
        console.log(letterToGuess)
        guesses = 0
        lettersGuessed = []
        gameOver = false
        window.addEventListener("keydown",eventKeyPress,true)
        drawScreen()
    }

    function drawScreen(){
        // 填充色
        context.fillStyle = "#ffffaa";
        // 绘制区域
     context.fillRect(0, 0, 500, 500);

        context.textBaseline = "top";

        //日期
     context.fillStyle = "#000000";
     context.font = "10px Sans-Serif";
     context.fillText(today, 10 ,20);
     //消息
     context.fillStyle = "#FF0000";
     context.font = "14px Sans-Serif"; 
     context.fillText(message,10,50);
     //猜测的次数
     context.fillStyle = "#109910";
     context.font = "16px Sans-Serif";
     context.fillText('次数: ' + guesses, 215, 50);
     //显示Higher或Lower
     context.fillStyle = "#000000";
     context.font = "16px Sans-Serif";
     context.fillText("大或小: " + higherOrLower, 10,85);
     //猜过的字母
     context.fillStyle = "#FF0000";
     context.font = "16px Sans-Serif";
     context.fillText("猜过的字母: " + lettersGuessed.toString(), 10, 110);
     if (gameOver){
        context.fillStyle = "#FF0000";
       context.font = "24px Sans-Serif";
       context.fillText("恭喜您猜对了就是"+letterToGuess+",撒花", 10, 180);
        }
    }
    // 键盘事件
    function eventKeyPress(e){
        if(!gameOver){
            var letterPressed = String.fromCharCode(e.keyCode)
            letterPressed = letterPressed.toLowerCase()
            guesses+=1
            lettersGuessed.push(letterPressed)

            if(letterPressed == letterToGuess){
                gameOver = true
            } else {
                var guessIndex = letters.indexOf(letterPressed)
                if(guessIndex < 0){
                    higherOrLower = "请输入字母";
                } else if(guessIndex > letterIndex){
                    higherOrLower = '大了'
                } else {
                    higherOrLower = '小了'
                }
            }
            drawScreen()
        }
    }
}
// 判断浏览器是否支持canvas
function canvasSupport (){
  return !!document.createElement('canvas').getContext;
}

遇上的问题

调整fillRect的width和height这个渲染出来的矩形大小就是不太对

原因:因为canvas是具有一个默认的宽高比例(即300:150),导致里面设置的宽高问题

解决:canvas标签设置一下width和height属性就ok了

效果展示

怕.png

顾言顾语

第一次写文章,如有不足之处望各位海涵,多批评指正。