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

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

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

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

enchant.js

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

Q&A

解決済

1回答

240閲覧

オブジェクトがあるプロパティを取得するまで、参照しなくする(読み飛ばさせる)方法

jyarin

総合スコア12

JavaScript

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

enchant.js

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

0グッド

0クリップ

投稿2020/04/21 07:15

シューティングゲームで、接触判定にwithinを使ったとき、エラーが発生しました。
コード

Sボタンが押されたら弾丸を発射し、それを敵(enemys1)に当てたら終了画面(endFx)に移るプログラムです。

plbulは、初めは空っぽの配列ですが、Sボタンを押すと弾になり(PlBulオブジェクトとなり)、通し番号(PlBulCount、0~19までの数字)がつけられます。
PlBulクラスはSpriteクラスを継承しています。

JavaScript

1 var plbul = []; 2 var PlBulCount = 0; 3 4 mainScene.addEventListener('enterframe', function(e) { 5 6 if(core.input.s){ 7 plbul[PlBulCount] = new PlBul(players1.x,players1.y,players1.rotation); 8 mainScene.addChild(plbul[PlBulCount]); 9 PlBulCount = (PlBulCount + 1) % 20; 10 } 11 12 for(var i = 0; i < 20; i++){ 13 if (enemys1.within(plbul[i],32)) { 14 state = 2; 15 PlX = players1.x; 16 PlY = players1.y; 17 EnX = enemys1.x; 18 EnY = enemys1.y; 19 core.replaceScene(core.endFx(PlX,PlY,EnX,EnY,1)); 20 } 21 } 22 }); 23

エラー文

Uncaught TypeError: Cannot read property '_dirty' of undefined

( if (enemys1.within(plbul[i],32))  の行に発生)

予想・疑問

上のエラー文は、_dirtyというプロパティを読み取れない事を表しています。

_dirtyが何を意味するのかはよく分かりませんでしたが、恐らくwithinに関係する何かのようです(http://wise9.github.io/enchant.js/doc/core/ja/symbols/src/lang_ja_enchant.js.htmlを見ると、withinの近くに_dirtyがあったから)。

つまり、withinが何かを読み取れていないようです。

そうだとすると、読み取れないものはplbul[i]だと思います。
Sボタンが押されるまで(withinが欲すると思われる)plbulの座標情報が存在しないからです。

よって、plbulが弾丸になる(PlBulオブジェクトになる)までは、このwithinを含む行を読み飛ばして欲しいです。
どうすれば読み飛ばしてもらえますか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

plbulが弾丸になる(PlBulオブジェクトになる)

20個までを想定している plbulの配列要素 plbul[i] が定義済みとは限らないということなら、以下の条件式を思いつきますが、いかがでしょう。

// if (enemys1.within(plbul[i],32)) { if ( plbul[i] && enemys1.within(plbul[i],32) ) { // ~~~~~~~~ // undefined でなく、定義済みなら truthy

MDN truthy

投稿2020/04/21 09:23

AkitoshiManabe

総合スコア5432

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

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

jyarin

2020/04/21 09:39

ありがとうございます!上手くいきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問