set系命令の動作
HSP3.6目次
オブジェクトノードの表示
サンプルを触ってみれば、ノードオブジェクトの表示方法までは理解できたと思います。 次は表示したノードを動かいたいですね。物理エンジンを使えば簡単そうですが、 まずは物理エンジンを使わない移動から試してみます。
基本はset系命令を使用することになります。set系が理解できれば、add系は加算なので説明は特に不要だと思います。
SET系命令のサンプル
アヒルの素材を使用します。hgimg4のsampleフォルダからresフォルダをフォルダごとコピーして、作業フォルダに置いて下さい。 サンプルスクリプトを作業フォルダに置いて実行します。
#include "hgimg4.as"
title "HGIMG4 set系"
gpreset
setcls CLSMODE_SOLID, $404040
setcolor GPOBJ_LIGHT, 1,1,1 ; ライトカラーを設定
setdir GPOBJ_LIGHT, 0.5,0.5,0.5 ; アンビエントカラーを設定
gpload id_model,"res/duck" ; モデル読み込み
mdx= 10 : mdz = 13 ; X,Z方向の個数
px = 20.0/mdx : pz = 20.0/mdz ; 間隔を計算する
z = -10.0 ; 配置開始Z座標
dim id_clone, mdx * mdz
idx = 0
i = -1
repeat mdz
x=-10.0 ; 配置開始X座標
repeat mdx
if i<0 {
i=id_model
} else {
gpclone i, id_model ; 最初のモデル以降はクローン
}
setpos i, x,0,z
x+=px
id_clone(idx) = i
idx++
loop
z+=pz
loop
gpfloor id_floor, 40,40, $00ffff ; 床ノードを追加
setpos GPOBJ_CAMERA, 0,30,20 ; カメラ位置を設定
; ==========================================================================
;ノード回転を設定
r = 0.0
ir = 0.0
zm = 0.5
d = 0.0
w = 1
repeat 10
; ノード回転 ラジアン
setang id_clone(cnt ), r, 0, 0 ; X軸回転
setang id_clone(cnt+10), 0, r, 0 ; Y軸回転
setang id_clone(cnt+20), 0, 0, r ; Z軸回転
r += deg2rad(36)
; ノード回転 0~255
setangr id_clone(cnt+30), ir, 0, 0 ; X軸回転
setangr id_clone(cnt+40), 0, ir, 0 ; Y軸回転
setangr id_clone(cnt+50), 0, 0, ir ; Z軸回転
ir += 25.5
; ノード倍率
setscale id_clone(cnt+60), zm, 1.0, 1.0 ; X軸
setscale id_clone(cnt+70), 1.0, zm, 1.0 ; Y軸
setscale id_clone(cnt+80), 1.0, 1.0, zm ; Z軸
zm *= 1.2
; 移動ベクトル(自動移動)
; 自動移動を行なう設定が別途必要です。
setdir id_clone(cnt+90), d, 0, 0
setobjmode id_clone(cnt+90), OBJ_MOVE, 0 ; 自動移動を行なう(XYZ移動量を参照する)
d += 0.01
; ワーク値
; ユーザーが自由に設定できる項目なので、表示には影響がない。
setwork id_clone(cnt+100), rnd(10), rnd(10), 0.1*rnd(10)
setwork2 id_clone(cnt+110), rnd(10), rnd(10), 0.1*rnd(10)
; ノードRGBカラー
; テクスチャが貼ってあるので反映されません。
setcolor id_clone(cnt+120), r, 256.0, 255.0 ; X軸回転
loop
; ==========================================================================
repeat
stick key,15
if key&128 : end
redraw 0 ; 描画開始
; カーソルキーでカメラ位置を動かす
if key&1 : addpos GPOBJ_CAMERA, -1, 0, 0
if key&4 : addpos GPOBJ_CAMERA, 1, 0, 0
if key&8 : addpos GPOBJ_CAMERA, 0, 1, 0
if key&2 : addpos GPOBJ_CAMERA, 0,-1, 0
gplookat GPOBJ_CAMERA, 0,0.3,0 ; カメラから指定した座標を見る
addang id_model, 0, 0.02 ; ノード回転(Y軸回転)
gpdraw ; シーンの描画
; ==========================================================================
; 描画命令
color
boxf 0, 30, 500, 110
boxf 0, 30, 70, 170
color 200,200,200
; ノードワーク値
getwork id_clone(100),x,y,z
pos 10, 30
mes "ノードワーク値 " + x + ", " + y + ", " + z
getwork2 id_clone(110),x,y,z
mes "ノードワーク値2 " + x + ", " + y + ", " + z
; ノードRGBカラーを取得
getcolor id_clone(120),x,y,z
mes "ノードRGBカラー " + x + ", " + y + ", " + z
getcolori id_clone(120),x,y,z
mes "ノードRGBカラー " + x + ", " + y + ", " + z
mes "↑y"
mes "├→x"
mes "↓z"
; ==========================================================================
color 255,255,255
pos 8,8:mes "HGIMG4 sample"
redraw 1 ; 描画終了
await 1000/60 ; 待ち時間
loop
実行すると、アヒルがたくさん並んで表示されます。13行×10匹。 1行ごとに同じ命令で、異なるパラメータを設定しています。各行の命令は次の通り。
- ノード回転 X軸回転(ラジアン)
- ノード回転 Y軸回転(ラジアン)
- ノード回転 Z軸回転(ラジアン)
- ノード回転 X軸回転(0~255)
- ノード回転 Y軸回転(0~255)
- ノード回転 Z軸回転(0~255)
- ノード倍率 X方向拡大
- ノード倍率 Y方向拡大
- ノード倍率 Z方向拡大
- 自動移動 X方向
- ワーク値
- ワーク値2
- ノードRGBカラー
hgimg4の座標系は、右手系です。サンプルの画面で言えば、+Xが画面右手方向、+Yが上方向、+Zが画面手前側方向です。
回転は、右ねじ方向。右手でサムズアップ、親指を軸の+方向に向けたとき、人差し指から小指が向いている方向が回転のプラス方向です。 上から6行までが回転なので見比べて確認してください。
ノード倍率は、ノードを拡大するだけなので特に問題はなさそうですね。潰れているようにも見えますが、これは一つの方向にだけ拡大しています。
自動移動
自動移動を設定すると、メインループ内で特に何もしなくてもフレーム毎に一定速度で移動してくれます。
自動移動は、setdir
命令でパラメータを設定しただけでは動きません。
setobjmode
命令でOBJ_MOVE
(自動移動を行なう(XYZ移動量を参照する))オプションを有効にする必要があります。
HDLには、まだ説明が記載されていないので、詳細はプログラミングガイドを参照してください。
→オブジェクトのモード設定 - HGIMG4プログラミングガイド( https://www.onionsoft.net/hsp/v36/doclib/hgimg4.html#MODE_OBJ )
移動速度を確認するサンプルも作ってみました。
#include "hgimg4.as"
title "HGIMG4 自動移動"
gpreset
setcls CLSMODE_SOLID, $404040
setcolor GPOBJ_LIGHT, 1,1,1 ; ライトカラーを設定
setdir GPOBJ_LIGHT, 0.5,0.5,0.5 ; アンビエントカラーを設定
gpload id_model,"res/duck" ; モデル読み込み
pz = 10.0 ; 間隔
z = -5.0 ; 配置開始Z座標
gpclone id_clone, id_model ; クローン
setpos id_model, -10.0, 0, z
setpos id_clone, -10.0, 0, z+pz
gpfloor id_floor, 40,40, $00ffff ; 床ノードを追加
setpos GPOBJ_CAMERA, 0,20,20 ; カメラ位置を設定
; ==========================================================================
; 移動ベクトル(自動移動)
; 自動移動を行なう設定が別途必要です。
setdir id_clone, 0.1, 0, 0
setobjmode id_clone, OBJ_MOVE, 0 ; 自動移動を行なう(XYZ移動量を参照する)
; ==========================================================================
; カメラを真上に設置
setpos GPOBJ_CAMERA, 0.0, 30.0, 0.1
gplookat GPOBJ_CAMERA, 0.0, 0.0, 0.0
x = -10.0
repeat
stick key,15
if key&128 : end
redraw 0 ; 描画開始
; ==========================================================================
; 手動で移動と自動移動を比較
; 毎フレームごとに移動する速度と自動移動で設定した速度は同じ。
x += 0.1
setpos id_model, x, 0, 0
; ==========================================================================
gpdraw ; シーンの描画
color 255,255,255
pos 8,8:mes "HGIMG4 sample"
redraw 1 ; 描画終了
await 1000/60 ; 待ち時間
;await 1000/60*2 ; 待ち時間を変えても速度が変わらない
;await 1000/60/2 ; 待ち時間を変えても速度が変わらない
loop
setdir
で設定した数値分だけ、フレームごとに移動するようです。
自動移動を使わない場合は、この例のように毎フレームsetpos
命令で動かす必要があります。
ワーク値
ワーク値とワーク値2は、ユーザーが自由に使用できる領域です。X,Y,Z情報として使えば、ワーク値は2つあるので2点分の座標を格納できます。 また、6個の実数型変数と見なせば、アイテムボックスとして使ったりキャラクターのステータスを格納することにも使えます。
6個もあるので直接使っても十分余裕があると思います。もし足りないようであれば、 別に用意した配列変数のインデックスとして使用すれば、無制限に情報を格納することができますね。
ノードRGBカラー
サンプルとして使用しているオブジェクトノード(アヒル)には、テクスチャが貼り付けてあるので色を変えてもわかりませんね。 これはまたの機会に確認することにします。