自機を画面に出す

 画面に自機の絵を描きます。

 1.仮想画面に絵のファイルを読み込む
 2.画面をクリアする
 3.指定した位置に自機の絵を描く

仮想画面について

 HSPでは、メモリ上に画面を何枚も持つことができます。それぞれの画面には0から始まる番号がつきます。0番だけが実際の画面で、他は仮想画面といいます。これは、主に絵のファイルを読み込んでおくために使われます。これから実際の画面にコピーすることによって絵を出します。
 複数の画面

 1.仮想画面に絵のファイルを読み込む

 こんな絵のファイルを用意しました。横32ドット×縦32ドットの、samplecg.bmpというファイルです。

  絵のファイル

 これを1番の仮想画面に読み込みます。
    ddgsel 1
    exist "samplecg.bmp"
    if strsize = -1 {
        end
    }
    sdim buf, strsize
    bload "samplecg.bmp", buf, strsize
    ddloadmemory buf, 2

ddgsel 1
 これから操作する画面は1番だよ、と指定します。

exist "samplecg.bmp"
 フォルダ内にsamplecg.bmpというファイルがあるか確認します。

if strsize = -1 {
    end
}

 もしsamplecg.bmpがなかったらプログラムを終了させます。
 strsizeは、システム変数と呼ばれるものです。普通の変数は自分で勝手に名前をつけ、用途を決めていいのですが、初めから用途も名前も決まっている変数をシステム変数と呼びます。exist命令を実行すると、ファイルのサイズがシステム変数strsizeに代入されます。ファイルが存在しなかったら、-1が代入されます。
 endは、プログラムを終了させる命令です。プログラムの1番下ではなく、途中で終わらせたい場合はend命令を使います。

sdim buf, strsize
 変数bufは、ファイルサイズと同じ大きさの変数であると宣言します。(変数buf用に、メモリ上にファイルサイズと同じバイト数の領域を確保します。)

bload "samplecg.bmp", buf, strsize
 変数bufに、samplecg.bmpの内容を読み込みます。第3引数には、ファイルのサイズを指定します。

ddloadmemory buf, 2
 bufの内容をddgselで指定した画面に読み込みます。第2引数は、画面の作成先をビデオメモリにするかシステムメモリにするか選ぶものですが、ddscreen命令と同様、2を指定するのがいいと思います。


サブルーチン

 同じような処理をする箇所がいくつもある場合、これを1つにまとめると便利です。その処理を1つのまとまった塊とし、メインとなる処理とは分けるのです。これをサブルーチンと呼びます。サブルーチンに対して、メインとなる処理をメインルーチンと呼びます。サブルーチンはメインルーチンからgosub文で呼ばれます。これはgoto文と同じで、指定したラベルの場所に飛ぶのですが、サブルーチンのreturn文によって、呼んだ場所に戻る点が違います。
  サブルーチン


 2.画面をクリアする

 これは、「タイトルを表示する」で説明したのと同じ処理です。ここで、サブルーチン化しておくことにします。
        gosub *Clear_Screen

    *Clear_Screen
        ddcolor 0,0,0
        ddboxf 0,0,640,480
        return

 3.指定した位置に自機の絵を描く

 自機の初期位置を(304,416)に設定します。自機の座標は変数playerx,playeryに入れることにします。
    playerx=304
    playery=416
 これは自機の左上隅の座標です。
 位置を指定します。
    ddpos playerx,playery
 絵のファイルで、コピーする元の画像の矩形領域を指定します。
    ddsetrect 0,0,32,32
 0,0はファイル中の(1番の画面の)、自機の左上隅の座標です。32,32は横サイズ、縦サイズ(ドット数)です。
 自機の形に切り取ってコピーすることはできません。四角形で切り取ります。しかし、元の絵の黒い部分(赤、緑、青成分がすべて0)は透明色とみなされます。この部分には、背景がそのまま表示されます。
 コピーします。
    ddgcopy 1
 1番の画面から、ddsetrectで選択した領域を、現在ddgselで指定されている画面の、ddposで指定した位置にコピーします。なお、タイトル表示の処理の所でddgsel 0をやっておくことにします。


 以上をふまえて、前のプログラムを書き直します。

	; プログラム起動時の初期設定
	#include "hmm.as"

	title "ABOGADRO"
	diinit
	ddinit
	ddscreen 640,480,1,2
	; 仮想画面1に自機の絵を読み込む。
	ddgsel 1
	exist "samplecg.bmp"
	if strsize = -1 {
		end
	}
	sdim buf, strsize
	bload "samplecg.bmp", buf, strsize
	ddloadmemory buf, 2

	; タイトル表示
	await 16
	ddgsel 0
	gosub *Clear_Screen
	ddcolor 255,0,0
	font "MS 明朝",32
	ddpos 232,100
	ddprint "ABOGADRO"
	ddcolor 255,255,255
	font "MS 明朝",16
	ddpos 248,400
	ddprint "Push Ctrl Key"
	ddredraw

	; Ctrl Keyが押されるのを待つ
*Wait_Ctrl
	await 16
	digetkeystate k,0
	if k!256 {
		goto *Wait_Ctrl
	}

	; ステージスタート時の初期設定
	playerx=304
	playery=416

	; 自機を描画
	gosub *Clear_Screen
	ddpos playerx,playery
	ddsetrect 0,0,32,32
	ddgcopy 1
	ddredraw

	stop

	; 画面をクリアする
*Clear_Screen
	ddcolor 0,0,0
	ddboxf 0,0,640,480
	return

[プログラムと絵をダウンロード]
※Thumbs.dbというファイルが含まれていることがありますが、これは関係ありません。どうも、勝手にできてしまうようです。

ひとくちメモ:
・サブルーチンについての補足
 1回しか呼ばない処理でも、それが1つのまとまった役割をもつものであることを明確にするために、サブルーチン化した方がプログラムが見やすくなるかもしれません。役割ごとにサブルーチン化すべきか、1回しか呼ばないのであればメインルーチンの中に書いてしまえばよいのかは、人によって意見が分かれる所かと思います。
 
・絵のファイルって、どうやって用意するの?
 お絵かきソフトを使って下さい。ゲームのキャラクタのようなドット単位に色づけしていく作業に向いているソフトとしては、例えばALFARがあります。
 
・黒色を使いたい時にはどうしたらいいの?
 黒は透明色として扱われると書きましたが、黒色を使いたい時には赤、緑、青成分のどれかを1にした色を使って下さい。完全な黒と、ほとんど見分けがつきません。

[目次へ][前へ][次へ] inserted by FC2 system