У меня есть хорошие новости, и у меня есть плохие новости.
Хорошие новости: код, который вы здесь показывает, работает на 100%, вот демо: http://jsbin.com/upatij/edit#javascript,html,live
плохоновость: это означает, что что-то внутри вашего кода уровня повреждено, так как мой код уровня заглушки прекрасно работает в вашей среде ... :-(
уровень заглушки:
function Level() {
this.Draw = function(xxctx) {
for (var i = 0; i < 30; i++) {
xxctx.moveTo(10 + (i * 40 % 300), 10 + (parseInt(i / 6, 10) * 40));
xxctx.lineTo(40 + (i * 40 % 300), 40 + (parseInt(i / 6, 10) * 40));
xxctx.moveTo(40 + (i * 40 % 300), 10 + (parseInt(i / 6, 10) * 40));
xxctx.lineTo(10 + (i * 40 % 300), 40 + (parseInt(i / 6, 10) * 40));
}
xxctx.stroke();
};
}
удачи! -Ck
ПОСЛЕ ВАШЕГО УВИДЕНИЯ КОДА УРОВНЯ:
Проблема заключается в синхронностиВаше использование классов здесь скрывает проблему от вас через обманчивое именование, поскольку ваш Level.Draw вообще не является функцией рисования ... позвольте мне развернуть ее для вас:
var c = document.getElementById('mycanvas');
var ctx = c.getContext('2d');
// var render = new Renderer(c.width, c.height);
var Renderer_c = document.createElement('canvas');
var Renderer_ctx = Renderer_c.getContext('2d');
document.body.appendChild(Renderer_c); //added to show
Renderer_c.width = c.width;
Renderer_c.height = c.height;
// var level1 = new Level('images/imagequality.png');
var map = new Image();
document.body.appendChild(map); //add to show
map.src = 'http://th06.deviantart.net/fs71/150/i/2011/255/9/5/omnom_upside_down_by_earnurm-d49pjnl.png';
console.log('at ' + 1);
// level1.Draw(render.getBufferContext());
map.onload = function() {
console.log('at ' + 3);
//this happens async:
alert('drawing now!');
Renderer_ctx.drawImage(map,0,0);
};
console.log('at ' + 2);
// render.drawToCanvas(ctx);
ctx.drawImage(Renderer_c, 0, 0);
Еслизапустив этот код, вы увидите, что в тот момент, когда вызывается onload
, все остальное уже выполнено, вы заметите, как консоль будет читать:
at 1
at 2
at 3
и, таким образом, в данный моменткогда alert('drawing now!');
будет выполнено ...
// render.drawToCanvas(ctx);
ctx.drawImage(Renderer_c, 0, 0);
уже будет запущено ... В основном ваша Draw()
функция фактически является асинхронной"Load".К сожалению, ваша текущая концепция не работает.Ваша Draw()
функция должна быть асинхронной, например:
function Level(mapname) {
var map=new Image();
document.body.appendChild(map); //add to show
map.src=mapname;
this.asyncDraw = function(renderer, onComplete) {
map.onload = function() {
renderer.drawImage(map,0,0);
onComplete();
};
};
}
, и в этом примере функцию следует вызывать так:
level1.asyncDraw(render.getBufferContext(), function() {
render.drawToCanvas(ctx);
});
Я, вероятно, должен продолжитьСказать, что этот тип асинхронности делает программирование HTML5-игры немного сложнее, поскольку вам действительно нужно запустить спиннер «Загрузка ...» и воздерживаться от перехода в цикл рендеринга, пока все «ресурсы» не загрузятся.Во всей практичности вам нужно понятие «готово», например.Load(fOnReady)
И Draw(ctx)
вместо просто asyncDraw(ctx, fOnReady)
...
обновленный jsbin находится здесь: http://jsbin.com/upatij/2/edit
надеюсь, это поможет -ck