回答編集履歴

2

追記

2020/08/14 22:11

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

test CHANGED
@@ -97,3 +97,95 @@
97
97
  </html>
98
98
 
99
99
  ```
100
+
101
+
102
+
103
+ ----
104
+
105
+ 追記)
106
+
107
+
108
+
109
+ [HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement) には、読み込みが完了したかどうかを知るための ``complete`` 属性があります。
110
+
111
+
112
+
113
+ 2つのCanvas描画関数に利用した例:
114
+
115
+ ```javascript
116
+
117
+ var canvas, context;
118
+
119
+ var img,bkimg;
120
+
121
+
122
+
123
+ function initial(){
124
+
125
+ canvas = document.querySelector('#canvas');
126
+
127
+ context = canvas.getContext('2d'); // global スコープの context に参照を保持させる
128
+
129
+ canvas.onclick = doDown;
130
+
131
+
132
+
133
+ img=new Image();
134
+
135
+ img.src="character.png";
136
+
137
+ bkimg=new Image();
138
+
139
+ bkimg.src="background.png";
140
+
141
+ bkimg.onload=function(){
142
+
143
+ drawBackground(); // 背景は先に
144
+
145
+ }
146
+
147
+ }
148
+
149
+
150
+
151
+ // canvas を click すると呼ばれる
152
+
153
+ function doDown(event){
154
+
155
+ drawBackground();
156
+
157
+ drawImage(event);
158
+
159
+ }
160
+
161
+ function drawBackground(){
162
+
163
+ if( bkimg.complete ) { // 読み込みが完了しているなら描画
164
+
165
+ context.clearRect(0,0,500,400);
166
+
167
+ context.drawImage(bkimg,0,0,500,400);
168
+
169
+ }
170
+
171
+ }
172
+
173
+ function drawImage(event){
174
+
175
+ if( img.complete ) { // 読み込みが完了しているなら描画
176
+
177
+ // 意図した位置に表示するにはもうひと工夫必要(あとで考える箇所)
178
+
179
+ var h = event.ClientX-canvas.offsetLeft;
180
+
181
+ var w = event.ClientY-canvas.offsetTop;
182
+
183
+ context.drawImage(img,h-img.width/2,w-img.height/2);
184
+
185
+ }
186
+
187
+ }
188
+
189
+ ```
190
+
191
+ ご質問のコードに少し手を加えました(クリックするまでは、背景しか表示されません)。

1

訂正

2020/08/14 22:10

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

test CHANGED
@@ -62,7 +62,7 @@
62
62
 
63
63
 
64
64
 
65
- ```javascript
65
+ ```html
66
66
 
67
67
  <!DOCTYPE html>
68
68