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