---------------------카메라
forEachVisiblePosition: function(callback, extra) {
var extra = extra || 0;
for(var y = this.gridY - extra; y < this.gridY + this.gridH + (extra * 2); ++y) {
for(var x = this.gridX - extra; x < this.gridX + this.gridW + (extra * 2); ++x) {
callback(x, y);
}
}
},
--------------------------게임
forEachVisibleTileIndex: function(callback, extra) {
var m = this.map;
this.camera.forEachVisiblePosition(function(x, y) {
if(!m.isOutOfBounds(x, y)) {
callback(m.gridPositionToTileIndex(x, y) -1);
}
}, extra);
},
forEachVisibleTile: function(callback, extra) {
var self = this;
var m = this.map;
if(m.isLoaded) {
this.forEachVisibleTileIndex(function(tileIndex) {
if(_.isArray(m.data[tileIndex])) {
_.each(m.data[tileIndex], function(id) {
callback(id -1, tileIndex);
});
} else {
if(!_.isNaN(m.data[tileIndex] -1)) {
callback(m.data[tileIndex] -1, tileIndex);
}
}
}, extra);
}
},
-------------------------------------렌더러
drawTerrain: function() {
var self = this;
var m = this.game.map;
var tilesetwidth = this.tileset.width / m.tilesize;
this.game.forEachVisibleTile((function(id, index) {
if(!m.isHighTile(id) && !m.isAnimatedTile(id)) {
self.drawTile(
self.background,
id, // 타일 아이디 0 ~
self.tileset,
tilesetwidth, // 타일 한 개당 넓이 / 맵 넓이 => 32 / 640 => 20
m.width, // 맵 넓이 => (640px)
index // 캔버스 타일 인덱스 1 ~
);
}
}),1);
},
--------------------------------------------애니메이션
initAnimatedTiles: function() {
var self = this;
var m = this.map;
this.animatedTiles = [];
this.forEachVisibleTile(function(id, index) {
if(m.isAnimatedTile(id)) {
var tile
= new AnimatedTile(id, m.getTileAnimationLength(id), m.getTileAnimationDelay(id), index);
var pos = m.tileIndexToGridPosition(tile.index);
tile.x = pos.x;
tile.y = pos.y;
self.animatedTiles.push(tile);
}
}, 1);
},
무려무려 6중 콜백
3개만넘어가면 머리가 지끈지끈함
성님 ecma 땔감스크립트6에 프로미스 모나드 있는데 고거한번 써보시는게 어떻읍니까!
이런문제 기깔나게 해결잘합니다