YU-RIS サポート掲示板

0229 表示させながら回転はできたのですが…
投稿者:春男 2005/06/08(水) 12:30

春男です。

表示方法を教えていただき、ありがとうございました。

> 以下のように、ループする度にWAIT 命令で1フレーム待つ命令を入れてみてください(^^
入れてみたところ、回転しながら描画されました。ありがとうございます。

ただ、私のPCでは約30度おきに1枚しか描画できませんでした。(涙)

動作としては1度ごとに描画してスムーズに360度回転したかったので、ためしにWAIT命令のフレーム数を増やしてやると、FLAME=3でほぼ望んだ結果になりました。

原因は恐らく私のPCの処理がFLAME=1では追いつかないためだと思います。
(念のためスペックです:AthronXP-1700+,S3 ProSavegeDDR(64MB),RAM:512MB,WINXPSP2。)

> そうすることで画面表示されながら実行されるかと思います。
> ウェイト命令で待ちが入ったときに、そのウェイト時間を利用してシステムは画面描画処理に入ります。
> 逆に言えば、ウェイト命令を入れない限りスクリプトがずっと実行され続けるので、
> 画面は一切変わりません。これを利用して、いろいろレイヤをいじった後で、
> 最後に画面を一気に書き換えたりすることが可能になります(^^
なるほど…。

最終的に今回つくってみたかったものがありまして、それは「加速度的に拡大しながら回転」だったりします。最初は、1×1サイズに縮小された画像が、ゆっくり回転数をあげていきながら拡大して息、画面一杯付近まで拡大され、また縮小されていく…その繰り返しを表現してみたかったんです。(回りながら近寄ったり離れたりするイメージですね。)

とりあえずその前段階として、等速度で回転しながら拡大してゆく様子を表現したかったので以下のように書いてみました。縦横640×480ピクセルの画像を表示することとして、この画像の初期表示サイズを1×1とし、画面のサイズ640×480とします。1描画更新ごとに1/100ずつ表示倍率が増してゆき、ちょうど倍率1倍(横640、縦480)になるまで1度ずつ回転しながら拡大するように書いてみました。

…が、CGACTに指定するSET1,SET2の値がINT値でなければならないようで、拡大縮小率をFLOATで計算したあとにINT値としてセットしてやる方法が見つかりません。以下の例では、INT値として宣言した変数(L-Value)に対して、FLOATの計算式の結果を代入して実現できないか試したのですが、AGACTの実行時に「設定できる値は1〜????です。」という意味のエラーがでてしまいました。一方、コメントアウトしているように、FLOAT型の変数を用意してFLOATとして計算を行った結果をじかにCGACTのSET1,SET2に設定してみたり、FLOAT型の変数の計算結果をINT型の変数にVARACT命令で変換してからCGACTのSET1,SET2に設定しようとしたりしたのですが、いずれもエラーで不可能でした。

Q1.どのように記述すれば実現できるでしょうか。
Q2.今回書こうとしている表現方法のように、拡大縮小回転を、等速度あるいは等加速度運動として表現したい場合ですが、処理の重いPCでも軽いPCでも、等しく一定時間で同じ動作を表現したいと思います。重いPCではコマ落ちしながらの表現になります。WAIT[FLAME=???]の???を増やす方法では、増やした分だけ1描画更新時間が延びてしまい実現できません。うまい記述の方法はありますか。
Q3.WAIT[FLAME=????]とは違うアプローチですが、WAITせず普通に画面に更新してくれと伝える命令と、なるべく精度の高い経過時間を検出して処理を分岐したいので、高精度タイマーが欲しいのですが(timeGetTime()またはマルチメディア系の高精度タイマーのような)、ございますか?

---
CG[NO=5 A=0 FILE="cg/back5"]
CG[NO=6 FILE=""]
CG[NO=7 FILE=""]
FLOAT[@ZOOMXF=1.0]
FLOAT[@ZOOMYF=1.0]
INT[@ZOOMX=1]
INT[@ZOOMY=1]
INT[@ROTC=0]
INT[@CNTR=0]
LOOP[]
CGACT[NO=5 BNO=6 SIZE=1 SET=@ZOOMX SET2=@ZOOMY]
CGACT[NO=6 BNO=7 ROTATION=1 SET=@ROTC]
WAIT[FRAME=1]
//@ZOOMXF=6.4*@CNTR
//@ZOOMYF=4.8*@CNTR
//VARACT[CONVERT=1 SET=@ZOOMX LET=$ZOOMXF]
//VARACT[CONVERT=1 SET=@ZOOMY LET=$ZOOMYF]
@ZOOMX=6.4*@CNTR
@ZOOMY=4.8*@CNTR
@ROTC+=1
IF[@CNTR>100] LOOPBREAK[] IFEND[]
LOOPEND[]
拡大縮小。


- 関連一覧ツリー (■ をクリックするとツリー全体を一括表示します)