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

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

ただいまの
回答率

88.92%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 134

jyarin

score 12

前提・実現したいこと

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

該当のソースコード

for(var i = 0;i<25;i++){
    plkoma[i].ontouchend = function(){ 
        if(plkoma[i].exist == 1 && plkoma[i].place >= 16){
            chip[plkoma[i].place - 16].frame += 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の全文を載せておきます。

window.focus();
enchant();


window.onload = function(){

    core = new Core(820,520);
    core.fps = 30;

    core.preload('pic.png','back3.png','chip2.png','koma2.png',);

    core.onload = function(){

        //グローバル変数

        map = [6,6,4,6,6,6,6,6,6,6,6,6,6,6,6,6,
            0,0,3,0,1,0,0,1,6,6,6,6,6,6,6,6,
            0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,
            0,0,0,2,0,0,0,2,0,0,0,6,6,6,6,6,
            0,0,0,0,0,6,6,6,0,2,0,6,6,6,6,6,
            0,0,0,0,0,6,6,6,1,0,0,1,2,0,6,6,
            0,2,0,0,0,6,6,6,6,6,6,0,0,1,6,6,
            0,0,0,0,1,6,6,6,6,6,6,2,1,0,2,1,
            0,0,0,0,1,6,6,6,6,6,6,2,1,0,2,1,
            0,2,0,0,0,6,6,6,6,6,6,0,0,1,6,6,
            0,0,0,0,0,6,6,6,1,0,0,1,2,0,6,6,
            0,0,0,0,0,6,6,6,0,2,0,6,6,6,6,6,
            0,0,0,2,0,0,0,2,0,0,0,6,6,6,6,6,
            0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,
            0,0,3,0,1,0,0,1,6,6,6,6,6,6,6,6,
            6,6,5,6,6,6,6,6,6,6,6,6,6,6,6,6];

            komamap = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];


        plkoma = [25];
        for(var i = 0;i<25;i++){
            plkoma[i] = new PlKoma;
            plkoma[i].exist = 0;
        } 

        plkoma[0].exist = 1;//仮マークの位置
        plkoma[0].place = 51;
        plkoma[0].type = 0;
        plkoma[1].exist = 1;
        plkoma[1].place = 32;
        plkoma[1].type = 1;


        //グローバル変数終わり

        //mainScene
        core.mainFx = function(PlX,PlY,EnX,EnY){

            var mainScene = new Scene();

            var back = new Sprite(820,520);
            back.image = core.assets['back3.png'];
            back.x = 0;
            back.y = 0;
            mainScene.addChild(back);

            var chip = [256];
            for(var j = 0;  j < 16;  j++){
                for(var k = 0;  k < 16;  k++){
                    chip[16 * j + k] = new Chip(k,j);
                    mainScene.addChild(chip[16 * j + k]);
                }
            }

            for(var i = 0;i<25;i++){
                if(plkoma[i].exist == 1){
                    plkoma[i].x=(plkoma[i].place % 16)*20+470;
                    plkoma[i].y=Math.floor(plkoma[i].place / 16) * 20 + 50;
                    mainScene.addChild(plkoma[i]);
                    komamap[plkoma[i].place]=i;
                }
            }

            mainScene.addEventListener('enterframe', function(e) {

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

            });

            return mainScene;
        }

        core.replaceScene(core.mainFx());

    }
    core.start();
}


var Chip = enchant.Class.create(enchant.Sprite,{

    initialize: function(X,Y){
        enchant.Sprite.call(this,19,19);
        this.image = core.assets['chip2.png'];
        this.x = 470 + 20 * X;
        this.y = 50 + 20 * Y;
        this.frame = map[X + 16 * Y];

    },
});

var PlKoma = enchant.Class.create(enchant.Sprite,{

    initialize: function(){
        enchant.Sprite.call(this,19,19);
        this.frame = 0;
        this.image = core.assets['koma2.png'];
        this.x = 0;
        this.y = 0;
        this.exist = 0;
        this.place = 0;
        this.type = 0;//機体の種類

        this.addEventListener('enterframe', function() {

            if(this.exist == 1){
                this.frame =this.type;
            }
        });

    },
});
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る