今回は、組み合わせ応用の第1弾ということで、まずはステージカウンタを画面に表示してみます。
ステージカウンタが表示できると、ゲームのイベント発生時のタイミングを画面で確認できたり、敵の出現のタイミングを測れたりするので、非常に便利です。
右上のがステージカウンタ。
数値は、1フレームごとにどんどん上がっていきます。
ちなみに、表示されてる自機は動きません。
以下で使用する各種コマンドの詳細説明は、ここではしません。 各個別の項目に関する説明は、チュートリアルの01〜06までを参照してください。
ステージカウンタを画面に表示するには、以下の手順を踏みます。
以上です。
もう少し詳細に説明すると、以下の手順になります。
以上です。
とりあえず、チュートリアル ステップ03の最初の状態のデータをベースにして、それに対して、今回の目的のオブジェクトを付け加えていきます。
ステップ03の最初の状態は、
これです。
真ん中に自機がいるだけ。 こいつの右上に、ステージカウンタを表示します。
まずは、『数字』の絵を描いたビットマップを用意します。 ここでは、こんな絵を用意してみました。
用意したというか、ZOUNDSの絵をそのまま持ってきただけですが。
今回使うのは、上に描いてある『0』〜『9』までのみです。 下のカプセルの絵は使用しません。
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 ) |
赤く書いたところですね。 ここで、画像を読み込ませます。
数字のビットマップの先頭から、『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
文を使用しています。 この記述は、割と多用することになりますので、覚えておくと良いでしょう。
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つと、最後の、描画ポインタのタイプ指定のみです。
ここでは、この『数字オブジェクト』で、何の値を表示するかを定義します。
ここでは、SUBJECT行に STAGECOUNT を指定しています。 これにより、ここで定義した特性を用いて作られたオブジェクトは、ステージカウンタを画面に表示するようになります。
INDEX行は、ここでは意味がありません。 STAGECOUNT には INDEX が必要無いからです。 これが、たとえば PARAM の値だったりすると、INDEX を適切に設定してやる必要があります。
COEFFICIENT行は、通常は1ですね。
SPACING行では、一つの数字の絵が32*32のサイズなので、横方向に32ピクセルぶん字送りするようにしてあります。
前の &InitialNumber で『何を表示するか』を定義したのに対し、こちらでは『どのように表示するか』を指定します。
ここでは、COLUMNS
で10ケタの数字を画面に表示するように指定しています。
また、FILLZERO
で、数値の最上位ケタが第10ケタ目でないような場合、先頭を0で補完しないようにしています。
つまり、10ケタで32という値を表示するような場合、画面上に『0000000032』と出るのではなく、『 32』と表示される、ということです。 後者の方が自然ですが、たまに前者の表示方法を使うこともあるでしょう。
最後に、描画ポインタのタイプ指定を変更します。
通常、単にスプライトを表示する場合には、第2引数には「PATTERN」を指定します。
しかし、数字オブジェクトを使用する場合は、通常の「PATTERN」ではなく、少し特殊な「CHARMATRIX」を使用します。
CHARMATRIX
というのは、通常のスプライトのような『1キャラクタあたり1スプライト』の描画パターンではなく、複数のスプライトをひとまとめにして取り扱うための指定タイプです。
これは、今のところ Number オブジェクトと、RString
オブジェクトでのみ使用されます。
※RStringオブジェクトに関しては、後述します。
以上で、特性定義は終了です。
要するに『何を表示するか』,『どのように表示するか』,『どれを使って表示するか』を決めたワケです
ここまで来たら、あとはもう簡単です。
ステージ初期化時のイベントで、出現要求を指定してやります。
既に 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 ) |
赤い文字で表示した部分が、その部分です。 他のオブジェクトと違う所はなにも無いので、問題無いでしょう。
じゃ、うごかしてみましょう。
右上に数字が表示されたと思います。 ガンガン値が上がっていくことが分かります。 ステージカウンタとは、こういうものです。 何もしなくても、1フレームあたり1ずつ、値がインクリメントされていきます。