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

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

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

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

enchant.js

enchant.jsとは、アプリやゲームを簡単に開発できるオープンソースのHTML5+JavaScriptベースのフレームワークです。プログラミング学習にも用いられ、多くの素材やプラグインが用意されています。

Q&A

解決済

1回答

1186閲覧

配列を持つオブジェクトのプロパティを読み取れない

jyarin

総合スコア12

JavaScript

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

enchant.js

enchant.jsとは、アプリやゲームを簡単に開発できるオープンソースのHTML5+JavaScriptベースのフレームワークです。プログラミング学習にも用いられ、多くの素材やプラグインが用意されています。

0グッド

0クリップ

投稿2020/07/16 13:53

編集2020/07/16 13:56

前提・実現したいこと

配列を持つオブジェクトplkomaをクリックしたとき、そのプロパティがある条件を満たせば、配列を持つオブジェクトchipのプロパティを変更するプログラムを書きたいです。
しかし、plkomaのプロパティを条件にかけるときに、エラーが発生します。
このエラーを排除する方法を教えて頂きたいです。

該当のソースコード

javascript

1for(var i = 0;i<25;i++){ 2 plkoma[i].ontouchend = function(){ 3 if(plkoma[i].exist == 1 && plkoma[i].place >= 16){ 4 chip[plkoma[i].place - 16].frame += 7; 5 } 6 }; 7}

発生している問題・エラーメッセージ

simshoot4scrfake.js:99 Uncaught TypeError: Cannot read property 'exist' of undefined at Constructor.plkoma.<computed>.ontouchend (simshoot4scrfake.js:99) at Constructor.dispatchEvent (enchant.js:916) at HTMLDivElement.<anonymous> (enchant.js:1245)

plkomaをクリックしたタイミングで、エラーが発生します。
また、simshoot4scrfake.jsの99行目は、上で示したプログラミングでの
if(plkoma[i].exist == 1 && plkoma[i].place >= 16){
の部分です。

補足情報

simshoot4scrfake.jsの全文を載せておきます。

javascript

1window.focus(); 2enchant(); 3 4 5window.onload = function(){ 6 7 core = new Core(820,520); 8 core.fps = 30; 9 10 core.preload('pic.png','back3.png','chip2.png','koma2.png',); 11 12 core.onload = function(){ 13 14 //グローバル変数 15 16 map = [6,6,4,6,6,6,6,6,6,6,6,6,6,6,6,6, 17 0,0,3,0,1,0,0,1,6,6,6,6,6,6,6,6, 18 0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6, 19 0,0,0,2,0,0,0,2,0,0,0,6,6,6,6,6, 20 0,0,0,0,0,6,6,6,0,2,0,6,6,6,6,6, 21 0,0,0,0,0,6,6,6,1,0,0,1,2,0,6,6, 22 0,2,0,0,0,6,6,6,6,6,6,0,0,1,6,6, 23 0,0,0,0,1,6,6,6,6,6,6,2,1,0,2,1, 24 0,0,0,0,1,6,6,6,6,6,6,2,1,0,2,1, 25 0,2,0,0,0,6,6,6,6,6,6,0,0,1,6,6, 26 0,0,0,0,0,6,6,6,1,0,0,1,2,0,6,6, 27 0,0,0,0,0,6,6,6,0,2,0,6,6,6,6,6, 28 0,0,0,2,0,0,0,2,0,0,0,6,6,6,6,6, 29 0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6, 30 0,0,3,0,1,0,0,1,6,6,6,6,6,6,6,6, 31 6,6,5,6,6,6,6,6,6,6,6,6,6,6,6,6]; 32 33 komamap = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 34 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 35 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 36 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 37 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 38 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 39 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 40 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 41 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 42 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 43 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 44 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 45 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 46 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 47 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]; 49 50 51 plkoma = [25]; 52 for(var i = 0;i<25;i++){ 53 plkoma[i] = new PlKoma; 54 plkoma[i].exist = 0; 55 } 56 57 plkoma[0].exist = 1;//仮マークの位置 58 plkoma[0].place = 51; 59 plkoma[0].type = 0; 60 plkoma[1].exist = 1; 61 plkoma[1].place = 32; 62 plkoma[1].type = 1; 63 64 65 //グローバル変数終わり 66 67 //mainScene 68 core.mainFx = function(PlX,PlY,EnX,EnY){ 69 70 var mainScene = new Scene(); 71 72 var back = new Sprite(820,520); 73 back.image = core.assets['back3.png']; 74 back.x = 0; 75 back.y = 0; 76 mainScene.addChild(back); 77 78 var chip = [256]; 79 for(var j = 0; j < 16; j++){ 80 for(var k = 0; k < 16; k++){ 81 chip[16 * j + k] = new Chip(k,j); 82 mainScene.addChild(chip[16 * j + k]); 83 } 84 } 85 86 for(var i = 0;i<25;i++){ 87 if(plkoma[i].exist == 1){ 88 plkoma[i].x=(plkoma[i].place % 16)*20+470; 89 plkoma[i].y=Math.floor(plkoma[i].place / 16) * 20 + 50; 90 mainScene.addChild(plkoma[i]); 91 komamap[plkoma[i].place]=i; 92 } 93 } 94 95 mainScene.addEventListener('enterframe', function(e) { 96 97 for(var i = 0;i<25;i++){ 98 plkoma[i].ontouchend = function(){ 99 if(plkoma[i].exist == 1 && plkoma[i].place >= 16){ 100 chip[plkoma[i].place - 16].frame += 7; 101 } 102 }; 103 } 104 105 }); 106 107 return mainScene; 108 } 109 110 core.replaceScene(core.mainFx()); 111 112 } 113 core.start(); 114} 115 116 117var Chip = enchant.Class.create(enchant.Sprite,{ 118 119 initialize: function(X,Y){ 120 enchant.Sprite.call(this,19,19); 121 this.image = core.assets['chip2.png']; 122 this.x = 470 + 20 * X; 123 this.y = 50 + 20 * Y; 124 this.frame = map[X + 16 * Y]; 125 126 }, 127}); 128 129var PlKoma = enchant.Class.create(enchant.Sprite,{ 130 131 initialize: function(){ 132 enchant.Sprite.call(this,19,19); 133 this.frame = 0; 134 this.image = core.assets['koma2.png']; 135 this.x = 0; 136 this.y = 0; 137 this.exist = 0; 138 this.place = 0; 139 this.type = 0;//機体の種類 140 141 this.addEventListener('enterframe', function() { 142 143 if(this.exist == 1){ 144 this.frame =this.type; 145 } 146 }); 147 148 }, 149});

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

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

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

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

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

guest

回答1

0

自己解決

デバッグをしてみると、ontouchendの行が応答したとき、iは24などの数字になっていました。

そのことからontouchendメソッドを配列を持つオブジェクトに使い、その配列番号(ここでいうiみたいなの)を変数にすると、iに何の数字が入っていてもontouchendはクリックされた判定になるみたいです。

そしてplkoma[24].existはまだ定義されていないので、エラーになったのだと思います。

解決策として、なにかしらplkomaがクリックされたとき、そのときのマウスの座標を調べて、そこからどのplkomaがクリックされたのかを判別すると良いのだと分かりました。

javascript

1 for(var i = 0;i<25;i++){ 2 plkoma[i].ontouchend = function(){ 3 masuX = Math.floor((mX - 470)/20);//mX,mYはマウスの座標 4 masuY = Math.floor((mY - 50)/20); 5 var k = komamap[masuX + 16 * masuY]; 6 if(plkoma[k].exist == 1 && plkoma[k].place >= 16){ 7 chip[plkoma[k].place - 16].frame += 7; 8 } 9 }; 10 } 11

投稿2020/07/17 00:59

jyarin

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問