|
|
|
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
|
|
2013/12/31(Tue) 17:28:54|NO.59030
回答ありがとうございます。
そこまで急いでいる問題ではないので
HSP次期バージョンアップでの修正を待ちたいと思います。
暇人さんのスクリプトも参考にさせていただきます。
ありがとうございました。
|
|