HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
1206
ひろかずhgimg3でのフェードイン処理について6解決


ひろかず

リンク

2019/12/6(Fri) 02:19:29|NO.89001

 hgimg3でのフェードイン・アウトの処理を考えていて、とりあえずフェードインの処理が出来たのですが
不明な点があります。

#include "hgimg3.as" ; hgimg3プラグイン cls 4 ; 黒色で画面をクリア screen 0,640,480,0,(ginfo_dispx-640)/2,(ginfo_dispy-480)/2 ; 640x480でウインドウを作成 hgsetreq SYSREQ_DXMODE,0 ; ウインドウモードを指定 hgsetreq SYSREQ_FPUPRESERVE,1 ; 計算精度を落とさない hgini ; グラフィック機能の初期化 color 0,0,0 ; 描画色の設定 0,0,0=黒 clscolor 0 ; 背景色の設定 0=黒 texload "testchr.bmp" ; 画像の読み込み texid = stat ; テクスチャIDを保存 repeat 255 hgdraw 2 ; 描画画面の初期化 gmode 0,256,128 pos 320,240 hgrotate texid,0,0 ; 画像のコピー hgdraw 4 ; オブジェクトの描画 gmode 3,,,255-cnt ; 半透明コピーのブレンド率を指定 hgrect 320,240,0,640,480 ; 矩形の直接描画 hgsync 16 await 0 loop stop
※実行する前にsample\hgimg3\testchr.bmpをカレントディレクトリにコピーして下さい。

 これでフェードインは出来たのですが、スクリプトにある「hgdraw 4」をコメントアウトすると
フェードインが正常に動作しなくなります。
これはどうしてなのでしょうか? 理由が分かりません。

よろしくお願い申し上げます。



この記事に返信する


Makoto

リンク

2019/12/6(Fri) 14:38:26|NO.89006

hgdraw は hgrotate などを描画するわけではありません

hgdraw で描画されるオブジェクトというのは regobj で登録されたポリゴンモデルなどの事です
hgdraw が実行されると
1.画面が初期化され
2.カメラやオブジェクトの座標・角度から画面への表示場所が計算され
3.オブジェクトが描画されます

hgdraw 2 ではオブジェクトの表示場所の計算のみを行い描画は行われません
ですから、hgdraw 2 だけでは画面は変化しません
hgdraw 4 は画面の初期化を行わないため前回の画像が残ったままになります

ちゃんと動作させるには
hgdraw 2 を hgdraw に
hgdraw 4 は不要
となります

hgdraw 4 のサンプル

#include "hgimg3.as" ; hgimg3プラグイン cls 4 ; 黒色で画面をクリア screen 0,640,480,0,(ginfo_dispx-640)/2,(ginfo_dispy-480)/2 ; 640x480でウインドウを作成 hgini ; グラフィック機能の初期化 color 0,0,0 ; 描画色の設定 0,0,0=黒 clscolor 0 ; 背景色の設定 0=黒 hgdraw ; 描画画面の初期化用 addbox MDL_BOX,5,5 ; オブジェクトの作成 regobj OBJ_BOX repeat 100 addang OBJ_BOX ,0 ,0 ,-0.2 ; オブジェクトを動かす setpos OBJ_BOX ,cnt - 50 hgdraw ; これを↓ ; hgdraw 4 ; こちらに変えると color 0 ,255 ,0 ; 矩形の描画 hgrect 320 ,120 ,0.2 * cnt ,64 ,64 hgsync 32 loop

それから、hgsync に同様の機能が含まれていますから
await は必要ないですね



ひろかず

リンク

2019/12/6(Fri) 22:35:50|NO.89010

>>Makotoさん

ご返信頂き、誠に有り難うございます。
しかしながら、ご返信頂いた内容を理解する事が出来ませんでした。

>hgdraw 2 ではオブジェクトの表示場所の計算のみを行い描画は行われません

これは理解しているつもりです。
hgdraw 2は画面を初期化する為に入れております。

>hgdraw 4 は画面の初期化を行わないため前回の画像が残ったままになります

これも理解しているつもりです。
その為にあらかじめhgdraw 2を実行しているのです。

ご呈示頂きましたスクリプトですが、
hgdrawをhgdraw 4に変えたとしても、repeat 100の次の行にhgdraw 2を入れれば
正常に動作するかと思います。

私が理解出来ないのは、hgrect命令で直接描画を行っているにもかかわらず、
hgdraw 4の有無で実行結果が変わるのかという事です。

よろしくお願い申し上げます。



Makoto

リンク

2019/12/6(Fri) 23:31:24|NO.89011

hgrect の描画を有効にするには
一度は hgdraw による描画処理が行われる必要があるようです

ひろかずさんのスクリプトのループの前に hgdraw (または hgdraw 4) を入れ
ループ内の hgdraw 4 を消して実行してみてください

最初のご質問の状態だと hgdraw 2 のみで一度も描画処理が行われない事になります

それににしてもなぜ hgdraw 一つで済むものをこのような形にされているのでしょうか
技術的な面での検証ということでしたら申し訳ありません



暇人

リンク

2019/12/6(Fri) 23:44:02|NO.89012

>hgdraw 4の有無で実行結果が変わるのかという事です。
hgdraw 4で結果が変わると言うより
hginiから一度はhgdrawでObjectの描画
(描画するObjectが無くても)を、する必要があるだけ

hgini hgdraw
って、やるだけで良い
多分何らかの初期化がされなくて
動作がおかしくなるんだと思う



暇人

リンク

2019/12/6(Fri) 23:46:57|NO.89013

かぶってしまった・・・



ひろかず

リンク

2019/12/7(Sat) 10:26:26|NO.89014

>>Makotoさん

ご返信頂き、誠に有り難うございます。

>それににしてもなぜhgdraw一つで済むものをこのような形にされているのでしょうか

あくまでもサンプルのスクリプトは事象を見て頂く為に最低限の記述をしています。
実際のスクリプトは、hgrotate命令でグラフィックの直接描画を行い、
その上にスプライト(オブジェクト)を重ねて表示しています。

上記の優先順位で画像表示を行うには、hgdraw 2、hgdraw 4と分ける必要があります。
hgdraw一つで実行した場合、上記の優先順位での画像表示は不可能となります。

そういった中で「タイトル画面」など、スプライトの描写が必要ない場面があり、
hgdraw 4を省略したところ、問題の事象に出会った次第です。


>>暇人さん

ご返信頂き、誠に有り難うございます。

HSP命令リファレンスを読むと、hgrotate命令、hgrect命令ともに直接描画命令となっています。
しかしながら、hgrotate命令ではhgdraw 4命令は全く必要無いのに対し、
もう一方のhgrect命令はhgdraw 4命令を実行しないと正しく動作しないのを不思議に思っておりました。

仕様という事で納得します。
お二方とも有り難うございました。



ONION software Copyright 1997-2023(c) All rights reserved.