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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1228
A.CHGIMG3を異なるウインドウサイズで再初期化すると直接描画が正しい位置に描画されない5解決


A.C

リンク

2013/12/28(Sat) 00:12:51|NO.58920

こんにちは、A.Cです。

下記スクリプトは、スクリーンID0の内容をテクスチャとして登録し、
スクリーンID1をHGIMG3ウインドウにして
その中央にテクスチャをhgrotateで直接描画するスクリプトです。


#include "hgimg3.as" #define RUN1 1 ;1で1回目を実行 #define RUN2 1 ;1で2回目を実行 ;-- 1回目 #if RUN1 screen 0,256,256:title "ID0 : TEX" color 128:boxf:color 0,128,255:boxf 0,0,128,128 screen 1,320,320 title "ID1 : 1回目" hgini gsel 0 settex 256,256,0,-1 : tex=stat gsel 1 repeat 100 hgdraw gmode 1,256,256 pos ginfo_winx/2,ginfo_winy/2 hgrotate tex,0,0,0,256,256 hgsync 10 await 0 loop hgbye #endif #if RUN2 ;-- 2回目 screen 0,256,256:title "ID0 : TEX" color 128:boxf:color 0,128,255:boxf 0,0,128,128 screen 1,640,640 ;←縦横サイズを変える title "ID1 : 2回目" hgini gsel 0 settex 256,256,0,-1 : tex=stat gsel 1 repeat 100 hgdraw gmode 1,256,256 pos ginfo_winx/2,ginfo_winy/2 hgrotate tex,0,0,0,256,256 hgsync 10 await 0 loop #endif stop
1回目はスクリーンID1のサイズを320x320、2回目は640x640で描画しています。
それぞれ片方だけ実行すると、期待通り中央にテクスチャが表示されますが、
2つを連続して実行すると2回目の表示結果が拡大して右下にずれて表示されてしまいます。

任意のタイミングでウインドウサイズを変更してHGIMG3を扱いたいのですが、
上記スクリプトで、何か間違っているところはあるでしょうか。
もしこれがHGIMG3の正しい動作だとすれば、
どのようにすれば2回連続実行しても中央にテクスチャが表示されるようになるのでしょうか。



この記事に返信する


暇人

リンク

2013/12/29(Sun) 07:03:30|NO.58963

hgbyeしても完全には消えない感じ
だから他のウィンドウを操作先にしhginiしても
元のウィンドウがhgimg3の描画先になる

ウィンドウを大きくしてhginiしても最初に初期化したウィンドウのサイズが
DX側のサイズになって大きくしたウィンドウサイズに拡大されて描画される

バグか仕様かは分からないけどhgimg3側の修正が必要な感じ・・・
COM使ってIDirect3DDevice8_Resetしからhgviewの設定してhgdraw 1 なら
一応期待通りの表示になるけど、何か怪しい・・・



おにたま(管理人)

リンク

2013/12/29(Sun) 11:42:15|NO.58968

ご報告ありがとうございます。
HGIMG3の初期化時の不具合だと思われます。
次回の更新時に修正したいと思います。



暇人

リンク

2013/12/30(Mon) 06:09:23|NO.58979

とりあえず
修正されるまでの繋ぎとして・・・

hgimg3の画面を終了せずにリサイズするモジュール

#include "hgimg3.as" //必ず#include "hgimg3.as"の後に配置 #module "mod_hgResize" #usecom IDirect3DDevice8 "{7385E5DF-8FE8-41D5-86B6-D7B48547B6CF}" #comfunc IDirect3DDevice8_AddRef 1 #comfunc IDirect3DDevice8_Reset 14 var #comfunc IDirect3DDevice8_SetViewport 40 var #comfunc IDirect3DDevice8_GetViewport 41 var //[ hgResize winx, winy, fsm ]----hgimg3の画面をリサイズする // winx = 画面横サイズ(省略時現在の操作先のウィンドウサイズ) // winy = 画面縦サイズ(省略時現在の操作先のウィンドウサイズ) // fsm = フルスクリーンモードスイッチ(省略時-1)[-1=現在のモードを維持 0=ウィンドウモード 1=フルスクリーンモード 2=フルスクリーンモードで垂直同期無し] //hgResizeの前にhgsetreqでSYSREQ_DXMODE、SYSREQ_DXWIDTH、SYSREQ_DXHEIGHT、SYSREQ_DXVSYNC等を設定すると //fsm省略時にその設定が使われる(フルスクリーン時サイズはhgsetreq側が優先される) #define global hgResize(%1=-1,%2=-1,%3=-1) _hgResize %1,%2,%3 #deffunc _hgResize int winx,int winy,int fsm if winx<=0 {_winx=ginfo_winx}else{_winx=winx} if winy<=0 {_winy=ginfo_winy}else{_winy=winy} hgreset hggetreq ret,SYSREQ_PTRD3DDEV newcom g_pd3dDev, , -1, ret IDirect3DDevice8_AddRef g_pd3dDev hggetreq dxsync,SYSREQ_DXVSYNC hggetreq FullScreenMode,SYSREQ_DXMODE if fsm>=0 { FullScreenMode=(fsm ! 0) dxsync=(fsm = 2) } hgsetreq SYSREQ_DXMODE,FullScreenMode hgsetreq SYSREQ_DXVSYNC,dxsync hggetreq BackBufferFormat,SYSREQ_RESVMODE AutoDepthStencilFormat=80 //D3DFMT_D16=80 D3DPRESENTFLAG=0 EnableAutoDepthStencil=1 BackBufferCount=1 MultiSampleType=0 // D3DMULTISAMPLE_NONE = 0 SwapEffect=1//D3DSWAPEFFECT_DISCARD=1 hDeviceWindow=hwnd d3dpp(0)=_winx d3dpp(1)=_winy d3dpp(2) = BackBufferFormat // BackBufferFormat d3dpp(3) = BackBufferCount// BackBufferCount d3dpp(4) = MultiSampleType// MultiSampleType d3dpp(5) = SwapEffect // SwapEffect d3dpp(6) = hDeviceWindow // hDeviceWindow d3dpp(7) = 1 // Windowed d3dpp(10) = D3DPRESENTFLAG // D3DPRESENTFLAG d3dpp(11) = 0 // FullScreen_RefreshRateInHz d3dpp(12) = 0 // PresentationInterval if FullScreenMode { hggetreq BackBufferWidth,SYSREQ_DXWIDTH hggetreq BackBufferHeight,SYSREQ_DXHEIGHT if BackBufferWidth<=0 or BackBufferHeight<=0{ BackBufferWidth=limit(_winx,640,ginfo_dispx) BackBufferHeight=limit(_winy,480,ginfo_dispy) } hgsetreq SYSREQ_DXWIDTH,BackBufferWidth hgsetreq SYSREQ_DXHEIGHT,BackBufferHeight d3dpp(0)=BackBufferWidth d3dpp(1)=BackBufferHeight d3dpp(7) = 0 // Windowed = 1 hggetreq val,SYSREQ_DXVSYNC PresentationInterval=0x80000000*(val ! 0) d3dpp(11) = 0 // FullScreen_RefreshRateInHz d3dpp(12) = PresentationInterval // PresentationInterval } d3dpp(8) = EnableAutoDepthStencil // EnableAutoDepthStencil = 1 d3dpp(9) = AutoDepthStencilFormat // AutoDepthStencilFormat = D3DFMT_D16 IDirect3DDevice8_Reset g_pd3dDev,d3dpp dim D3DVIEWPORT8,6 IDirect3DDevice8_GetViewport g_pd3dDev,D3DVIEWPORT8 D3DVIEWPORT8 =0,0,d3dpp(0),d3dpp(1) IDirect3DDevice8_SetViewport g_pd3dDev,D3DVIEWPORT8 delcom g_pd3dDev hgview 0,0,d3dpp(0),d3dpp(1) //デフォルトの描画エリアが何処で設定されてるか分からないのでhgviewでエリア指定してhgdraw 1にする必要がある return #global //モジュールここまで screen 0,256,256:title "ID0 : TEX" color 128:boxf:color 0,128,255:boxf 0,0,128,128 screen 1,320,320 title "ID1 : 1回目" hgini gsel 0 settex 256,256,0,-1 : tex=stat gsel 1 repeat 100 hgdraw gmode 1,256,256 pos ginfo_sx/2,ginfo_sy/2 hgrotate tex,0,0,0,256,256 hgsync 10 await 0 loop screen 0,256,256:title "ID0 : TEX" color 128:boxf:color 0,128,255:boxf 0,0,128,128 screen 1,640,640 ;←縦横サイズを変える title "ID1 : 2回目" //パラメータ無しで現在の操作先のウィンドウのサイズでDirectXの画面をリサイズする hgResize //hgResize内部でhgresetしてるのでhgbye等は必要ない gsel 0 settex 256,256,0,-1 : tex=stat gsel 1 repeat hgdraw 1 //hgResizeでサイズ変更した場合は必ず 描画エリアを反映モード でhgdrawを実行 gmode 1,256,256 pos ginfo_sx/2,ginfo_sy/2 //DirectXは画面サイズを自動調整するのでginfo_win系じゃなくginfo_s系じゃないとサイズ変更された時にずれる hgrotate tex,0,0,0,256,256 hgsync 10 await 0 loop



暇人

リンク

2013/12/30(Mon) 14:30:29|NO.58987

ちょっとテストでウィンドウ変えて試してたのが残ってたので修正して再掲載

>// winx = 画面横サイズ(省略時現在の操作先のウィンドウサイズ)
>// winy = 画面縦サイズ(省略時現在の操作先のウィンドウサイズ)
ウィンドウモードの場合画面サイズは
ウィンドウ自体のサイズじゃなくてDirectX側のバックバッファサイズ
なのでウィンドウサイズと違うサイズが指定された場合表示は違いに合わせて拡縮する

NO.58979の二回目の所を差し替えサンプル


screen 0,256,256:title "ID0 : TEX" color 128:boxf:color 0,128,255:boxf 0,0,128,128 color 255,255 mes "あいうえお\nかきくけこ" screen 1,640,640 ;←縦横サイズを変える title "ID1 : 2回目" //パラメータ無しで現在の操作先のウィンドウのサイズでDirectXの画面をリサイズする(サイズ指定した場合は操作先ウィンドウサイズに合わせて拡縮表示される) hgResize 450,450//hgResize内部でhgresetしてるのでhgbye等は必要ない gsel 0 settex 256,256,0,-1 : tex=stat gsel 1 repeat stick k if k<256 and k>0{end} hgdraw 1 //hgResizeでサイズ変更した場合は必ず 描画エリアを反映モード でhgdrawを実行 gmode 1,256,256 pos 450/2,450/2 //DirectXは画面サイズを自動調整するのでginfo_win系じゃなくhgResizeしたサイズじゃないとずれる hgrotate tex,0,0,0,256,256 hgsync 10 await 0 loop



A.C

リンク

2013/12/31(Tue) 17:28:54|NO.59030

回答ありがとうございます。

そこまで急いでいる問題ではないので
HSP次期バージョンアップでの修正を待ちたいと思います。

暇人さんのスクリプトも参考にさせていただきます。
ありがとうございました。



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