Add server-side generation of faces : fixes face accessory issues, IE8
This commit is contained in:
parent
074952265f
commit
da32c2f0bd
5 changed files with 166 additions and 64 deletions
|
|
@ -41,7 +41,6 @@ DynMap.prototype = {
|
|||
inittime: new Date().getTime(),
|
||||
followingPlayer: '',
|
||||
missedupdates: 0,
|
||||
canvassupport: !!document.createElement('canvas').getContext,
|
||||
formatUrl: function(name, options) {
|
||||
var url = this.options.url[name];
|
||||
$.each(options, function(n,v) {
|
||||
|
|
@ -133,9 +132,6 @@ DynMap.prototype = {
|
|||
me.maptype.updateTileSize(me.map.zoom);
|
||||
$(me).trigger('zoomchanged');
|
||||
};
|
||||
|
||||
if(me.canvassupport == false)
|
||||
me.options.showplayerfacesinmenu = false;
|
||||
|
||||
/*google.maps.event.addListener(map, 'dragstart', function(mEvent) {
|
||||
me.followPlayer(null);
|
||||
|
|
|
|||
|
|
@ -1,61 +1,19 @@
|
|||
var cloneCanvas = function(self) {
|
||||
var c = document.createElement('canvas');
|
||||
c.width = self.width;
|
||||
c.height = self.height;
|
||||
var cxt = c.getContext('2d');
|
||||
cxt.drawImage(self,0,0);
|
||||
return c;
|
||||
};
|
||||
|
||||
function blitImage(ctx, image, sx ,sy, sw, sh, dx, dy, dw, dh) {
|
||||
var x; var y;
|
||||
for (x=0;x<dw;x++) {
|
||||
for (y=0;y<dh;y++) {
|
||||
ctx.drawImage(image,Math.floor(sx+x*(sw/dw)),Math.floor(sy+y*(sw/dw)),1,1,dx+x,dy+y,1,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function createMinecraftHead(player,completed,failed) {
|
||||
var skinImage = new Image();
|
||||
skinImage.onload = function() {
|
||||
var headCanvas = document.createElement('canvas');
|
||||
headCanvas.width = 8;
|
||||
headCanvas.height = 8;
|
||||
if(headCanvas.getContext) {
|
||||
var headContext = headCanvas.getContext('2d');
|
||||
blitImage(headContext, skinImage, 8,8,8,8, 0,0,8,8);
|
||||
// Turn off accessory face overlay - causes white faces, and very few skins seem to have them anyway
|
||||
//blitImage(headContext, skinImage, 40,8,8,8, 0,0,8,8);
|
||||
completed(headCanvas);
|
||||
}
|
||||
else {
|
||||
failed();
|
||||
}
|
||||
function createMinecraftHead(player,size,completed,failed) {
|
||||
var faceImage = new Image();
|
||||
faceImage.onload = function() {
|
||||
completed(faceImage);
|
||||
};
|
||||
skinImage.onerror = function() {
|
||||
if (skinImage.src == '//www.minecraft.net/img/char.png') {
|
||||
failed();
|
||||
} else {
|
||||
skinImage.src = '//www.minecraft.net/img/char.png';
|
||||
}
|
||||
faceImage.onerror = function() {
|
||||
failed();
|
||||
};
|
||||
skinImage.src = '//s3.amazonaws.com/MinecraftSkins/' + player + '.png';
|
||||
}
|
||||
|
||||
function resizeImage(img,size) {
|
||||
var canvas = document.createElement('canvas');
|
||||
canvas.width = size;
|
||||
canvas.height = size;
|
||||
var ctx = canvas.getContext('2d');
|
||||
blitImage(ctx, img, 0,0,img.width,img.height, 0,0,size,size);
|
||||
return canvas;
|
||||
faceImage.src = dynmap.options.tileUrl + 'faces/' + size + 'x' + size + '/' + player + '.png';
|
||||
}
|
||||
|
||||
var playerHeads = {};
|
||||
|
||||
function getMinecraftHead(player,size,completed) {
|
||||
var head = playerHeads[player];
|
||||
var key = player + '.' + size;
|
||||
var head = playerHeads[key];
|
||||
// Synchronous
|
||||
if (!completed) {
|
||||
return (!head || head.working) ? null : head;
|
||||
|
|
@ -63,24 +21,22 @@ function getMinecraftHead(player,size,completed) {
|
|||
|
||||
// Asynchronous
|
||||
if (!head) {
|
||||
playerHeads[player] = { working: true, hooks: [{f:completed,s:size}] };
|
||||
//console.log('Creating head for ',player,'...');
|
||||
createMinecraftHead(player, function(head) {
|
||||
//console.log('Created head for ',player,': ', head);
|
||||
hooks = playerHeads[player].hooks;
|
||||
playerHeads[player] = head;
|
||||
playerHeads[key] = { working: true, hooks: [{f:completed}] };
|
||||
createMinecraftHead(player, size, function(head) {
|
||||
hooks = playerHeads[key].hooks;
|
||||
playerHeads[key] = head;
|
||||
var i;
|
||||
for(i=0;i<hooks.length;i++) {
|
||||
hooks[i].f(resizeImage(head,hooks[i].s));
|
||||
hooks[i].f(head);
|
||||
}
|
||||
}, function() {
|
||||
|
||||
});
|
||||
} else if (head.working) {
|
||||
//console.log('Other process working on head of ',player,', will add myself to hooks...');
|
||||
head.hooks[head.hooks.length] = {f:completed,s:size};
|
||||
head.hooks[head.hooks.length] = {f:completed};
|
||||
} else {
|
||||
completed(resizeImage(head,size));
|
||||
completed(head);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue