|
|
2010/12/22(Wed) 14:38:58|NO.36284
hgimg3において、2Dスプライトの描画基点は、カメラに影響されず、画面の中央になるのですが、
この基点をずらすなどして、画面全体をスクロールするにはどうしたら良いでしょうか。
正確なスクリーン上の座標を用いて高速に処理する必要があるので、
3D板ポリゴンに貼りつけて常にカメラの方向を向かせるような方法はとりたくありません。
動作としては、以下のスクリプトのようにしたいと思っています。
以下のスクリプトでは、全てのオブジェクトを個別に移動することによって、
擬似的にスクロールに見せかけていますが、これだとオブジェクトが増えた分だけ処理がかさんでしまいます。
;hgimg3結合
#include "hgimg3.as"
;スクリーン初期化
screen 0,320,240
title "hgimg 全体移動サンプル"
hgini
;バッファ生成
buffer 1, 32, 32
color 255,0,0
boxf
color 255,255,255
boxf 1,1,30,30
;テクスチャ生成
settex
TexID = stat
;モデル生成
addspr ModelID, 0, 0, 0, 31, 31, TexID
;オブジェクト生成
repeat 100
regobj ObjID( cnt ), ModelID
setpos ObjID( cnt ), -160 + rnd( 320 ), -120 + rnd( 240 ), 0.01 * rnd( 100 )
loop
;メインループ
repeat
hgdraw
allMove 0.2, 0.1
hgsync 16
loop
;全体移動命令(これじゃイヤ)
#deffunc allMove double _addX, double _addY
repeat 100
addpos ObjID( cnt ), _addX, _addY
loop
return
hgimg3において、2Dスプライトを全体スクロールする方法。
ひとりでは見つけられなかったので、どなたかご教授いただけると幸いです。
|
|
2010/12/22(Wed) 17:32:45|NO.36288
私見ですが、オブジェクトの座標と実際に描写する座標は分けて扱ったほうが良いと思います。
#enum X = 0
#enum Y
#enum Z
#define OBJMAX 100
#define SPEED 2
// オブジェクトの座標を格納する配列
dim objpos, OBJMAX, 2
// 擬似カメラの座標
dim cmrpos, 2
;hgimg3結合
#include "hgimg3.as"
;スクリーン初期化
screen 0,320,240
title "hgimg 全体移動サンプル"
hgini
;バッファ生成
buffer 1, 32, 32
color 255,0,0
boxf
color 255,255,255
boxf 1,1,30,30
;テクスチャ生成
settex
TexID = stat
;モデル生成
addspr ModelID, 0, 0, 0, 31, 31, TexID
;オブジェクト生成
repeat OBJMAX
regobj ObjID( cnt ), ModelID
objpos( cnt, X ) = -160 + rnd( 320 )
objpos( cnt, Y ) = -120 + rnd( 240 )
objpos( cnt, Z ) = 0
loop
// 擬似カメラ初期化
cmrpos( X ) = 0
cmrpos( Y ) = 0
cmrpos( Z ) = 0
;メインループ
repeat
// 矢印で擬似カメラの移動
getkey keyup, 38 : if keyup : cmrpos( Y ) -= SPEED
getkey keyright, 39 : if keyright : cmrpos( X ) += SPEED
getkey keydown, 40 : if keydown : cmrpos( Y ) += SPEED
getkey keyleft, 37 : if keyleft : cmrpos( X ) -= SPEED
getkey esc, 27 : if esc : end
// カメラの座標に合わせて描写する座標の更新
repeat OBJMAX
setpos ObjID( cnt ), objpos( cnt, X ) - cmrpos( X ), objpos( cnt, Y ) - cmrpos( Y ), objpos( cnt, Z ) - cmrpos( Z )
loop
// 描写
hgdraw
hgsync 16
loop
結局これも擬似的なスクロールに変わりないので解決にはなってませんけど。
| |
|
2010/12/22(Wed) 18:09:36|NO.36289
返信ありがとうございます。
自分も、標準命令(gcopyなど)で描画する場合はその方法をとっていました。
しかし画像処理に長けたhgimgなら、
自分が見落としているだけで、しっかりしたスクロール機能があるのではないかと思ったのです。
せめて親子化ができれば……親子化?
;hgimg3結合
#include "hgimg3.as"
;スクリーン初期化
screen 0,320,240
title "hgimg 全体移動サンプル"
hgini
;バッファ生成
buffer 1, 32, 32
color 255,0,0
boxf
color 255,255,255
boxf 1,1,30,30
;テクスチャ生成
settex
TexID = stat
;モデル生成
addspr ModelID, 0, 0, 0, 31, 31, TexID
;オブジェクト生成
;2次元カメラオブジェクト
regobj Camera2D, , OBJ_HIDE;(new)
;ザコオブジェクト
repeat 100
regobj ObjID( cnt ), ModelID
setpos ObjID( cnt ), -160 + rnd( 320 ), -120 + rnd( 240 ), 0.01 * rnd( 100 )
objchild Camera2D, ObjID( cnt );(new)
loop
;メインループ
repeat
hgdraw
camMove 0.2, 0.1 ;(new)
hgsync 16
loop
;カメラ移動 (new)
#deffunc camMove double _addX, double _addY
addpos Camera2D, _addX, _addY
return
んー 悪くない。汎用性も高そう。
これで決まりですね!
ありがとうございました!
|
|