スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コースデータとオブジェクト画像の読み込み

そういえば、コースデータの読み込みについて詳しく解説していなかったので(すぷりくとも導入したことですし…)少し解説していこうかと思います。

system_03_title_back (2)

さて、このゲームに出てくるタイルやアイテム、敵キャラ(以下オブジェクトで統一)はすべて"2次元配列"で管理していることは過去記事で簡単に説明しましたよね。
今回はハテナボックスを画面に表示させるところまで解説していこうかと思いますがその前に一言、このプログラムはあまり効率的にはよくないらしいので(詳しい方に見てもらったらもっと手っ取り早い方法があるみたいです。)あくまでも参考程度に見ていってください。

1.ではまず、オブジェクトのタグとスプライト型の変数を宣言します。

public static final int TAG_TILE_27_QUESTION_BLOCK_SHORT_COIN_YELLOW = 27;
public AnimatedSprite tileQuestionBlockShortCoinYellow;

1行目はタグというものでstatic変数として宣言しています。
タグは簡単に言うとオブジェクトの性質を決めるもので、このタグのオブジェクトは下からマリオが接触するとコインを出すというような命令を隠し持っているといった感じです。
2行目はアニメスプライトの宣言です。ここはもう解説不要ですよね。

2.次にハテナブロックメソッドを宣言する。

tile_27_question_block_short_coin_yellow.png

// 27.ハテナブロック(短い/きいろコイン)
public void tileQuestionBlockShortCoinYellow() {
    questionBlockShorts.tileQuestionBlockShortCoinYellow = getBaseActivity().getResourceUtil()
        .getAnimatedSprite("tile_27_question_block_short_coin_yellow.png", 1, 6);
    questionBlockShorts.tileQuestionBlockShortCoinYellow.setTag(
        QuestionBlockShorts.TAG_TILE_27_QUESTION_BLOCK_SHORT_COIN_YELLOW);
    if (コース初期化中 == true) {
        questionBlockShorts.tileQuestionBlockShortCoinYellow.setPosition(ヨコ * 32, タテ * 32);
    } else {
        questionBlockShorts.tileQuestionBlockShortCoinYellow.setPosition((ヨコ * 0) + 800, タテ * 32);
    }
    questionBlockShorts.tileQuestionBlockShortCoinYellow.animate(
        new long[] { 180, 180, 180, 180, 180, }, 0, 4, true);
    attachChild(questionBlockShorts.tileQuestionBlockShortCoinYellow);
    questionBlockShorts.tileQuestionBlockShortCoinYellow.setZIndex(レイヤー01タイル用);
    sortChildren();
}

5行目と6行目にsetTag()メソッドがあるのをお気づきでしょうか。
ここで先ほど宣言したアニメスプライトにタグをセットしています。

8行目はスプライトのセット位置。
わざわざ"ヨコ * 32, タテ * 32"の位置に指定しているのは画像のサイズがタテとヨコのサイズが32ピクセルのため、もっというと1ブロックまでの間は32ドット分離れているということになります。

3.オブジェクトデータのIDを指定する。

// スプライトの割り振りメソッド
public void courseDataAssign() {
    // 1.草パーツ(1/3)
    if (course1.courseData[ヨコ][タテ] == 1) {
        tileGrassPart1();
    // 2.草パーツ(2/3)
    } else if (course1.courseData[タテ][ヨコ] == 2) {
        tileGrassPart2();
    // 3.草パーツ(3/3)
    } else if (course1.courseData[タテ][ヨコ] == 3) {
        tileGrassPart3();
    // 4.山パーツ(1/6)
    } else if (course1.courseData[タテ][ヨコ] == 4) {
        tileMountPart1();
    
    // (省略…)
    
    // 26.隠しブロック(ファイアフラワー(小さい))
    } else if (course1.courseData[ヨコ][タテ] == 26) {
        tileHiddenBlockFireFlowerSmall();
    // 27.ハテナブロック(短い/きいろコイン)
    } else if (course1.courseData[ヨコ][タテ] == 27) {
        tileQuestionBlockShortCoinYellow();
    // 28.ハテナブロック(短い/あかコイン)
    } else if (course1.courseData[ヨコ][タテ] == 28) {
        tileQuestionBlockShortCoinRed();
    
    // (省略…)
    
    // 94.バルーン
    } else if (course1.courseData[タテ][ヨコ] == 94) {
        enemyBalloon();
    }
}

4行目でようやく2次元配列が登場しましたね。
ここではオブジェクトを2次元配列にセットするためにそれぞれID番号を振り分けております。
2次元配列の番号が1番、2番、3番ならそれぞれ草パーツ「tile_01_grass_part_1.pngtile_02_grass_part_2.pngtile_03_grass_part_3.png」が読み込まれ、
27番ならハテナブロック「tile_27_question_block_short_coin_yellow (2)」が読み込まれるようにそれぞれ番号で指定してやってるというわけです。

さらに正確に言うと、12行目に先ほど宣言したtileQuestionBlockShortCoinYellow()メソッドがあり、二次元配列の番号27が読み込まれると上記メソッドが呼び出され、オブジェクトの画像データやタグのセッティングなど行っているわけです。

ではここで2次元配列の中身を見てみましょう!

public int[][] courseData = {
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    
    { 0, 0, 6, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 4, 5, 8, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 4, 5, 7, 9, 8,     0, 0, 0, 0, 0,     0, 1, 2, 2, 2,     3, 4, 5, 8, 0,     0, 0, 0, 1, 2,},
    {18, 0, 0, 0, 0,    18, 0, 0, 0, 0,    18, 0, 0, 0, 0,    18, 0, 0, 0, 0,    18, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
};

この配列データを画面に表示してみる。

system_03_title_back (3)

ちなみに雲は背景としてスクロールさせており、配列で管理していません。
ここで配列番号の27(ハテナボックス)を追加してみます。

public int[][] courseData = {
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0,27, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0,27, 0, 0,     0, 0, 0, 0, 0,     0, 0,27, 0, 0,     0, 0, 0, 0, 0,},
    
    { 0, 0, 6, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
    { 0, 4, 5, 8, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 6, 0, 0,     0, 0, 0, 0, 0,},
    { 4, 5, 7, 9, 8,     0, 0, 0, 0, 0,     0, 1, 2, 2, 2,     3, 4, 5, 8, 0,     0, 0, 0, 1, 2,},
    {18, 0, 0, 0, 0,    18, 0, 0, 0, 0,    18, 0, 0, 0, 0,    18, 0, 0, 0, 0,    18, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,     0, 0, 0, 0, 0,},
};

配列の27番と画像を見比べてみてください。

system_03_title_back (4)

それでこのcourseData配列をどこで呼び出しているのかというと…ゲーム開始時にinit()メソッドの中から参照しています。

4.2次元配列を読み込む。

// ゲームの初期化
public void init() {
    // 最初に背景画像を追加する
    attachChild(getBaseActivity().getResourceUtil().getSprite("back_01_overworld.png"));
    
    // (省略…)
    
    // コースの読み込み
    // 読み込みフラグ:ON
    コース初期化中 = true;
    // コースデータ上下の読み込み。(初回時)
    for (タテ = 0; タテ < 15; タテ++) {
        // コースデータ左右の読み込み。
        for (ヨコ = 0; ヨコ < 26; ヨコ++) {
            // スプライトの割り振り
            courseDataAssign();
        }
    }
    
    // (省略…)
    
}


これで画面上にオブジェクトが表示されるようになるはずです。
これを常時読み込みたい(スクロールさせたい)場合、上記のコードをハンドラーに中に記述する必要がありますが、説明すると長くなるので今回はここまでにします。
スポンサーサイト

コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます
非公開コメント

プロフィール

岡本 賢治

Author:岡本 賢治
 
☆☆☆☆☆☆☆☆☆☆☆☆
 
Android専用アクションゲーム
「スーパーけんじラン」好評配信中!
 
↓↓↓↓↓↓↓↓↓↓↓↓

 
・公式サイトはこちらから
http://okamotodo.jimdo.com/

最新トラックバック

アクセスカウンター

オンラインカウンター

現在の閲覧者数:

検索フォーム

ブロとも申請フォーム

QRコード

QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。