DXを使ってみよう

早速DXを使ってみましょう。

当たり前ですが「#include "hspdx.as"」を一番初めに記述してくださいね。

DXの命令を使用する前に必ずes_iniでシステムの初期化を行ってください。

	es_ini
	if stat==1 : dialog "システムの初期化に失敗しました" : end

このes_ini命令を入れずにDX命令を使用してしまうとエラーで落ちてしまいます。

初めに書いておきますがこの講座は入門講座であって入門講座ではありません。

つまり命令のパラメータの説明を一つ一つ丁寧に説明することはないです。

よって先ほどのes_ini命令ですが、パラメータ(以下p)に設定する値は皆さんに任せます。

で次にes_screen命令ですが、指定する解像度は320*240か640*480(通常)でいいでしょう。

ヘルプにも書いていますがp4に3を指定するとウィンドウモードで起動しますので

実際に公開するときとかはp4に3を指定しないようにしてください。

ここでDXモードに問題なく突入できたかを必ずチェックするようにしてください。

問題なければ0が、DXの初期化に失敗すると1が、スクリーン初期化に失敗すると2がそれぞれstatに入ります。

このチェックで失敗したなら終了させるようにしてください。

そのまま続けてしまうと、落ちて危険な状態になってしまいます。

	es_screen 640,480,8,0
	if stat==1 : dialog "DirectXの初期化に失敗しました" : end
	if stat==2 : dialog "スクリーンの初期化に失敗しました" : end

さて、それでは画像を表示させるところから始めましょう。

この講座ではcharacter.bmpが必要です。コチラからダウンロードしてください。

HSP標準命令の画像系命令は使えないものが多いので、

ウィンドウと違って画像を表示させるだけでも最初は一苦労(?)でしょう…。

1.bufferに画像を貼り付ける(ロードする)
2.es_bufferでDXのオフスクリーンバッファに転送
3.gmodeでバッファの切り取り元位置を指定する
4.DXの画面に貼り付ける位置と大きさ(es_copy)を指定して貼り付け

	buffer 2,,,1
	picload "character.bmp"
	es_buffer 2,0,-1 ; p3に-1で完全な黒を透過
	if stat : es_bye : dialog "転送に失敗しました" : end
	gsel 0
	es_cls 255,255,255
	gmode 1,32,32
	pos 0,0 : es_copy 2,0,0
	es_sync

サンプルではes_bufferの時にまたまたチェックをしていますが、

転送元のバッファが大きすぎるとか、VRAMが不足しているとかで転送失敗する場合があり

自分のパソコンでは普通に動くが他のパソコンでは動かないこともありますのでチェックしてくださいね。

DX画面へ直接picloadできないし、gmodeとかちょっと命令の使用方法が変わっているので戸惑いますね。

gmode 透明の設定,横幅,高さ」と変わっており、p1に0を入れると不透明、1か2で透明となります。

DXでゲーム作成したい方は頑張って覚えてください。

新しい命令がたくさん増えますが、標準命令の命令名・パラメータが少し変わっただけのものがほとんどなので

命令の使い方さえ覚えてしまえば以前までと同じく簡単に使用できると思われます。

#include"hspdx.as"
#define SIZEX 32
#define SIZEY 32
	es_ini
	if stat==1 : dialog "システムの初期化に失敗しました" : end
	es_screen 640,480,8
	if stat==1 : dialog "DirectXの初期化に失敗しました" : end
	if stat==2 : dialog "スクリーンの初期化に失敗しました" : end
	buffer 2,,,1
	picload "character.bmp"
	es_buffer 2,0,-1
	if stat : es_bye : dialog "転送に失敗しました" : end
	gsel 0
	x=3 : y=2 ; 初期位置
	direction=3 ; キャラクターの向き
	repeat
	 if cnt\4=0 : cont=0
	 if cnt\4=1|(cnt\4=3) : cont=1
	 if cnt\4=2 : cont=2
	 es_cls 255,255,255
	 gmode 1,32,32
	 pos SIZEX/2*x,SIZEY*y : es_copy 2,cont*32,direction*32
	 es_sync 200
	 stick k,15
	 if k & 128 : end
	 if k & 1 : x- : direction=0 : if x < 0 : x=0
	 if k & 2 : y- : direction=1 : if y < 0 : y=0
	 if k & 4 : x+ : direction=2 : if x > 38 : x=38
	 if k & 8 : y+ : direction=3 : if y > 14 : y=14
	 await
	loop

上記の様にキャラクターを動かすやり方とかは標準のやり方とまったく同じですね。

ただ上記のやり方だと標準の場合でも言える事ですが

ウェイトの時間が長くてキーを押してもすぐには反応しませんよね。

だからといってウェイト時間を短くしてしまうとキャラクター動きが速くなってしまいます。

メインとなるループの中にループを入れてそこでキー判定をするなど各自工夫してください。