Javascript 如何在Create.js中集中缩放游戏世界?

Javascript 如何在Create.js中集中缩放游戏世界?,javascript,game-development,createjs,easeljs,Javascript,Game Development,Createjs,Easeljs,我正在用JavaScript创建一个Create.js 2D游戏引擎,需要一种方法来在缩放主容器时使玩家居中(这将是一个放置在屏幕中央的精灵)。它应该是每次缩放世界时容器平移的偏移量,但我不知道如何进行计算,所以我放了一个??以及我需要代码帮助的注释。如何计算缩放容器时将容器平移到中心的量?代码如下 var stage; var canvas; var map; var move = []; var viewDist = 2; var chunkSize = 16; var mapSize =

我正在用JavaScript创建一个Create.js 2D游戏引擎,需要一种方法来在缩放主容器时使玩家居中(这将是一个放置在屏幕中央的精灵)。它应该是每次缩放世界时容器平移的偏移量,但我不知道如何进行计算,所以我放了一个??以及我需要代码帮助的注释。如何计算缩放容器时将容器平移到中心的量?代码如下

var stage;
var canvas;
var map;
var move = [];
var viewDist = 2;
var chunkSize = 16;
var mapSize = 32;
var view_chunks = [];
var chunks = [];
var posX;
var posY;
var tileSize = 16;
var chunksContainer;
var playerPosX = 0;
var playerPosY = 0;
var chunkPosX = 0;
var chunkPosY = 0;
var scale = 3;
var SPRITESHEET;
var tiles = [];
var speed = 0.2;
var moveForward = false;
var moveBackward = false;
var chunksContainer = new createjs.Container();
var halfW = window.innerWidth/2
var halfH = window.innerHeight/2
var scaleFactor = 0.1;
this.document.onkeydown = keydown;
function keydown(event) {
        /** you can access keyCode to determine which key was pressed**/
        var keyCode =  event.keyCode;
        if(keyCode == 87){
                move[0] = true;
        }
        if(keyCode == 83){
                move[1] = true;
        }
        if(keyCode == 65){
                move[2] = true;
        }
        if(keyCode == 68){
                move[3] = true;
        }
        if(keyCode == 187){
            if(scale < 4){
                 scale = scale + 0.1;
            }

        }
        if(keyCode == 189){
            if(scale > ((viewDist*2+5)*chunkSize*tileSize)/window.innerWidth){
                scale = scale - 0.1;
                //chunksContainer.x = chunksContainer.x ??
                //chunksContainer.y = chunksContainer.y ??

            }
            console.log(scale)
        }

        //console.log(keyCode)
}
this.document.onkeyup = keyup;
function keyup(event) {
        /** you can access keyCode to determine which key was pressed**/
        var keyCode =  event.keyCode;
        if(keyCode == 87){
                move[0] = false;
        }
        if(keyCode == 83){
                move[1] = false;
        }
        if(keyCode == 65){
                move[2] = false;
        }
        if(keyCode == 68){
                move[3] = false;
        }

        console.log(event.keyCode)
}
function generateMap() {
    map = [];
    for(var x = 0; x < mapSize*chunkSize; x++){
            map[x] = []
            for(var y = 0; y < mapSize*chunkSize; y++){
                    map[x][y] = 5;
                    if(Math.floor(Math.random() * 11) == 1){
                            map[x][y] = 1;
                    }
            }
    }
}
function getTile(col,row,x,y){
col = col%mapSize;
row = row%mapSize;
if(col < 0){
    col = mapSize + col;
}
if(row < 0){
    row = mapSize + row;
}
col = Math.abs(col);
row = Math.abs(row);
return map[col*chunkSize + x][row*chunkSize+y]
}
function init(){
    canvas = document.getElementById("canvas");
    canvas.width = document.body.clientWidth; //document.width is obsolete
    canvas.height = document.body.clientHeight; //document.height is obsolete

    // create a new stage and point it at our canvas:
    stage = new createjs.Stage("canvas");

    // load the spritesheet image:
    var image = new Image();
    image.onload = handleLoad;
    image.src = "../assets/spritesheet/roguelikeSheet_transparent.png";
}
var tiles;
function generateChunks(x,y){
    chunksContainer = new createjs.Container();
    chunksContainer.scale = scale;
    chunksContainer.x = 0
    chunksContainer.y = 0
    chunksContainer.regX = (viewDist*2)*chunkSize*tileSize/2
    chunksContainer.regY = (viewDist*2)*chunkSize*tileSize/2
    for(col = 0; col < viewDist*2; col++){
        tiles[col] = []
        for(row = 0; row < viewDist*2; row++){
            tiles[col][row] = []
            for (var x=0; x<chunkSize; x++) {
                    tiles[col][row][x] = []
                    for (var y=0; y<chunkSize; y++) {
                            var idx = getTile(chunkPosX + col,chunkPosY + row,x,y);
                            tiles[col][row][x][y] = new createjs.Sprite(SPRITESHEET)
                                            .set({x: 16*(col * 16 + x), y:16*(row * 16 + y)});
                            tiles[col][row][x][y].gotoAndStop(idx);
                            chunksContainer.addChild(tiles[col][row][x][y]);
                    }
            }
        }
    }
    stage.addChild(chunksContainer);
}
function updateChunks(){
    for(col = 0; col < viewDist*2; col++){
        for(row = 0; row < viewDist*2; row++){
            for (var x=0; x<chunkSize; x++) {
                    for (var y=0; y<chunkSize; y++) {
                            var idx = getTile(chunkPosX + col,chunkPosY + row,x,y);
                            tiles[col][row][x][y].gotoAndStop(idx);
                    }
            }
        }
    }
}
function handleLoad(evt) {
        // define the spritesheet:
        SPRITESHEET = new createjs.SpriteSheet({
                        images: [evt.target],
                        frames: {width:16, height:16, regX:16, regY:16, spacing:1, margin:0, count:1680}
         });

         generateMap();
        generateChunks();
        stage.update();
        // update the stage to draw to screen:
        createjs.Ticker.addEventListener("tick", handleTick);
}
chunkPlayerPosY = 0;
chunkPlayerPosX = 0;
function handleTick(event) {
        if(move[0]){
                chunksContainer.y = chunksContainer.y + speed * createjs.Ticker.getMeasuredTickTime() * scale;
        }
        if(move[1]){
                chunksContainer.y = chunksContainer.y - speed * createjs.Ticker.getMeasuredTickTime() * scale;
        }
        if(move[2]){
                chunksContainer.x = chunksContainer.x + speed * createjs.Ticker.getMeasuredTickTime() * scale;
        }
        if(move[3]){
                chunksContainer.x = chunksContainer.x - speed * createjs.Ticker.getMeasuredTickTime() * scale;

        }
        if(chunksContainer.y > halfH + chunkSize*tileSize * scale){
            chunksContainer.y = halfH;
            chunkPosY = chunkPosY - 1
            console.log(chunkPosY)
            updateChunks();
        }
        if(chunksContainer.y < halfH){
            chunksContainer.y = halfH + chunkSize*tileSize * scale;
            chunkPosY = chunkPosY + 1
            console.log(chunkPosY)
            updateChunks();
        }
        if(chunksContainer.x > halfW + chunkSize*tileSize * scale){
            chunksContainer.x =  halfW;
            chunkPosX = chunkPosX - 1
            console.log(chunkPosX)
            updateChunks();
        }
        if(chunksContainer.x < halfW){
            chunksContainer.x = halfW + chunkSize * tileSize * scale;
            chunkPosX = chunkPosX + 1
            console.log(chunkPosX)
            updateChunks();
        }
        chunksContainer.scale = scale;
        stage.update();
}

var阶段;
var帆布;
var映射;
var移动=[];
var viewDist=2;
var-chunkSize=16;
var-mapSize=32;
var view_chunks=[];
var chunks=[];
var-posX;
var posY;
var tileSize=16;
var chunksContainer;
var-playerPosX=0;
var-playerPosY=0;
var-chunkPosX=0;
var-chunkPosY=0;
var量表=3;
var SPRITESHEET;
var-tiles=[];
无功转速=0.2;
var向前移动=错误;
var-moveBackward=false;
var chunkscocontainer=new createjs.Container();
var halfW=window.innerWidth/2
var halfH=window.innerHeight/2
var scaleFactor=0.1;
this.document.onkeydown=keydown;
功能键控(事件){
/**您可以访问keyCode以确定按下了哪个键**/
var keyCode=event.keyCode;
如果(键代码==87){
移动[0]=真;
}
如果(键代码==83){
move[1]=真;
}
如果(键代码==65){
move[2]=真;
}
如果(键代码==68){
move[3]=真;
}
如果(键码==187){
如果(刻度<4){
比例=比例+0.1;
}
}
如果(键代码==189){
如果(比例>((viewDist*2+5)*chunkSize*tileSize)/window.innerWidth){
比例=比例-0.1;
//chunksContainer.x=chunksContainer.x??
//chunksContainer.y=chunksContainer.y??
}
控制台日志(比例)
}
//console.log(keyCode)
}
this.document.onkeyup=keyup;
功能键控(事件){
/**您可以访问keyCode以确定按下了哪个键**/
var keyCode=event.keyCode;
如果(键代码==87){
移动[0]=false;
}
如果(键代码==83){
移动[1]=假;
}
如果(键代码==65){
移动[2]=假;
}
如果(键代码==68){
移动[3]=假;
}
console.log(event.keyCode)
}
函数生成器映射(){
map=[];
对于(var x=0;x