RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 863678
Accepted
Natalya
Natalya
Asked:2020-08-03 01:09:27 +0000 UTC2020-08-03 01:09:27 +0000 UTC 2020-08-03 01:09:27 +0000 UTC

如果全局声明数组的空元素,该函数不起作用,为什么?

  • 772
forest[0] = {
    x : cvs.width/2-width_path_near-tree_size/2,
    y : cvs.height/2-tree_size+10,
    size :  tree_size,  
}

function draw() { 

    for (var i=0; i<forest.length; i++){
 ctx.drawImage(masTree[randTree], forest[i].x, forest[i].y, forest[i].size, forest[i].size); 

        if(forest[i].y == 3*cvs.height/4){
            forest.push({
                y : cvs.height/2-tree_size+10,
                x : cvs.width/2-width_path_near-tree_size/2,
                size :  tree_size   
            });
        }

        forest[i].y += 0.5;
        forest[i].x -= 0.4;
        forest[i].size +=  0.4;
    }   

     requestAnimationFrame(draw);
}

http://jsfiddle.net/Nata_Hamster/et7f9p6w/

如果在这种情况下将 forest[0] 声明(仅它,或 forest[0] 和 var forest )放置在 draw() 内,使其成为本地,则 draw 不起作用(x,y,大小不变) http: //jsfiddle.net /Nata_Hamster/8g697z02/ JS背后的逻辑是什么?

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Grundy
    2020-08-03T01:22:55Z2020-08-03T01:22:55Z

    移入内部时,每次调用函数时都会初始化第一个元素的值draw。

    这意味着在循环结束时,这个元素的值会发生变化,但是下次调用该函数时,它们会被设置为初始值。

    因此,渲染只发生在一个点上。

    在渲染第一次赋值的情况下,它不会在每次 start 时重置draw,这意味着新的渲染发生在新的坐标处。

    • 3
  2. qwabra
    2020-08-03T02:54:05Z2020-08-03T02:54:05Z

    1)你的图片每隔一段时间加载一次

    2)这件必须删除

    // forest.push({
    //     y : cvs.height/2-tree_size+10,
    //     x : cvs.width/2-width_path_near-tree_size/2,
    //     size :  tree_size   
    // });
    

    3)这是一个工作示例

    document.body.innerHTML = `<canvas id="canvas" width="500" height="300"></canvas>`;
    var cvs = document.getElementById("canvas");
    var ctx = cvs.getContext("2d");
    var width_path_near = 80, width_path_far = 30;
    // --
    var tree1 = new Image();
    tree1.src = getIMG();
    var masTree = [tree1];
    var randTree = 0;
    // --
    // var randTree=Math.floor(Math.random()*masTree.length); 
    // var tree1 = new Image(); 
    // var tree2 = new Image(); 
    // var tree3 = new Image(); 
    // var tree4 = new Image(); 
    // tree1.src = "https://png.pngtree.com/element_origin_min_pic/00/02/61/6156839a2a633b7.jpg";
    // tree2.src = "http://s02.yapfiles.ru/files/457732/derevo_1.png";
    // tree3.src = "http://www.grafamania.net/uploads/posts/2014-06/1401644723_1-9.jpg";
    // tree4.src = "http://img11.txapela.ru/e/c/c/4/f/52e052f118c7b8ff9317385f581.jpg";
    // var masTree=[tree1, tree2, tree3, tree4];
    // var randTree=Math.floor(Math.random()*masTree.length);   
    var tree_size = 100;
    var forest = [];
    let base = () => ({
        x: cvs.width / 2 - width_path_near - tree_size / 2,
        y: cvs.height / 2 - tree_size + 10,
        size: tree_size,
    });
    forest[0] = base();
    let max = 3 * cvs.height / 4
    function draw() {
        ctx.fillStyle = "rgb(84,209,216)";
        ctx.fillRect(0, 0, 1000, 600);
        for (var i = 0; i < forest.length; i++) {
            // console.log(i)
            forest[i].y += 0.5;
            forest[i].x -= 0.4;
            forest[i].size += 0.4;
            if (forest[0].y >= max) {
                forest[1] = forest[0];
                forest[0] = base();
                // этот кусок обязательно убрать
                // forest.push({
                //     y : cvs.height/2-tree_size+10,
                //     x : cvs.width/2-width_path_near-tree_size/2,
                //     size :  tree_size   
                // });
            }
         		ctx.drawImage(masTree[randTree], forest[i].x, forest[i].y, forest[i].size, forest[i].size);
    
        }
        requestAnimationFrame(draw);
    }
    masTree[randTree].onload = draw;
    function getIMG() {
        return `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAACxMAAAsTAQCanBgAAABaUExURTSTAC+FADCIAC6BADSUADSUADSUADSUADORADORACx9ADKNAC2AADWVAEG5ADWYAC2AADedAC6CAC6DAEG5ADWXAD6vAD+yADKOADeeAEG5ACt4AEC3AEC1AMQvmTgAAAAddFJOUwKDk/4oHd8QNFvCadg/cqej+k7w1XlJir3Eq/vvM3f8hwAAAwZJREFUSMftVduSozoMlB3b8v0G5mb4/988AmY2u7UzlcnzHlelMNAttdpCAfhHlsjmTUbtPb8BR8rRrbef9zq7L1CBhWcCr4F7tESpgu751wlZ7wQEQQnQd4u2gmeguz1f8S8prmc7CBwygum5VyeCR7S9V/QOBvan8MpYBdkdZGZ656cmz0mqJAvcwLWlq7ihQl5XUjp0K3kniLW5S2aBZ5CVJHnglnDWgDxN8P22QXRS0By91GAzeEdhWQ2+B3AXGaSo1kPo3j4+jsp0AlPZQUDOpA6qxEqZSS1HJm5vBkFunEo+DLaeIwhvWbBoBCPnvNWdIqLBK6bLPjAIj99cEKaipMDeSPLOovYoOjHrZa5lsFiE4J8MZMPgs/CLWCzg4B9GZCqNwg/6Mgj0QGbU6waDo7j2sZyK20MCF/URPPlFZWAe7mpRc0PuDf6ELY/HMDD2UMywillp8o5cWq62Uf4KC5KODbLnrHg8AycxpRCyWk6drpGYBTjt9XKdOAqTPT0V9OO3xam4q3EJ0zIL546RTchUCsLw7JVNd64pqfsckavl3OmlqFUVVe9mX1bOV7UsKTVTw9Wrzn2eCUg6QQhl0VeZ5eKvBGZTnRdFq5RBqZXrXwZTwAa4MjBXAlc0yDW1FiQvKpkgpNBTdc2IT4Ypa6BeTrRT6awkUSc7l5or63Xyf3+LRUnpZiNkA1H4+WTV0ZTUivvmI59LobKd1iRGzoUKlEnzQ8U1fDsXAqUIG7YoqMxC5chGYdr3jHu1FeYEMq7j2bvEGGf3YgS1Hcf0MYsA1nKkhi8o5FqZfpl+lINPrwadVMf25BMl4svhGLcnZj6OEt8bxXM5jvYWAynLbzJ/smLby7HjO4w5rsdbyuQ4bZEou/gxIx5huzjjDzlT3I55OuZ5J870o//GPY7HPs3HRlSy7TUpjMd0hpdx3+e4jbSdJ/k9PMZtH6d4MqjNaL8ZkjmO47pFZyYh/7ZdxDih2C/G5QPB50ng+eFP+ivGNURnQj2F4BTnOQr4f/2x/gNuPzAKx8eHUAAAAABJRU5ErkJggg==`;
    }
    //# sourceMappingURL=index.js.map

    四)requestAnimationFrame

    像每秒调用一次,每次调用函数时,坐标、大小和框架都会改变。在下面的示例中可以观察到 - 有绘图,没有运动。

    document.body.innerHTML = `<canvas id="canvas" width="500" height="300"></canvas>`;
    var cvs = document.getElementById("canvas");
    var ctx = cvs.getContext("2d");
    var width_path_near = 80, width_path_far = 30;
    // --
    var tree1 = new Image();
    tree1.src = getIMG();
    var masTree = [tree1];
    var randTree = 0;
      
    var tree_size = 100;
    var forest = [];
    let base = () => ({
        x: cvs.width / 2 - width_path_near - tree_size / 2,
        y: cvs.height / 2 - tree_size + 10,
        size: tree_size,
    });
    
    function draw() {
        forest[0] = base();
    
        ctx.fillStyle = "rgb(84,209,216)";
        ctx.fillRect(0, 0, 1000, 600);
        for (var i = 0; i < forest.length; i++) {
            // console.log(i)
            ctx.drawImage(masTree[randTree], forest[i].x, forest[i].y, forest[i].size, forest[i].size);
            forest[i].y += 0.5;
            forest[i].x -= 0.4;
            forest[i].size += 0.4;
            if (forest[0].y == 3 * cvs.height / 4) {
                forest[1] = forest[0];
                forest[0] = base();
                // этот кусок обязательно убрать
                // forest.push({
                //     y : cvs.height/2-tree_size+10,
                //     x : cvs.width/2-width_path_near-tree_size/2,
                //     size :  tree_size   
                // });
            }
        }
        requestAnimationFrame(draw);
    }
    masTree[randTree].onload = draw;
    function getIMG() {
        return `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAACxMAAAsTAQCanBgAAABaUExURTSTAC+FADCIAC6BADSUADSUADSUADSUADORADORACx9ADKNAC2AADWVAEG5ADWYAC2AADedAC6CAC6DAEG5ADWXAD6vAD+yADKOADeeAEG5ACt4AEC3AEC1AMQvmTgAAAAddFJOUwKDk/4oHd8QNFvCadg/cqej+k7w1XlJir3Eq/vvM3f8hwAAAwZJREFUSMftVduSozoMlB3b8v0G5mb4/988AmY2u7UzlcnzHlelMNAttdpCAfhHlsjmTUbtPb8BR8rRrbef9zq7L1CBhWcCr4F7tESpgu751wlZ7wQEQQnQd4u2gmeguz1f8S8prmc7CBwygum5VyeCR7S9V/QOBvan8MpYBdkdZGZ656cmz0mqJAvcwLWlq7ihQl5XUjp0K3kniLW5S2aBZ5CVJHnglnDWgDxN8P22QXRS0By91GAzeEdhWQ2+B3AXGaSo1kPo3j4+jsp0AlPZQUDOpA6qxEqZSS1HJm5vBkFunEo+DLaeIwhvWbBoBCPnvNWdIqLBK6bLPjAIj99cEKaipMDeSPLOovYoOjHrZa5lsFiE4J8MZMPgs/CLWCzg4B9GZCqNwg/6Mgj0QGbU6waDo7j2sZyK20MCF/URPPlFZWAe7mpRc0PuDf6ELY/HMDD2UMywillp8o5cWq62Uf4KC5KODbLnrHg8AycxpRCyWk6drpGYBTjt9XKdOAqTPT0V9OO3xam4q3EJ0zIL546RTchUCsLw7JVNd64pqfsckavl3OmlqFUVVe9mX1bOV7UsKTVTw9Wrzn2eCUg6QQhl0VeZ5eKvBGZTnRdFq5RBqZXrXwZTwAa4MjBXAlc0yDW1FiQvKpkgpNBTdc2IT4Ypa6BeTrRT6awkUSc7l5or63Xyf3+LRUnpZiNkA1H4+WTV0ZTUivvmI59LobKd1iRGzoUKlEnzQ8U1fDsXAqUIG7YoqMxC5chGYdr3jHu1FeYEMq7j2bvEGGf3YgS1Hcf0MYsA1nKkhi8o5FqZfpl+lINPrwadVMf25BMl4svhGLcnZj6OEt8bxXM5jvYWAynLbzJ/smLby7HjO4w5rsdbyuQ4bZEou/gxIx5huzjjDzlT3I55OuZ5J870o//GPY7HPs3HRlSy7TUpjMd0hpdx3+e4jbSdJ/k9PMZtH6d4MqjNaL8ZkjmO47pFZyYh/7ZdxDih2C/G5QPB50ng+eFP+ivGNURnQj2F4BTnOQr4f/2x/gNuPzAKx8eHUAAAAABJRU5ErkJggg==`;
    }
    //# sourceMappingURL=index.js.map

    5)将重复数据包装在一个函数中

    let base = () => ({
        x: cvs.width / 2 - width_path_near - tree_size / 2,
        y: cvs.height / 2 - tree_size + 10,
        size: tree_size,
    });
    

    6)如果可能,取出计算值

    例如3 * cvs.height / 4,在函数外计数一次就足够了

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5