質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

213閲覧

thisの参照位置を変更したい

meron-pan

総合スコア44

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/12/07 09:49

編集2017/12/07 09:50

###前提・実現したいこと
javascriptで画像を配置し、アニメーションを行えるような関数を制作しています。複数回インスタンス生成したいので、「this.変数名」を使って様々な値を設定したいのですが、参照している場所が思い通りにいきません。
実現したいことは、最初に座標の値を保持する変数を0で初期化したのち、描画の関数の引数で座標を指定し、それを上の変数で記録です。

###該当のソースコード

javascript

1function Character(URL) { 2 this.x = 0; 3 this.y = 0; 4 this.width = 0; 5 this.height = 0; 6 //画像配置 7 var pict = new Image(); 8 pict.src = URL; 9 10  //描画(引数は、canvas名,x座標,y座標,幅,高さ) 11 this.draw = function (ctx, x, y, width, height) { 12     //Charactor.xの部分を参照したい 13 this.x = x; 14 this.y = y; 15 this.width = width; 16 this.height = height; 17 18     //URLが入っていたら画像をキャンバスに書き込む 19 if (pict.src != "") { 20 pict.onload = function () { 21 console.log("" + this.x + "" + this.y + ""); 22 ctx.save(); 23 ctx.drawImage(pict, this.x, this.y,); 24 ctx.restore(); 25 } 26 27 } 28 } 29} 30

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

イベントハンドラ内でthisを参照しているので, Characterオブジェクトだと思っていたものが実は変数pictが参照しているImageオブジェクトになっています. ですから, xyの値が取れないのです.

JavaScript

1function Character(URL) { 2 this.x = 0; 3 this.y = 0; 4 this.width = 0; 5 this.height = 0; 6 //画像配置 7 var pict = new Image(); 8 pict.src = URL; 9 10  //描画(引数は、canvas名,x座標,y座標,幅,高さ) 11 this.draw = function (ctx, x, y, width, height) { 12     //Charactor.xの部分を参照したい 13 this.x = x; 14 this.y = y; 15 this.width = width; 16 this.height = height; 17 18     //URLが入っていたら画像をキャンバスに書き込む 19 if (pict.src != "") { 20 pict.onload = function () { 21 console.log("" + this.x + "" + this.y + "");//ここのthisはpict! 22 ctx.save(); 23 ctx.drawImage(pict, this.x, this.y,); 24 ctx.restore(); 25 } 26 27 } 28 } 29}

また, コードの内容を見るにloadイベントやsave/restoreメソッドを利用する必要は無いものと思われます.

JavaScript

1function Character(URL) { 2 this.x = 0; 3 this.y = 0; 4 this.width = 0; 5 this.height = 0; 6 //画像配置 7 var pict = new Image(); 8 pict.src = URL; 9 10  //描画(引数は、canvas名,x座標,y座標,幅,高さ) 11 this.draw = function (ctx, x, y, width, height) { 12     //Charactor.xの部分を参照したい 13 this.x = x; 14 this.y = y; 15 this.width = width; 16 this.height = height; 17 18     //画像の読み込みが完了していたらpictをcanvasに描く 19 if(pict.complete){ 20 ctx.drawImage(pict, this.x, this.y); 21 } 22 } 23}

「画像の読み込みが完了していたら」はcompleteプロパティで判ります. なお画像の読み込み失敗(画像が見つからない等)時にもcompletetrueとなるので, できれば, errorイベントを使って画像が正しく読み込めなかった場合の代替処理についても考慮したほうが良いでしょう.

投稿2017/12/07 10:34

編集2017/12/07 10:48
defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meron-pan

2017/12/07 10:46

コードを修正したところ無事、動かすことができました。ありがとうございます。
guest

0

こういうことですよね?
普通に指定通りにうごきませんか?

javascript

1function func_a(){ 2 this.x=0; 3 this.func_b=function(x){ 4 this.x=x; 5 } 6} 7var myObj=new func_a(); 8myObj.func_b(1); 9console.log(myObj.x); 10

投稿2017/12/07 09:57

編集2017/12/07 09:58
yambejp

総合スコア114777

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meron-pan

2017/12/07 10:11

画像が配置されている場所を21行目のconsole.log("" + this.x + "" + this.y + "");で確認しているのですが、結果は00でさらに画像も左上から一ミリも動いていないので、指定通りには理論上動くはずなんですけど、なんかダメです。
yambejp

2017/12/07 10:26

drawメソッドの中でpict.onload を処理していますが drawは実行とpictのonloadに整合性はあるのでしょうか?
meron-pan

2017/12/07 10:39

座標をURLと一緒に引数を指定したくなかったのと、onloadは「画像の読み込みができていたら」という認識で使っています。そのため、画像の読み込みの後に描画をしたいのでそこに格納しています。
guest

0

javascriptでは「this」の使用箇所によって意味が変わるので、このように修正すれば行けるかと。

var self = this; //描画(引数は、canvas名,x座標,y座標,幅,高さ) this.draw = function (ctx, x, y, width, height) { //Charactor.xの部分を参照したい self.x = x; self.y = y; self.width = width; self.height = height; //URLが入っていたら画像をキャンバスに書き込む if (pict.src != "") { pict.onload = function () { console.log("" + self.x + "" + self.y + ""); ctx.save(); ctx.drawImage(pict, self.x, self.y,); ctx.restore(); } } }

投稿2017/12/07 10:31

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meron-pan

2017/12/07 10:44

その場合、drawメソッドで指定した引数を上で用意した変数に入れることは可能なのでしょうか?
defghi1977

2017/12/07 10:51

通常(グローバル)変数selfはスクリプトの実行時コンテキスト(例えばwindow)を参照するので, 別の名称を使ったほうが良いと思います. (スコープで分離されていれば別ですが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問