|
|
2013/9/23(Mon) 13:43:18|NO.57304
hgimg3の event_waitを使って、
オブジェクト(Xモデル)をイベントにより1フレーム単位で拡縮することで擬似的に点滅させようと考え、
newevent eventID_Tenmetu ;イベント設定(擬似点滅)
repeat 90
event_setscale eventID_Tenmetu,0,0,0 ;サイズを0にして見えなくする
event_wait eventID_Tenmetu,1 ;1フレームウェイト
event_setscale eventID_Tenmetu,SCALE,SCALE,SCALE ;SCALE=本来のサイズ
event_wait eventID_Tenmetu,1 ;1フレームウェイト
loop
<
というイベントリストを作成しました。
これを60fps環境下で適用すると、90×2=180で、約3秒間点滅する計算となる筈ですが、
実際にはもっと長い時間(9秒くらい?)、ゆっくりした点滅が続きます。
1フレーム単位のウェイト制御を行いたい場合、どういう記述をすればよいでしょうか?
また、根本的な話として、event_waitで設定するフレーム数はどう考えればよいのでしょうか?
今回のケースではループ数自体を約1/3に減らせば解決するのですが、
フレーム単位でのアニメーションや、メインプログラムの処理と連動させたい場合、
どうしても基本的な考え方を抑えておく必要があると思い、質問させて頂きました。
|
|
2013/9/23(Mon) 15:43:58|NO.57306
event_waitは最低でも3フレーム処理がかかる(0を指定しても・・・)
仕様だとしても機能的にバグに近い動作だな・・・
event_wait 100 としても次のevent行に行くのは103フレーム目
#include "hgimg3.as"
screen 0,640,480,0
cls 4
hgini
setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode)
texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録
addxfile m_xmodel,dir_exe+"\\sample\\hgimg3\\font_a.x" ; モデルを読み込む
SCALE=2.0
event_wt=0
newevent eventID_Tenmetu
repeat 90
event_addwork eventID_Tenmetu,1
event_setscale eventID_Tenmetu,0,0,0
event_wait eventID_Tenmetu,event_wt
event_addwork eventID_Tenmetu,1
event_setscale eventID_Tenmetu,SCALE,SCALE,SCALE
event_wait eventID_Tenmetu,event_wt
loop
event_wt2=1
newevent eventID_Tenmetu2
repeat 90
event_addwork eventID_Tenmetu2,1
event_setscale eventID_Tenmetu2,0,0,0
event_wait eventID_Tenmetu2,event_wt2
event_addwork eventID_Tenmetu2,1
event_setscale eventID_Tenmetu2,SCALE,SCALE,SCALE
event_wait eventID_Tenmetu2,event_wt2
loop
regobj obj, m_xmodel,,eventID_Tenmetu
regobj obj2, m_xmodel,,eventID_Tenmetu2
setpos obj,-10
setpos obj2,10
clscolor $4040
*main
stick key,$3ff
if key&128 : goto *owari
hgdraw
getworki obj,wx,wy,wz
getworki obj2,wx2,wy2,wz2
total_fps++
fprt "total_fps("+total_fps+") wx("+wx+") wx2("+wx2+")",8,8
hgsync 15
if total_fps=180{stop}
goto *main
*owari
end
関係ないけど
> event_setscale eventID_Tenmetu,SCALE,SCALE,SCALE ;SCALE=本来のサイズ
全角のスペースでSCALEが別の変数になってる
| |
|
2013/9/23(Mon) 20:10:32|NO.57310
暇人さま
回答ありがとうございます。
サンプルも、イベントの中にワーク変数をかませて、それを監視するという手法は
まったく考えつかなかったので勉強になりました。
とりあえず、これが仕様ということでしたら、それに合わせてコードを書くだけですね。
(書き方によって挙動が変わる、というのでなければ)
>全角のスペースでSCALEが別の変数になってる
元々のコードを投稿用に弄ったときに、変数名を一般的なものにしようとして修正した際に
全角スペースが入ったようです。
検証用としてはよくなかったですね。失礼しました。
|
|
2013/9/23(Mon) 20:14:35|NO.57312
hgimg3の次回更新時(あるのか?)には、この仕様をマニュアルに明記してもらうか、
修正しておいてほしいところですね。
っていうか、これって「よくある質問とその答え」だったのでしょうか?
それとも、この機能自体それほど使われていないから話題にすら上がっていない?
|
|
2013/9/23(Mon) 21:46:28|NO.57313
ゲームに使うとすると
ゲーム中にポーズ機能(ポーズじゃなくても一時的に止めたい)付けようとしてもeventを止める事は出来ない
event_jumpはあるけど条件分岐はランダムのみ
中々使い勝手が悪いからねぇ・・・
大量に同じ処理させたいときにスクリプト側でやるより圧倒的に軽いから
使える場合は結構良いんだけど・・・
同じオブジェクトに4個eventセットできるので
それ利用して1フレーム毎に点滅させるサンプル
#include "hgimg3.as"
screen 0,640,480,0
cls 4
hgini
setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode)
texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録
addxfile m_xmodel,dir_exe+"\\sample\\hgimg3\\font_a.x" ; モデルを読み込む
SCALE=2.0
event_wt=2
repeat 4
newevent eventID_Tenmetu(cnt)
eventID=eventID_Tenmetu(cnt)
_SCALE=SCALE*(cnt\2)
repeat 90
event_addwork eventID,1
event_setscale eventID,_SCALE,_SCALE,_SCALE
event_wait eventID,event_wt
loop
loop
regobj obj, m_xmodel,,eventID_Tenmetu
regobj obj2, m_xmodel
setpos obj,-10
setpos obj2,10
clscolor $4040
*main
stick key,$3ff
if key&128 : goto *owari
if (total_fps\2)=1 {setscale obj2,SCALE,SCALE,SCALE}else{setscale obj2,0,0,0}
hgdraw
getworki obj,wx,wy,wz
total_fps++
fprt "total_fps("+total_fps+") wx("+wx+")",8,8
hgsync 15
if total_fps=180:stop
if wx<4:setevent obj,eventID_Tenmetu(wx),wx
goto *main
*owari
end
ここまでするなら
event使わない方が楽って感じになっていく・・・
| |
|