#javascript #html
#javascript #HTML
Вопрос:
Я пытаюсь создать игру на HTML5, и у меня возникают проблемы с загрузкой ресурсов изображения. Моя проблема в том, что событие onload кода не запускается, и поэтому логическое значение не меняется.
var c = document.getElementById("gamearea");
var gs = c.getContext("2d");
var one_x = 0;
//Sprite Loading//
function sprite(src,x, y, width, height, frames, levels) {
this.sprite = Image();
this.sprite.src = src;
this.x = x;
this.y = y;
this.w = width;
this.h = height;
this.f = frames;
this.l = levels;
this.cf = 0;
this.cl = 0;
this.loaded = false;
this.src = src;
}
sprite.prototype.draw = function () {
if (this.loaded) {
document.getElementById("ass").innerHTML = "Ass";
gs.drawImage(this.src, this.x, this.y);
}
}
dog = new sprite("/images/sDog.png", 10, 10, 10, 10, 1, 1);
dog.sprite.onload = function () {
alex.loaded = true;
}
setInterval(alex.draw, 30);
Комментарии:
1. Кто такой Алекс? Я нигде не вижу
alex
определенного.
Ответ №1:
Я бы предложил поместить событие onload перед событием set для вашего объекта изображения dog sprite. Я вижу, что вы задаете все в конструкторе, но я бы посоветовал отказаться от этого.
В вашем текущем коде ваш объект загружается перед строкой, которая инициализирует событие onload.
Я часто видел это при загрузке изображений, я бы сделал что-то вроде этого.
function sprite(src,x, y, width, height, frames, levels) {
var self = this;
self.sprite = new Image();
self.init = function(){
self.sprite.src = src;
self.x = x;
self.y = y;
self.w = width;
self.h = height;
self.f = frames;
self.l = levels;
self.cf = 0;
self.cl = 0;
self.loaded = false;
self.src = src;
}
}
dog = new sprite();
dog.sprite.onload = function () {
alex.loaded = true;
}
dog.init("/images/sDog.png", 10, 10, 10, 10, 1, 1);
setInterval(alex.draw, 30);
или, чтобы немного пофантазировать
function sprite(src,x, y, width, height, frames, levels, onLoad) {
var self = this;
self.sprite = new Image();
self.sprite.onload = function(){
onLoad();
}
self.sprite.src = src;
self.x = x;
self.y = y;
self.w = width;
self.h = height;
self.f = frames;
self.l = levels;
self.cf = 0;
self.cl = 0;
self.loaded = false;
self.src = src;
}
dog = new Sprite("/images/sDog.png", 10, 10, 10, 10, 1, 1, function(){
alex.loaded = true;
});
setInterval(alex.draw, 30);
после просмотра вашей скрипки
var c = document.getElementById("gamearea");
var gs = c.getContext("2d");
var one_x = 0;
//Sprite Loading//
function sprite(src, x, y, width, height, frames, levels, loaded) {
var self = this;
self.sprite = new Image();
self.sprite.onload = function(){
self.loaded = true;
}
self.sprite.src = src;
self.x = x;
self.y = y;
self.w = width;
self.h = height;
self.f = frames;
self.l = levels;
self.cf = 0;
self.cl = 0;
self.loaded = false;
self.src = src;
self.update = function () {
one_x = 1;
gs.fillStyle = "white";
gs.fillRect(0, 0, 1000, 10000);
gs.fillStyle = "black";
gs.fillRect(one_x, 20, 10, 10);
}
self.draw = function (){
if (self.loaded) {
document.getElementById("ass").innerHTML = "Ass";
gs.drawImage(self.sprite, self.x, self.y);
}
}
}
dog = new sprite("http://www.bit-101.com/blog/wp-content/uploads/2009/05/ball.png", 10, 10, 10, 10, 1, 1);
setInterval(dog.draw, 30);
Комментарии:
1. запускается ли событие onload
2. Нет, кажется, я не могу получить от него предупреждение или какую-либо обратную связь
3. Это работает: jsfiddle.net/prankol57/78r7Y Вы забыли изменить несколько вхождений
this
вself
.4. Я посмотрел на вашу скрипку и увидел несколько проблем: 1 старайтесь не использовать объект «this» при объединении нескольких функций, это может быть совсем не то, что вы ожидаете. 2 Я переместил загруженный установщик внутрь конструктора, поскольку его единственной реальной целью было установить флаг, который изначально существовал в объекте. jsfiddle.net/LCDBL/2
5. В идеале, когда кто-то отвечает на ваш вопрос, вы должны отметить ответ как правильный и проголосовать «За»
Ответ №2:
Здесь вы что-то упускаете new
:
this.sprite = Image();
Попробуйте:
this.sprite = new Image();
Также убедитесь, что файл изображения действительно существует в указанном местоположении.