Crafty.scene("FrontierOutpost",function(){
console.time("Initial Scene");
console.log("Tiled Level Editor JSON file",frontier_outpost);
//Get Object Tiles
var objects = null;
//Get Collision Tiles
var collisions = null;
var backgrounds = null;
//Get Map Metadata;
var map = frontier_outpost;
for(var i = 0,il = frontier_outpost.layers.length;i<il;i++){
var layer = frontier_outpost.layers[i];
if(layer.name == "background"){
backgrounds = layer.data;
}
if(layer.name == "object"){
objects = layer.data;
}
if(layer.name == "collision"){
collisions = layer.data;
}
}
//Convert Data to Integers
var tw = parseInt(map.tilewidth);
var th = parseInt(map.tileheight);
var mw = parseInt(map.width);
var mh = parseInt(map.height);
var startX = 40;
var startY = 12;
var iso = Crafty.diamondIso.init(tw,th,mw,mh);
var player = Crafty.e("2D,Canvas,Player");
iso.place(player,startX,startY,2);
iso.centerAt(startX,startY);
//Setup background color
// Crafty.background('url("img/frontier_outpost.png") '+(Crafty.viewport.x+32)+'px '+(Crafty.viewport.y-64)+'px #000');
Crafty.background('#000');
var counter =$('#counter');
counter.html("Amount of Tiles: 0 <br/> FPS:0");
player.bind("Moved",function(from){
var pos = iso.px2pos(this.x+this.w/2,this.y+this.h);
pos.x = ~~pos.x;
pos.y = ~~pos.y;
//calculate index of tile
var i = pos.y * mh + pos.x;
//check if the tile is solid
if(collisions[i] > 0) {
this.x = from.x;
this.y = from.y;
}
// Crafty.background('url("img/frontier_outpost.png") '+(Crafty.viewport.x+32)+'px '+(Crafty.viewport.y-64)+'px #000');
this.z = (this.y+this.h) * 2;
//If player coordiantes didnt changed return
if(this.position.x == pos.x || this.position.y == pos.y) return;
//update player coordiantes
this.position.x = pos.x;
this.position.y = pos.y;
//update map
console.time("Update objects");
renderObjects();
console.timeEnd("Update objects");
});
var tiles=[];
var renderObjects = function(){
var area = iso.area(1),createdTiles = 0
console.time("Get and draw new objects");
for(var a=0,al = area.length;a<al;a++){
var loc = area[a],
x = loc[0],
y= loc[1],
i = y * mh + x,
object = objects[i], //get current object
background = backgrounds[i],
tile = null,//initialize tile
layer = 1,//initialize layer
z=0,//initialize Z
tilename=''; //initialize individual name for tiles
if(background > 0){
//set layer
layer = 1;
z = (y+1)*layer;
tilename = 'Y'+y+'X'+x+'Z'+z;
//Find Tile
if(tiles[tilename] === undefined){
tile = Crafty.e("2D","Canvas","Tile",background);//Mark the components as Tiles with Tile component
iso.place(tile,x,y,layer);
createdTiles++;
tiles[tilename] = tile;
}
//clear tile
tile = null;
}
//place object tiles
if(object > 0){
//set layer
layer = 2;
z = (y+1)*layer;
tilename = 'Y'+y+'X'+x+'Z'+z;
//Find Tile
if(tiles[tilename] === undefined){
tile = Crafty.e("2D","Canvas","Tile",object);//Mark the components as Tiles with Tile component
iso.place(tile,x,y,layer);
createdTiles++;
tiles[tilename] = tile;
}
//clear tile
tile = null;
}
}
console.log("Added Tiles",createdTiles);
console.timeEnd("Get and draw new objects");
//Clearing up the objects
if(Crafty("Tile").length > 200){
return;
console.time("Delete objects");
var vp = Crafty.viewport.rect(); //get Rect of viewport
var removedTiles = 0;
for(var i in tiles){
tile = tiles[i];
if (!tile.intersect(vp._x,vp._y,vp._w,vp._h)){
tile.destroy();
delete tiles[i];
removedTiles++;
}
}
console.log("Removed Tiles",removedTiles);
console.timeEnd("Delete objects");
}
};
console.time("Initial draw objects");
renderObjects();
console.timeEnd("Initial draw objects");
console.timeEnd("Initial Scene");
Crafty.e("FPS").attr({
maxValues:5
}).bind("MessureFPS",function(fps){
counter.html( "Amount of Tiles: "+Crafty("Tile").length+"<br/>FPS: "+fps.value);
});
});
|