2006年05月31日

HSPでDirectXを使う 第3回 スプライトを学ぶ

1,2回目でDirectXでの描画を行いました。
これは標準命令でやってた描画を、ただシンプルにdirectXで描画しただけのものでした。

今までどおりのゲームの作り方をし、速度向上だけが目的ならばそれで十分だと思います。

しかし、DirectXを使うと、スプライトという便利な機能があるようです。

それを使うと、キャラクターの管理が圧倒的に楽になるそうです。

ただ、ここ数日いじくってみて思ったことは、最初はわけがわからずにとっつきにくいかもしれません。

スプライトを使うと、今までのようにgcopyで座標を指定して描画、という様なことはしません。

画像表示までの過程が以下の3つになります。

1.es_sizeで切り取る画像の大きさ、当たり判定の大きさを指定して、

2.es_patでキャラクタNoと切り取る画像の始点を教えてあげる。

ここまでがキャラクタNoの登録となります。

3. es_setでスプライトNoをつけてあげ、画面表示座標を教えてあげ、実際に画面に配置

という流れになります。

作業が増えて面倒だなあ。
と思うかもしれませんが、後々楽になるために最初に少し苦労をするんだ。と思ったほうが良いでしょう。

下に図を書きます。
キャラクタNoとスプライトNoってこんなイメージだと思います。

sp.jpg
posted by BS びーえす | 🌁 | Comment(0) | TrackBack(0) | HSPでDirectXを使う | このブログの読者になる | 更新情報をチェックする

2006年05月23日

HSPでDirectX 第2回

2回目は実際にキャラを動かしてみましょう。
stickを使う際に気をつけなければいけないのが、
stick p1,p2,p3
3つめのパラメーターが重要です。

これを省略してプログラムを動かしてみて、あれれ?なんでキー入力を受け付けないんだ!?
と詰まることになりますので。

stickの説明文には以下の様に書いてあります。

「p3が1か省略された場合は、HSPウィンドウがアクティブでない場合にはキー入
力が無効になります。
p3が0の場合は、すべての状況下でキー入力を行ないます」

ということはフルスクリーンでDirectXを起動するとアクティブじゃないのか??

以下はプログラム部分です。
メインの部分載せています。

;■ メインルーチン
*main
es_cls

stick a,15,0
;左キー処理
if (a&1):px--
;右キー処理
if (a&4):px++
;上キー処理
if (a&2):py--
;下キー処理
if (a&8):py++

pos px,py
gmode 2,64,64 : es_copy 0,64,64
await 0
es_sync 30
//ESCキーで終了
getkey key,27 : if key==1 : end
goto *main


起動するときに、キー入力が若干反応するまで時間がかかりますがそれは今後調べてみます。

ソースファイルです。
directX02.zip
posted by BS びーえす | ☁ | Comment(0) | TrackBack(0) | HSPでDirectXを使う | このブログの読者になる | 更新情報をチェックする

2006年05月21日

HSPでDirectX 第一回

アクションゲーム作成は続けながらも、DirectXにも手を出してみようかと思います。
なので、「HSPでDirectXを使う」というカテゴリを追加しました。





アクションゲームを作っていて、HSPの標準命令だけでは結構つらいものがあるんじゃないかと思い始めてきました。
もちろん、工夫次第で速度向上も可能でしょうけども、どうしても気になった点は

・他のPCでソフトを動かすと動作速度がかなり異なる。(await命令を使ってるがだめ)

というところが大きいです。
あとはやはり

・少しでかめの画像を使うとかなりのCPU負担になってしまう。

というところでしょうか。

悩みながらHSPのことを調べていたら、DirectXというものが使えることがわかりました。
これはグラフィックボードのメモリを使用したりして通常命令とは比べ物にならないくらい高速描画ができるようです。

というわけで、早速ソースをあちこちから拾ってきて最小限の表示部分を作ってみました。

#include "hspdx.as"

;■ DirectX 初期化&チェック
es_ini
es_screen 640,480,16,0
if stat=1 : goto *dxerr1
if stat=2 : goto *dxerr2

;■ バッファへ画像の読みこみ
buffer 2,640,480,0 ;バッファ作成
pos 0,0 : picload "walk.bmp";バッファへ読み込み
es_buffer 0 ;オフスクリーンバッファへの転送
if stat=1 : goto *dxerr3 ;成否判定

gsel 0
goto *main

*dxerr1
dialog "DirectXの初期化に失敗しました。",1 : end
*dxerr2
dialog "スクリーンの初期化に失敗しました。",1 : end
*dxerr3
es_bye : wait 100
dialog "VRAMの容量が不足しています。",1 : end

;■ メインルーチン
*main
es_cls
; いろいろな処理
gmode 0,64,64 : es_copy 0,64,64
color 0,0,255
pos 200,100
es_boxf 0,0,50,50

await 0
es_sync 30
//ESCで終了
getkey ky,27 : if ky==1 : end
goto *main

とここまでです。

それでは解説します。

今回は、HSP標準命令で描画していたものをDirextXで描画すると命令がどう変わるかといった内容になっております。

まず最初に、HSPでバッファ(仮想画面)というのがありましたが、これはdirectXではそのままではつかえません。
DirectX側にも仮想画面があって、まず最初にバッファ内容をそこに転送してあげなければなりません。

上記の例ではバッファ番号2番の内容をDirectXで使用するためにDirectX側の仮想画面0番に転送しています。
そして、DirectX側の仮想画面の内容を描画する命令は

gmode 0,64,64 : es_copy 0,64,64

gmodeで画像を切り取るサイズ、そしてes_copyで始点x,yを選択してあげます。この二つはセットになってきます。

以上までが描画処理となっております。

そのほかのエラー処理とかはもうあんまり考え込まないでください。雛形みたいなものです。コピペでOKだと思います。
力を入れなくて良いところに力を入れて、あー難しいなあこりゃ。
となってあきらめるともったいないので。

ソースと画像ファイルのセットです
DirectX-01.zip
posted by BS びーえす | ☔ | Comment(0) | TrackBack(0) | HSPでDirectXを使う | このブログの読者になる | 更新情報をチェックする