zoukankan      html  css  js  c++  java
  • 【笔记】直播编程写游戏

    饮水思源:https://www.bilibili.com/video/av12138532

    原始版本:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style type="text/css">
                canvas {
                    border: 1px black solid;
                }
            </style>
        </head>
        <body>
            <canvas id="id-canvas" width="400" height="300"></canvas>
            <script>
                let canvas = document.querySelector("#id-canvas");
                let context = canvas.getContext('2d');
                
                let img = new Image();
                img.src = "img/xx.png";
                let x = 200, y = 250;
                img.onload = function() {
                    context.drawImage(img, x, y);
                };
                
                window.addEventListener("keydown", event => {
                    let k = event.key;
                    if (k == 'a') {
                        x -= 10;
                    } else if (k == 'd') {
                        x += 10;
                    }
                    context.clearRect(0, 0, canvas.width, canvas.height);
                    context.drawImage(img, x, y);
                });
            </script>
        </body>
    </html>
    View Code

    改善卡顿(提高按住1秒钟更新的次数):

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style type="text/css">
                canvas {
                    border: 1px black solid;
                }
            </style>
        </head>
        <body>
            <canvas id="id-canvas" width="400" height="300"></canvas>
            <script>        
                let __main = function() {
                    let canvas = document.querySelector("#id-canvas");
                    let context = canvas.getContext('2d');
                    
                    let img = new Image();
                    img.src = "img/xx.png";
                    let x = 200, y = 250, speed = 5;
                    img.onload = function() {
                        context.drawImage(img, x, y);
                    };
                    
                    let leftDown = false, rightDown = false;
                    
                    window.addEventListener("keydown", event => {
                        let k = event.key;
                        if (k == 'a') {
                            leftDown = true;
                        } else if (k == 'd') {
                            rightDown = true;
                        }
                    });
        
                    window.addEventListener("keyup", event => {
                        let k = event.key;
                        if (k == 'a') {
                            leftDown = false;
                        } else if (k == 'd') {
                            rightDown = false;
                        }
                    });
                    
                    setInterval(function() {
                        // update 
                        if (leftDown) {
                            x -= speed;                
                        } else if (rightDown) {
                            x += speed;                    
                        }        
                        
                        // draw
                        context.clearRect(0, 0, canvas.width, canvas.height);
                        context.drawImage(img, x, y);                
                    }, 1000/30); // 1/30秒更新一次也就是1秒钟更新30次                
                };            
                
                __main();
            </script>
        </body>
    </html>
    View Code

    重构版本1(封装img等):

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style type="text/css">
                canvas {
                    border: 1px black solid;
                }
            </style>
        </head>
        <body>
            <canvas id="id-canvas" width="400" height="300"></canvas>
            <script>    
                let imgFromPath = function(path) {
                    let img = new Image(path);
                    img.src = path;
                    return img;
                };
                
                let makePaddle = function() {
                    let o = {
                        img: imgFromPath('img/xx.png'),
                        x: 100,
                        y: 250,
                        speed: 5,
                    };
                    o.moveLeft = function() {
                        this.x -= this.speed;
                    };
                    o.moveRight = function() {
                        this.x += this.speed;
                    };
                    return o;
                };
                
                let makeGuaGame = function() {
                    let g = {
                    };
                    g.canvas = document.querySelector("#id-canvas");
                    g.context = g.canvas.getContext('2d');
                    
                    // g.update(); 报错。 
                    setInterval(function() {
                        // update 
                        g.update();
                        // clear
                        g.context.clearRect(0, 0, g.canvas.width, g.canvas.height);
                        // draw
                        g.draw();            
                    }, 1000/30); 
                    
                    return g;
                };
                
                
                let __main = function() {
                    let game = makeGuaGame();
                    
                    let paddle = makePaddle();
                    
                    let leftDown = false, rightDown = false;
                    
                    window.addEventListener("keydown", event => {
                        let k = event.key;
                        if (k == 'a') {
                            leftDown = true;
                        } else if (k == 'd') {
                            rightDown = true;
                        }
                    });
        
                    window.addEventListener("keyup", event => {
                        let k = event.key;
                        if (k == 'a') {
                            leftDown = false;
                        } else if (k == 'd') {
                            rightDown = false;
                        }
                    });
                    
                    game.update = function() {
                        if (leftDown) {
                            paddle.moveLeft();                
                        } else if (rightDown) {
                            paddle.moveRight();                    
                        }                        
                    };
                    
                    game.draw = function() {
                        this.context.drawImage(paddle.img, paddle.x, paddle.y);    
                    };            
                };            
                
                __main();
            </script>
        </body>
    </html>
    View Code

    重构版本2(封装事件监听):

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style type="text/css">
                canvas {
                    border: 1px black solid;
                }
            </style>
        </head>
        <body>
            <canvas id="id-canvas" width="400" height="300"></canvas>
            <script>    
                let imgFromPath = function(path) {
                    let img = new Image(path);
                    img.src = path;
                    return img;
                };
                
                let makePaddle = function() {
                    let o = {
                        img: imgFromPath('img/xx.png'),
                        x: 100,
                        y: 250,
                        speed: 5,
                    };
                    o.moveLeft = function() {
                        this.x -= this.speed;
                    };
                    o.moveRight = function() {
                        this.x += this.speed;
                    };
                    return o;
                };
                
                let makeGuaGame = function() {
                    let g = {
                        actions: {},
                        keydowns: {},
                    };
                    g.canvas = document.querySelector("#id-canvas");
                    g.context = g.canvas.getContext('2d');
                    
                    g.registerAction = function(key, callback) {
                        g.actions[key] = callback;
                    };
                    
                    window.addEventListener("keydown", event => {
                        g.keydowns[event.key] = true;
                    });
        
                    window.addEventListener("keyup", event => {
                        g.keydowns[event.key] = false;
                    });                
     
                    setInterval(function() {
                        // events
                        let keys = Object.keys(g.keydowns);
                        for (let i = 0; i != keys.length; ++i) {
                            let k = keys[i];
                            if (g.keydowns[k]) {
                                g.actions[k]();
                            }
                        }
                        // update 
                        g.update();
                        // clear
                        g.context.clearRect(0, 0, g.canvas.width, g.canvas.height);
                        // draw
                        g.draw();            
                    }, 1000/30); 
                    
                    return g;
                };
                
                
                let __main = function() {
                    let game = makeGuaGame();
                    
                    let paddle = makePaddle();
                    
                    game.registerAction("a", function() {
                        paddle.moveLeft();
                    });
                    
                    game.registerAction("d", function() {
                        paddle.moveRight();    
                    });
                    
                    game.update = function() {            
                    };
                    
                    game.draw = function() {
                        this.context.drawImage(paddle.img, paddle.x, paddle.y);    
                    };            
                };            
                
                __main();
            </script>
        </body>
    </html>
    View Code

    填加ball:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style type="text/css">
                canvas {
                    border: 1px black solid;
                }
            </style>
        </head>
        <body>
            <canvas id="id-canvas" width="400" height="300"></canvas>
            <script>    
                let makeGuaGame = function() {
                    let g = {
                        actions: {},
                        keydowns: {},
                    };
                    g.canvas = document.querySelector("#id-canvas");
                    g.context = g.canvas.getContext('2d');
                    
                    g.registerAction = function(key, callback) {
                        g.actions[key] = callback;
                    };
                    
                    g.drawImage = function(guaImage) {
                        this.context.drawImage(guaImage.img, guaImage.x, guaImage.y);    
                    }
                    
                    window.addEventListener("keydown", event => {
                        g.keydowns[event.key] = true;
                    });
        
                    window.addEventListener("keyup", event => {
                        g.keydowns[event.key] = false;
                    });                
     
                    setInterval(function() {
                        // events
                        let keys = Object.keys(g.keydowns);
                        for (let i = 0; i != keys.length; ++i) {
                            let k = keys[i];
                            if (g.keydowns[k]) {
                                g.actions[k]();
                            }
                        }
                        // update 
                        g.update();
                        // clear
                        g.context.clearRect(0, 0, g.canvas.width, g.canvas.height);
                        // draw
                        g.draw();            
                    }, 1000/30); 
                    
                    return g;
                };
    
                let imgFromPath = function(path) {
                    let img = new Image(path);
                    img.src = path;
                    return img;
                };
                
                let makePaddle = function() {
                    let img = imgFromPath('img/paddle.png');
                    let o = {
                        img: img,
                        x: 200,
                        y: 250,
                        speed: 5,
                    };
                    o.moveLeft = function() {
                        this.x -= this.speed;
                    };
                    o.moveRight = function() {
                        this.x += this.speed;
                    };
                    o.collide = function(guaImg) {
                        if (Math.abs(o.x - guaImg.x) < o.img.naturalWidth/2 + guaImg.img.naturalWidth/2 
                          && Math.abs(o.y - guaImg.y) < o.img.naturalHeight/2 + guaImg.img.naturalHeight/2 
                        ) {
                          return true;
                        }
                        return false;
                    };
                    
                    return o;
                };
                
                let makeBall = function() {
                    let img = imgFromPath('img/ball.png');
                    let o = {
                        img: img,
                        x: 200, 
                        y: 250,
                        speedX: 7,
                        speedY: -7,
                        fired: false,
                    };
                    o.fire = function() {
                        this.fired = true;
                    }
                    
                    o.move = function() {
                        if (this.fired) {    
                            if (this.x > 400 || this.x < 0) {
                                this.speedX *= -1;
                            } else if (this.y > 300 || this.y < 0) {
                                this.speedY *= -1;
                            }    
                            this.x += this.speedX;
                            this.y += this.speedY;                        
                        }
                    };
                    
                    return o;                
                };
                        
                let __main = function() {
                    let game = makeGuaGame();
                    
                    let paddle = makePaddle();
                    
                    let ball = makeBall();
    
                    game.registerAction("a", function() {
                        paddle.moveLeft();
                    });
                    
                    game.registerAction("d", function() {
                        paddle.moveRight();    
                    });
    
                    game.registerAction("f", function() {
                        ball.fire();    
                    });
                    
                    game.update = function() {    
                        ball.move();
                        if (paddle.collide(ball)) {
                            ball.speedY *= -1;
                        }
                    };
                    
                    game.draw = function() {
                        game.drawImage(paddle);    
                        game.drawImage(ball);            
                    };            
                };            
                
                __main();
            </script>
        </body>
    </html>
  • 相关阅读:
    深入Android 【一】 —— 序及开篇
    Android中ContentProvider和ContentResolver使用入门
    深入Android 【六】 —— 界面构造
    The service cannot be activated because it does not support ASP.NET compatibility. ASP.NET compatibility is enabled for this application. Turn off ASP.NET compatibility mode in the web.config or add the AspNetCompatibilityRequirements attribute to the ser
    Dynamic Business代码片段总结
    对文件的BuildAction以content,resource两种方式的读取
    paraview 3.12.0 windows下编译成功 小记
    百度网盘PanDownload使用Aria2满速下载
    netdata的安装与使用
    用PS给证件照排版教程
  • 原文地址:https://www.cnblogs.com/xkxf/p/9803326.html
Copyright © 2011-2022 走看看