28.08.2020, 13:02
|
Новичок на форуме
|
|
Регистрация: 25.08.2020
Сообщений: 4
|
|
js в visual code графика не отображается
Обновляю страницу а экран белый,в чем может быть проблема подскажите пожалуйста
var cvs = document.getElementById("canvas");
var ctx = cvs.getContext("2d");
var bird = new Image();
var bg = new Image();
var fg = new Image();
var pipeUP = new Image();
var pipeBottom = new Image();
bird.src = "img/bird.png";
bg.src = "img/bg.png";
fg.src = "img/fg.png";
pipeBottom.src = "img/pipeBottom.png";
pipeUP.src = "img/pipeUp.png";
function draw(); {
ctx.drawImage(bg, 0, 0);
}
pipeBottom.onload = draw;
|
|
28.08.2020, 13:10
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
function draw(); {
Прям так и есть или только тут случайно?
|
|
28.08.2020, 13:34
|
Новичок на форуме
|
|
Регистрация: 25.08.2020
Сообщений: 4
|
|
тут случайно ,но изображение не выводить ,все перепробывал
|
|
28.08.2020, 13:45
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от rabishchuk
|
pipeBottom.onload = draw;
|
pipeBottom загружается, а bg, скорее всего, не успевает
|
|
28.08.2020, 16:02
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,744
|
|
Что то типа такого надо
function loadImg (img, src) {
return new Promise ( (res, rej) => {
img.onload = () => res()
img.onerror = () => rej()
img.src = src
})
}
var cvs = document.getElementById("canvas");
var ctx = cvs.getContext("2d");
var bird = new Image();
var bg = new Image();
var fg = new Image();
var pipeUP = new Image();
var pipeBottom = new Image();
function draw(); {
ctx.drawImage(bg, 0, 0);
}
let ap = [
loadImg(bird, "img/bird.png"),
loadImg(fg, "img/fg.png"),
loadImg(pipeUp, "img/pipeUp.png"), // Если тоже нужно ждать
]
loadImg(pipeUp, "img/pipeUp.png")
.then(() => Promise.allSettled(ap))
.then(() => draw());
Последний раз редактировалось voraa, 28.08.2020 в 16:37.
|
|
28.08.2020, 16:18
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Сообщение от voraa
|
img.onload = () => res()
|
img.onload = res;
|
|
28.08.2020, 16:29
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,744
|
|
Я так пишу для однообразия (для себя)
Просто если, вдруг потом выяснится, что лучше промису возвращать какое то значение, то просто подставить его.
Например
img.onload = () => res(img)
img.onerror = () => rej({reason:'load error'})
|
|
28.08.2020, 16:40
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
удобнее сразу создавать картинку в loadImg, и резолвить ее в промис
function loadImg (src) {
return new Promise ( (res, rej) => {
const img = new Image();
img.onload = () => res(img);
img.onerror = () => rej();
img.src = src;
});
}
|
|
28.08.2020, 16:49
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,744
|
|
Может и удобнее, но тогда все функции переписывать.
В частности draw Иначе до конкретной картинки bg трудно добраться.
К тому же, в случае ошибки, img после allSettled не получить.
Там в ответе после rej() будет не img, а {status:'reject', reason:undefined}
|
|
28.08.2020, 19:42
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,744
|
|
А "моднее" так эту функцию сделать
function loadImg (img, src) {
img.src = src
return img.decode().finally (() =>img)
}
|
|
|
|