- SHIORI - チュートリアル

組み合わせ応用01 ステージカウンタを表示する


0.テーマ設定

 今回は、組み合わせ応用の第1弾ということで、まずはステージカウンタを画面に表示してみます。
 ステージカウンタが表示できると、ゲームのイベント発生時のタイミングを画面で確認できたり、敵の出現のタイミングを測れたりするので、非常に便利です。

右上のがステージカウンタ。
数値は、1フレームごとにどんどん上がっていきます。
ちなみに、表示されてる自機は動きません。


1.実現するための手順

 以下で使用する各種コマンドの詳細説明は、ここではしません。 各個別の項目に関する説明は、チュートリアルの01〜06までを参照してください。

 ステージカウンタを画面に表示するには、以下の手順を踏みます。

  1. 数字の絵を用意する。
  2. その『数字』の画像を使って、『数字オブジェクト』を作る。
  3. 作った数字オブジェクトを画面上に配置する。

以上です。
もう少し詳細に説明すると、以下の手順になります。

  1. 数字『0』〜『9』の絵を描いたビットマップを用意する。
    (このとき、数字は全て1枚のビットマップ上になければならない。)
  2. 数字を描いたビットマップを - SHIORI - に読み込ませるための設定を、config.hrn に記述する。
  3. 数字『0』〜『9』までの画像をスプライトとして登録するための設定を、config.hrn に記述する。
    このとき、スプライトのページ番号が0〜9に対応するようにする。
    つまり、数字のビットマップに対しては、『0』〜『9』の絵を必ず先頭に登録する。
  4. 『数字』の特性を定義する。設定は、prop.hrn に記述する。
  5. 作成した『数字』の特性を用いて、数値オブジェクトを画面上に出現させる。
    ステージ初期化時に、ステージイベントとして出現させるのが良いでしょう。

以上です。


2.じゃ、書いてみよっか。

 とりあえず、チュートリアル ステップ03の最初の状態のデータをベースにして、それに対して、今回の目的のオブジェクトを付け加えていきます。

 ステップ03の最初の状態は、

これです。
真ん中に自機がいるだけ。 こいつの右上に、ステージカウンタを表示します。

 

1.数字のビットマップを用意する

 まずは、『数字』の絵を描いたビットマップを用意します。 ここでは、こんな絵を用意してみました。

用意したというか、ZOUNDSの絵をそのまま持ってきただけですが。
今回使うのは、上に描いてある『0』〜『9』までのみです。 下のカプセルの絵は使用しません。

 

2.数字の絵を、- SHIORI - に読み込ませるための設定を記述する

 1で用意した絵を読み込ませます。
 設定は、config.hrn に記述します。

# ----------------------------------------------------------------
#     - SHIORI -   コンビネーション01
# ----------------------------------------------------------------

# 描画デバイス設定
&SetLayers( 5 )


# ====================
#   ビットマップ登録
# ====================
#
# <<< 自機 >>>
&RegistBitmap	JIKI , ( 'combo01/bmp/jiki.bmp' , 0 )

# <<< 背景 >>>
&RegistBitmap	SPACE , ( 'combo01/bmp/space.bmp' , 0 )

# <<< 数字 >>>
&RegistBitmap	NUMBER , ( 'combo01/bmp/bluenum.bmp' , 144 )


# ======================
#   パレットの読み込み
# ======================
&RegistRQPalet MAINPALETTE ( 'combo01/bmp/zounds.rq' , 0 , 255 )


# ==================
#   スプライト登録
# ==================

# <<< 自機 >>>
&RegistSprite	JIKI (  0,0 , 32-1,32-1 ) , ( 32/2,32/2 )
&RegistSprite	JIKI ( 32,0 , 64-1,32-1 ) , ( 32/2,32/2 )
&RegistSprite	JIKI ( 64,0 , 96-1,32-1 ) , ( 32/2,32/2 )

# <<< 数字 >>>
&DefInt	i = 0
&For( $i=0 , $i<10 , $i=$i+1 ){
	&RegistSprite	NUMBER ( 32*$i,0 , (32*($i+1))-1,31 ) , ( 32/2,32/2 )
}


# ====================
#   グラフィック登録
# ====================
&RegistGraphic SPACE ( 0,0 ) , ( 640,480 )

 赤く書いたところですね。 ここで、画像を読み込ませます。

 

3.数字の画像のビットマップに対して、スプライトを定義する

 数字のビットマップの先頭から、『0』〜『9』の絵を表示するスプライトを定義します。

 以降で説明する『数字オブジェクト』では、表示する数字の絵を、スプライトのページ番号と対応させて処理します。 ですから、絵に描かれた数字と、スプライトのページ番号を一致するようにしておいてください。
 まぁ要するに、先頭に『0』から『9』を定義すればOKです。

 具体的な記述は、以下の赤く書かれた部分です。 設定は、config.hrn に記述します。

# ----------------------------------------------------------------
#     - SHIORI -   コンビネーション01
# ----------------------------------------------------------------

# 描画デバイス設定
&SetLayers( 5 )


# ====================
#   ビットマップ登録
# ====================
#
# <<< 自機 >>>
&RegistBitmap	JIKI , ( 'combo01/bmp/jiki.bmp' , 0 )

# <<< 背景 >>>
&RegistBitmap	SPACE , ( 'combo01/bmp/space.bmp' , 0 )

# <<< 数字 >>>
&RegistBitmap	NUMBER , ( 'combo01/bmp/bluenum.bmp' , 144 )


# ======================
#   パレットの読み込み
# ======================
&RegistRQPalet MAINPALETTE ( 'combo01/bmp/zounds.rq' , 0 , 255 )


# ==================
#   スプライト登録
# ==================

# <<< 自機 >>>
&RegistSprite	JIKI (  0,0 , 32-1,32-1 ) , ( 32/2,32/2 )
&RegistSprite	JIKI ( 32,0 , 64-1,32-1 ) , ( 32/2,32/2 )
&RegistSprite	JIKI ( 64,0 , 96-1,32-1 ) , ( 32/2,32/2 )

# <<< 数字 >>>
&DefInt	i = 0
&For( $i=0 , $i<10 , $i=$i+1 ){
	&RegistSprite	NUMBER ( 32*$i,0 , (32*($i+1))-1,31 ) , ( 32/2,32/2 )
}


# ====================
#   グラフィック登録
# ====================
&RegistGraphic SPACE ( 0,0 ) , ( 640,480 )

 NUMBER というビットマップ画像に対し、(32x32)の大きさの画像を順番に登録しているのが分かりますでしょうか。
 ここでは、&For 文を使用しています。 この記述は、割と多用することになりますので、覚えておくと良いでしょう。

 

4.数字オブジェクトの特性を記述する

 3までのステップで、ゲームにカウンタを組み込むための材料は全て揃いました。 この材料を使って、数字オブジェクトの特性と定義します。

 特性は、以下のようになります。

# ================================================================================
#   ステージカウント
# ================================================================================
&DefineNumber( STAGE_COUNT , 0,0,2 ){

	# -----< 属性 >-----
	#
	&Axis			( X , Y )					# オブジェクトの座標系

	&InitialNumber{
		SUBJECT		= STAGECOUNT
		INDEX		= 0
		COEFFICIENT	= 1
		SPACING		= ( 32 , 0 )
	}

	&NumberColumns{
		COLUMNS		= 10
		FILLZERO	= FALSE
	}

	# -----< 描画レイヤー指定 >-----
	#
	&Draw( 0 ){
		# 配列指定
		DIMENSION	= 1
		VALUES		= {
			( 0 , 1 )
		}
	}

	# -----< 描画パターン指定 >-----
	#
	&Draw( 1 ){
		# 配列指定
		DIMENSION	= 1
		VALUES		= {
			( BMP( NUMBER ) , 1 )
		}
	}

	# -----< ポインタ関連 >-----
	#
	&DrawPointer	( 0 , LAYER )		# 0 番目のラインを描画レイヤーとして認識するポインタ
	&DrawPointer	( 1 , CHARMATRIX )	# 1 番目のラインをパターンとして認識するポインタ
}

 殆どの部分が、自機や敵などの一般的な特性定義と変わらないことが分かると思います。
 注目すべき点は、上の方のコマンド2つと、最後の、描画ポインタのタイプ指定のみです。

&InitialNumber

 ここでは、この『数字オブジェクト』で、何の値を表示するかを定義します。

 ここでは、SUBJECT行に STAGECOUNT を指定しています。 これにより、ここで定義した特性を用いて作られたオブジェクトは、ステージカウンタを画面に表示するようになります。

 INDEX行は、ここでは意味がありません。 STAGECOUNT には INDEX が必要無いからです。 これが、たとえば PARAM の値だったりすると、INDEX を適切に設定してやる必要があります。

 COEFFICIENT行は、通常は1ですね。

 SPACING行では、一つの数字の絵が32*32のサイズなので、横方向に32ピクセルぶん字送りするようにしてあります。

 

&NumberColumns

 前の &InitialNumber で『何を表示するか』を定義したのに対し、こちらでは『どのように表示するか』を指定します。

 ここでは、COLUMNS で10ケタの数字を画面に表示するように指定しています。
 また、FILLZERO で、数値の最上位ケタが第10ケタ目でないような場合、先頭を0で補完しないようにしています。

 つまり、10ケタで32という値を表示するような場合、画面上に『0000000032』と出るのではなく、『        32』と表示される、ということです。 後者の方が自然ですが、たまに前者の表示方法を使うこともあるでしょう。

 

&DrawPointer

 最後に、描画ポインタのタイプ指定を変更します。
 通常、単にスプライトを表示する場合には、第2引数には「PATTERN」を指定します。
 しかし、数字オブジェクトを使用する場合は、通常の「PATTERN」ではなく、少し特殊な「CHARMATRIX」を使用します。

 CHARMATRIX というのは、通常のスプライトのような『1キャラクタあたり1スプライト』の描画パターンではなく、複数のスプライトをひとまとめにして取り扱うための指定タイプです。
 これは、今のところ Number オブジェクトと、RString オブジェクトでのみ使用されます。

※RStringオブジェクトに関しては、後述します。

 

以上で、特性定義は終了です。
要するに『何を表示するか』,『どのように表示するか』,『どれを使って表示するか』を決めたワケです

 

5.画面上に出現させる

 ここまで来たら、あとはもう簡単です。
 ステージ初期化時のイベントで、出現要求を指定してやります。
 既に comset.hrn 内に記述してある、初期化用コマンドセットに、上で作った特性で数字オブジェクトを出現させるコマンドを追加します。
 記述は、以下のようになります。

#---------------------------------------------------------------------
#   - SHIORI - 組み合わせ応用01
#---------------------------------------------------------------------

#----------< 一般設定 >----------
#
&SetDimension	2

#----------< コマンドセット構築 >----------
#
# ====================================================================
#   ステージの初期化
# ====================================================================
# -----< 初期化開始 >-----
#
&CountEvent( INITIALIZE_STAGE ){
	COUNT = 0
} , REFLECT_PALETTE

# -----< パレットを適用する >-----
#
&ReflectPalette( REFLECT_PALETTE ){
	PAGE		= MAINPALETTE
	STARTINDEX	= 0
	ENDINDEX	= 255
	TARGETPAGE	= SCREENPALET
	TARGETINDEX	= 0
} , REQUEST_GRP

# -----< 背景グラフィックの出現 >-----
#
&RequestGRP( REQUEST_GRP ){
	OBJECT			= SPACE
	ATTRIBUTE = {
		EXIST		= TRUE
		POS			= ( 0,0 )
	}
} , REQUEST_JIKI

# -----< 自機の出現 >-----
#
&RequestJiki( REQUEST_JIKI ){
	OBJECT			= JIKI
	ATTRIBUTE = {
		EXIST		= TRUE
		POS			= ( 320*64,320*64 )
	}
}
, REQUEST_STAGE_COUNT

&RequestNumber( REQUEST_STAGE_COUNT ){
	OBJECT	= STAGE_COUNT
	ATTRIBUTE = {
		EXIST		= TRUE
		POS			= ( 64*320 , 64*32 )
	}
}


&JoyButtonPressedEvent( TAKE_SCREEN_SHOT ){
	BUTTON = 31
} , DO_TAKE_SCREEN_SHOT

&SaveScreenShot( DO_TAKE_SCREEN_SHOT )

 赤い文字で表示した部分が、その部分です。 他のオブジェクトと違う所はなにも無いので、問題無いでしょう。


3.動かしてみよう。

 じゃ、うごかしてみましょう。
 右上に数字が表示されたと思います。 ガンガン値が上がっていくことが分かります。 ステージカウンタとは、こういうものです。 何もしなくても、1フレームあたり1ずつ、値がインクリメントされていきます。


サンプルスクリプトのダウンロード