Javascript canvas

Javascript canvas

本文关键字:canvas Javascript      更新时间:2023-09-26

我一直在寻找一种方法来制作一个系统,其中摄像机/视口跟随玩家移动。正如你在小提琴上看到的,地图比画布和我想做的要大得多,这样玩家就会一直处于中心,除非靠近边缘。

玩家还没有移动。我想我需要将一些变量传递给 x 和 y 位置。

另外,如果您知道任何关于此的好教程,我将不胜感激。

请帮忙...

提前谢谢。

我的JS代码:

var canvas = document.getElementById("myCanvas");
        if (canvas.getContext) {
            var ctx = canvas.getContext("2d");
            var width = 800;
            var height = 700;
            var level = [];
            var level_1 = [
                "bbggggggbbgggggggggggggggggg",
                "gbggggggbbgggbbbbbbggggggggg",
                "gbggggggbbgggbgggggggggggggg",
                "gbbbbbbbbbbbbbgggggggggggggg",
                "ggggggggggbggggggggggggggggg",
                "ggggggggggbggggggggggggggggg",
        "ggggggggggbggggggggggggggggg",
                "ggggggggggbggggggggggggggggg",
        "ggggggggggbggggggggggggggggg",
                "ggggggggggbggggggggggggggggg",
        "ggggggggggbggggggggggggggggg",
                "ggggggggggbggggggggggggggggg"
            ];

            var Ground = function(x, y, label) {
                this.x = x;
                this.y = y;
                this.label = label;
        this.draw = function() {
            if(this.label == "g") {
            ctx.fillStyle = 'rgb(0,255,0)';
            ctx.fillRect(this.x, this.y, 15, 15);
          }
          if(this.label == "b") {
            ctx.fillStyle = 'rgb(0,0,255)';
            ctx.fillRect(this.x, this.y, 15, 15);
          }
        }
      }
      var Player = function(x, y) {
        this.x = x;
        this.y = y;
        this.size = 10;
        this.draw = function() {
            ctx.fillStyle = 'rgb(0,0,0)';
          ctx.fillRect(this.x, this.y, this.size, this.size);
        }
        this.move = function() {
         // code for player to move
        }
      }
            var makeLevel = function() {
                for(var i = 0; i < level_1.length; i++) {
                    for(var j = 0; j < level_1[i].length; j++) {
                        switch(level_1[i][j]) {
                            case "g" :
                                level.push(new Ground(j*15, i*15, "g"));
                                break;
              case "b" :
                                level.push(new Ground(j*15, i*15, "b"));
                                break;
                        }
                    }
                }
            }
            makeLevel();
      var player = new Player(5,20);
            function draw() {
                ctx.clearRect(0,0,800,700);
        for(var i=0; i<level.length; i++) {
                    level[i].draw();
                }
        player.draw();
                window.requestAnimationFrame(draw);
            }
            draw();
         }

小提琴

您的相机/视口是您的画布大小。您需要记住,每个对象将有两个不同的位置。

  1. 地图位置
  2. 画布位置(如果它们是否在视口中)(如果它们不在视口中,则计算这一点没有意义)

在玩家始终处于中心的2D游戏中,您的"地图"就是移动的东西。在渲染场景之前,您需要执行以下操作:

  1. 更新任何动态对象映射位置
  2. 更新玩家地图位置
  3. 使用画布的尺寸定义表面积(又名最小和最大边界...应该是画布的 4 个角)在地图上对应于玩家的位置
  4. 获取该外围应用区域中的所有对象(静态/动态)(视区边界内的对象)
  5. 将其地图位置转换为画布位置
  6. (使用玩家的地图位置以及玩家的画布位置和画布尺寸)。
  7. 获得对象的所有画布位置后,渲染场景。

如果您有任何疑问,请随时发表评论。我可能不清楚某些部分。