Javascriptの基礎を勉強し終え、ノベルゲーム開発に挑戦しているのですが、たまにノベルゲームに登場するキャラクター画像が表示されない不具合が発生してしまいます。
以下リンクのゲームに登場するキャラクターが定期的に表示されなくなってしまいます。
開発中のゲームはこちら
不具合が出ている登場キャラクター↓
読み込みの問題だと思うのですが、改善方法がわかりません。
初歩的な問題でしたらすいません。
js
1class Novel { 2 3 constructor() { 4 this.canvas = document.getElementById('canvas'); 5 this.ctx = this.canvas.getContext('2d'); 6 this.canvas.width = 1024; 7 this.canvas.height = 576; 8 9 // 進行状況を管理 10 let nowcount = 0; 11 12 // 文字、画像情報を配列で管理 13 this.data(); 14 15 //初期画像を描写 16 this.update(nowcount, this.canvas); 17 this.draw(this.canvas); 18 19 //クリック時の動作 20 this.canvas.addEventListener('click', () => { 21 // 次のページへ遷移 22 23 if (nowcount === 0) { 24 this.music = new Audio('bgm/nonki.mp3'); 25 this.music.play(); // 再生 26 this.music.loop = true; 27 } 28 29 console.log(this.wareHouse.length); 30 31 if (nowcount === this.wareHouse.length) { 32 console.log('owari'); 33 this.music.pause(); 34 window.open('top.html', '_blank'); 35 } 36 37 38 nowcount++; 39 40 41 42 this.update(nowcount, this.canvas); 43 //描写処理 44 this.draw(this.canvas); 45 46 47 }); 48 } 49 50 51 52 update(c, canvas) { 53 54 this.canvas = canvas; 55 this.ctx = this.canvas.getContext('2d'); 56 57 58 this.h = this.canvas.height; 59 this.w = this.canvas.width; 60 61 // 背景のプロパティ 62 this.ctx.beginPath(); 63 this.bg = new Image(); 64 this.bg.src = this.wareHouse[c][0]; 65 66 // テキストボックスのプロパティ 67 this.ctx.beginPath(); 68 this.textbox = new Image(); 69 this.textbox.src = this.wareHouse[c][1]; 70 71 // 人物のプロパティ 72 this.human = new Image(); 73 this.human.src = this.wareHouse[c][2]; 74 this.humanPosition = this.wareHouse[c][6] 75 76 // 名前のプロパティ 77 this.name = this.wareHouse[c][3]; 78 79 // テキストのプロパティ 80 this.text = this.wareHouse[c][4]; 81 this.ctx.font = "40px serif"; 82 this.ctx.fillStyle = 'white'; 83 84 // テキストのプロパティ 85 this.text2 = this.wareHouse[c][5]; 86 this.ctx.font = "30px serif"; 87 this.ctx.fillStyle = 'white'; 88 89 // 効果音のプロパティ 90 this.sd1 = new Audio(this.wareHouse[c][7]); 91 this.sd1.play(); // 再生 92 } 93 94 95 96 draw() { 97 98 99 100 this.bg.onload = (canvas) => { 101 // 背景描写 102 this.ctx.drawImage(this.bg, 0, 0); 103 //登場人物表示 104 this.ctx.drawImage(this.human, this.humanPosition, this.h - this.human.height); 105 // テキストボックス描写 106 this.ctx.drawImage(this.textbox, 0, this.h - this.textbox.height - 10, this.w, 170); 107 // 人物名描写 108 this.ctx.fillText(this.name, 10, this.h - this.textbox.height + 40); 109 //テキスト描写 110 this.ctx.fillText(this.text, 10, this.h - this.textbox.height + 100); 111 //テキスト描写 112 this.ctx.fillText(this.text2, 10, this.h - this.textbox.height + 140); 113 }; 114 } 115 116 data() { 117 this.wareHouse = [ 118//表示するテキスト、画像などを管理 119//量が多すぎるため、追記欄に記載 120] 121 122 return this.wareHouse; 123 } 124 125} 126 127 128new Novel; 129 130 131 132let menu = document.getElementById('menu') 133let menuBtn = document.getElementById('mbtn'); 134 135menuBtn.addEventListener('click', () => { 136 menu.classList.toggle('hidden'); 137 138}) 139 140 141
html
1<!DOCTYPE html> 2<html> 3 4<head> 5 <link rel="stylesheet" href="style.css"> 6 <meta charset="utf-8"> 7 <link href="https://fonts.googleapis.com/earlyaccess/nicomoji.css" rel="stylesheet"> 8 <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css" 9 integrity="sha384-DyZ88mC6Up2uqS4h/KRgHuoeGwBcD4Ng9SiP4dIRy0EXTlnuz47vAwmeGwVChigm" crossorigin="anonymous"> 10</head> 11 12<body> 13 <main> 14 <div id="game"> 15 <div id="menu" class="hidden"> 16 <ul> 17 <a href="top.html"><li>トップに戻る</li></a> 18 <a href="index.html"><li>最初からプレイ</li></a> 19 </ul> 20 21 </div> 22 <i id="mbtn" class="fas fa-hamburger"></i> 23 <canvas id="canvas"></canvas> 24 </div> 25 26 </main> 27 <audio id="bgm1"> 28<source src="bgm/nonki.mp3"> 29 30 </audio> 31 <script src="index.js"></script> 32</body> 33 34</html>