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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0331
昭和ロートルHSP3.6β2のHGIMG4でのウインドウサイズ18解決


昭和ロートル

リンク

2020/3/31(Tue) 16:35:40|NO.89872

初めての投稿です。
今まで、blender,shade3d,mmd等の3Dソフト、
kirikiriや、Unity等のゲームエンジンを
いじくってきましたが、シーケンシャルなゲームには、
Unityでは大仰になってしまい不向きだなと思ってました。
今回HSP3.6で3D機能に物理エンジンも付加されたというので
興味が沸き勉強中です。
今回は、sampleのpronama3dの中のpronama_box.hspを
眺めながら、ウインドウサイズ可変化にチャレンジしてみました
ウインドウのサイズの可変化は、5行目以降に


;サイズ変更可能ウィンドウの設定 #include "user32.as" #define WM_SIZE 0x00005 //ウィンドウサイズ変更 #define WS_MAXIMIZEBOX 0x10000 //最大化ボタン #define WS_THICKFRAME 0x40000 //サイズ変更可能 GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat | WS_THICKFRAME | WS_MAXIMIZEBOX
を入れるだけで可能になりましたが、ウインドウサイズを変更して
も3Dシーンのサイズは元のままでした(当たり前ですが)。
そこで、ウインドウサイズ変更イベントを検出して、
サイズを取得し、HGIMG4のビューポートを設定して
再度初期化部を実行したら可能と思いましたが、
実ウインドウサイズの取得方法が分かりません。
ginfo系の変数は、初期値のままの様です。
よろし願います。


;イベント検出 oncmd goto *resize, WM_SIZE await 1000/60 ; 待ち時間 goto *main *resize ;pos 100,100:mes "ウインドウサイズ変更!" dialog "ウインドウサイズ変更!" goto *init



この記事に返信する


あらや

リンク

2020/3/31(Tue) 20:59:08|NO.89876

枠やタイトルバー(キャプションバー)を含めたウィンドウサイズならば
『GetWindowRect』

描画領域(クライアントエリア)だけのサイズ取得がしたいのならば
『GetClientRect』

どちらもWindowsのAPIですが、
これで取得してみてはいかがでしょうか。



kanamaru

リンク

2020/4/1(Wed) 11:50:05|NO.89879

こんなのを作ってみました。
hsp3dishの影響を受けそうなのをwinapiで取得するginfoです。

#module #uselib "user32.dll" #func GetCursorPos "GetCursorPos" int #func GetWindowRect "GetWindowRect" int,int #func GetCliantRect "GetCliantRect" int,int #cfunc GetActiveWindow "GetActiveWindow" #func GetSystemMetrics "GetSystemMetrics" int #defcfunc ginfo_s int i getreq t, SYSREQ_PLATFORM if t == PLATFORM_WINDOWS { if i<2{ dim point,2 GetCursorPos varptr(point) return point(i) } if ((3<i) and (i<8)){ dim r,4 GetWindowRect GetActiveWindow(),varptr(r) return r(i-4) } if ((9<i) and (i<12)){ return ginfo_s(i-3)-ginfo_s(i-5) } if ((11<i) and (i<14)){ dim r,4 GetCliantRect GetActiveWindow(),varptr(r) return r(i-9)-r(i-7) } if ((19<i) and (i<22)){ return GetSystemMetrics(i-20) } } return ginfo(i) #global #undef ginfo #define ginfo ginfo_s
ginfo_mxとかはginfoを置き換えているだけなので
上記のginfoの影響を受けてくれるはず。
hsp3dishかHGIMG4を使うことを前提に作っているので
#includeの後に追加してください



アキアキノヒロロ

リンク

2020/4/1(Wed) 12:46:18|NO.89881

横から割り込む形になって、すいません。

私が以前立てたスレ

  『「hgimg4.as」の画面の大きさを変える方法』
  『「HSP3.6β2」による「hgimg4」の「サッカーゲーム」(ウィンドウ拡張版 by K-sさん)です』

でご紹介した、K-sさんの

  『ウィンドウ拡張版 [fw_test2.hsp] 』

で、全画面化が可能になっています。
ご参考になさって見て下さい。


K-sさんの『ウィンドウ拡張版 [fw_test2.hsp] 』は、現在更新されていますので、私の指し示した
スクリプト上の行の位置等、若干かわっています。ご留意下さい。

『pronama_box.hsp』を『ウィンドウ拡張版 [fw_test2.hsp] 』に組込んで、試してみました。
ウインドウサイズの変更にも、他の操作にも、問題ありませんでした。



昭和ロートル

リンク

2020/4/1(Wed) 13:37:39|NO.89882

あらやさん、kanamaruさん
対処法有難うございます。
基本的にWindowsのAPI GetCliantRectを使って取得ということですね。
kanamaruさんのスクリプトをそのまま元ソースに張り付けて実行したところ
#Error 38(...) -->外部DLLの呼び出しに失敗しました
とのメッセージが出てエラーになりました。
どうも、システムにuser32.dllがないようです。
アキアキノヒロロさん
fw_test2.hspを探して、中身を参考にしてみます。

どうもHSPは、バージョン毎に変更があり、基本ダウンロードした中のドキュメント
だけを参考にすべきみたいですが、中の検索が大変です。
ウェブ検索だと希望の要件が結構見つかるのですが、ほとんど旧バージョン対応で
それを参考にするとほとんどエラーになります。
いやはやもう少し調べてみます。



アキアキノヒロロ

リンク

2020/4/1(Wed) 13:59:28|NO.89883

K-sさんの『ウィンドウ拡張版 [fw_test2.hsp] 』は、

  [HSP]ウィンドウとフルスクリーンを切り替える
  https://qiita.com/skymonsters_Ks/items/00fdb67d6518eb8b2cc5

です。



昭和ロートル

リンク

2020/4/1(Wed) 14:12:40|NO.89884

アキアキノヒロロさん。
ホームページの2番目の方のソースをダウンロードしました。
中身はまだ全然チェックしてません。
だた、実行してみると、最大化のボタンも非有効で、
ウインドウの縁をドラッグしても、ウインドウサイズは変わりませんでした。
午後は別件があり、チェックは、夕方以降になります。



昭和ロートル

リンク

2020/4/1(Wed) 17:44:50|NO.89888

kanamaruさん
添付のソースのGetCliantRect は、GetClientRect
の間違いですね。
また、その下の
return r(i-9)-r(i-7)
は、
return r(i-10)-r(i-12)
じゃないかと思うんですけど、どうも得られる値が期待通りでないみたいです。
ただ、何とか動き出しているみたいですのでもう少し調べてみます。



昭和ロートル

リンク

2020/4/1(Wed) 18:02:04|NO.89891

一応、ウインドウサイズを取得して、

*resize wx = ginfo(12) wy = ginfo(13) gpreset gpviewport 0,0,wx,wy goto *init
*init は、メインのgpresetの直後の位置
みたいに書いたら、サイズ変更したウインドウ全体が描画対象に出来ました。
ところが、ウインドウの上下左右の比率を変えると描画がそれに応じて縦長や横長に
変わってしまいました。この辺どう対処したらいいのでしょう?



アキアキノヒロロ

リンク

2020/4/2(Thu) 01:18:52|NO.89903

昭和ロートルさん

もう、ほぼ解決したような段階になっているようですね。

私は、昭和ロートルさんほどの知識を持たない、万年初心者です。
昭和ロートルさんが、やっておられることを理解する力にも欠けていて、ただ、この K-sさんの
『ウィンドウ拡張版 [fw_test2.hsp] 』のことをご紹介するのみです。

[fw_test2.hsp] は最大化のみになります。「サイズ変更可能ウィンドウ」という訳ではありません。
最大化のボタンではなく、[Enter]キーによります。既定の大きさに戻すのも、[Enter]キー。
ウインドウの縦横の比率をそのままに、画面の最大化をしたい、ということでしたら、この
[fw_test2.hsp] で出来ていますが。

昭和ロートルさんの、ご主旨に沿わないようで、すいません。
それでも、参考にしていただけるのでしたら、先のスレで申しました

  □ 「hgimg4.as」の画面の大きさを変える方法
   (NO.89093)

  □ 「HSP3.6β2」による「hgimg4」の「サッカーゲーム」(ウィンドウ拡張版 by K-sさん)です
   (NO.89318)

という「タイトル」で、この掲示板内の記事検索をしてみて下さい。
一つ目のものは、K-sさんと私のやり取りのスレッドになります。
二つ目のものは、物理挙動を利用した、私の「サッカーゲーム」を、K-sさんの[fw_test2.hsp]に
組み込んだものの紹介のスレッド。自己宣伝になって恐縮です。



アキアキノヒロロ

リンク

2020/4/2(Thu) 09:13:19|NO.89904

この掲示板で、「HGIMG4]について以前から色々とお世話になってきた者ですが、こと「HGIMG4」に関しては、
他のスレッドに比べ、ご意見等は、寄せて頂ける数にとても差があります。(いつも、一人相撲に近いです)

それで、昭和ロートルさんのこの取り組みをもっと知りたいので、お作りになったプログラム全体を載せて
いただけないでしょうか。私の力量では、昭和ロートルさんが記された部分的なものから、全体を組み上げ、
きちんと再構築することができません。恥ずかしいですが、よろしくお願いします。



昭和ロートル

リンク

2020/4/2(Thu) 12:52:52|NO.89908

アキアカノヒロロさん
ご要望のソースを添付しました。
本ソースだけでは、動きません。
HSP配布物の sample/pronama3d ディレクトリ一式をコピーして
その中の pronama_box.hsp
をこのソースで上書きしてください。

画面比の問題は、
gpviewport xd,yd,wx,wy
のwx,wyをその比を起動時のウインドウサイズの比で、かつ
どちらも新ウインドウサイズより小さくならないように再計算した
値を設定するようにすれば実用上解決できそうです。
添付のソースの中の汎用部分を自分用のモジュールとして分離して
ゲーム制作に使おうと思います。
なお私のHSPは、3.6β2です。意図通りに動かないようなら返信してください。
私としては、本スレッドは解決積みとします。
後HSPに要望もありますので別スレッドを投稿する予定です。

;#include "hsp3_64.as" #runtime "hsp3mt" ; マルチスレッドランタイムを使用する #include "hgimg4.as" #packopt name pronama_box ; 以下の2行は、PCの場合は機能しないよう。hsp3dish.iniが優先? #packopt xsize 960 #packopt ysize 640 ;サイズ変更可能ウィンドウの設定を追加 #include "user32.as" #define WM_SIZE 0x00005 //ウィンドウサイズ変更 #define WS_MAXIMIZEBOX 0x10000 //最大化ボタン #define WS_THICKFRAME 0x40000 //サイズ変更可能 GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat | WS_THICKFRAME | WS_MAXIMIZEBOX ;以下頂き物. #module ;#uselib "user32.dll" #func GetCursorPos "GetCursorPos" int #func GetWindowRect "GetWindowRect" int,int #func GetClientRect "GetClientRect" int,int #cfunc GetActiveWindow "GetActiveWindow" #func GetSystemMetrics "GetSystemMetrics" int #defcfunc ginfo_s int i getreq t, SYSREQ_PLATFORM if t == PLATFORM_WINDOWS { if i<2{ dim point,2 GetCursorPos varptr(point) return point(i) } if ((3<i) and (i<8)){ dim r,4 GetWindowRect GetActiveWindow(),varptr(r) return r(i-4) } if ((9<i) and (i<12)){ return ginfo_s(i-3)-ginfo_s(i-5) // ここも違うかな? } if ((11<i) and (i<14)){ dim r,4 GetClientRect GetActiveWindow(),varptr(r) return r(i-10)-r(i-12) } if ((19<i) and (i<22)){ return GetSystemMetrics(i-20) } } return ginfo(i) #global #undef ginfo #define ginfo ginfo_s //ウィンドウのサイズが変更された時に送られてくるメッセージ(追加) ;#define WM_SIZE 0x0005 ; 暮井 慧(プロ生ちゃん) 3D model (C) Pronama LLC ; ; HGIMG4対応 HSP3用スクリプトサンプル ; ※このスクリプト及びサンプルデータは、ライセンス規約のもと ;  自作ソフトで自由にお使い頂けます ; ※詳しくは、 https://kei.pronama.jp/ ; ; 背景キューブマップ素材(res/cubemap.png)は、 ; http://www.hdri-hub.com/ ; で公開されているデータを使用させて頂きました。 ; title "HGIMG4 Test" gpreset *init ; 初期化用に*initを追加. setreq SYSREQ_LOGWRITE,1 ; 終了時にログを出力 setcls CLSMODE_SOLID, $00c0c0 gpload id_model,"res/pronamachan_l" ; モデル読み込み setscale id_model, 0.025,0.025,0.025 gpaddanim id_model,"look" ; "look"クリップを設定 gpact id_model,"look" gpusermat id_cubemat, "res/shaders/skybox.vert", "res/shaders/skybox.frag" gpmatprmt id_cubemat, "u_diffuseTexture", "res/cubemap.png", GPOBJ_MATOPT_NOMIPMAP|GPOBJ_MATOPT_CUBEMAP gpmatprm4 id_cubemat, "u_voffset", 0,14.0,0,0 gpbox id_sky,-30,-1, id_cubemat setpos id_sky,0,13,0 gpfloor id_floor, 30,30, $404040 ; 床ノードを追加 setpos id_floor, 0,-2 gppbind id_floor, 0 ; 床の物理設定を行なう setobjmode id_floor,OBJ_HIDE setpos GPOBJ_CAMERA, 0,5.6,5 ; カメラ位置を設定 gptexmat id_texmat, "res/qbox.png" gpbox id_box, 1, -1, id_texmat ; 箱ノードを追加 setpos id_box, 3, 0, 0 gppbind id_box, 4, 0.5 ; 箱の物理設定を行なう ;gppset id_box,GPPSET_GRAVITY,0,-400,0 camx=0.0:camy=3.0:camz=10.0 *main gosub *render ; スペースキーまたはクリックで箱を追加 if key&$110 { gpclone i, id_box ; 最初の箱をクローン x=rnd(8)-6:z=rnd(6)-8 setpos i, x, 10, z ; 落とす位置を微調整 gppbind i, 4, 0.5 ; 箱の物理設定を行なう ;gppset i,GPPSET_GRAVITY,0,-400,0 } ; タッチでカメラ位置を動かす if dragmd { ; ドラッグ中 getkey a,1 if a=1 { camx=0.05*(mousex-dragx)+cx camy=0.05*(mousey-dragy)+cz } else { dragmd=0 } } else { ; ドラッグなし getkey a,1 if a { cx=camx:cz=camz dragx=mousex:dragy=mousey dragmd=1 } } ; カーソルキーでカメラ位置を動かす if key&1 : camx -=0.2 if key&4 : camx +=0.2 if key&8 : camz +=0.2 if key&2 : camz -=0.2 ;addang id_model,0,0.02 ; ノード回転 ; ウインドウサイズが変更イベント検出部 oncmd goto *resize, WM_SIZE await 1000/60 ; 待ち時間 goto *main ; ウインドウサイズを検出して3dシーンのサイズ変更. *resize ;pos 100,100:mes "ウインドウサイズ変更!" wx = ginfo(12) wy = ginfo(13) dialog "ウインドウサイズ変更!"+wx+" , "+wy // 上の行を削除すれば、ダイアログは出ない. gpreset gpviewport 0,0,wx,wy goto *init *render stick key,15+64 if key&128 : end setpos GPOBJ_CAMERA, camx,camy,camz ; カメラ位置を設定 gplookat GPOBJ_CAMERA, 0,1.8,0 ; カメラから指定した座標を見る gsel 0 redraw 0 ; 描画開始 gpdraw ; シーンの描画 color 255,255,255 pos 8,8:mes "HGIMG4 sample" redraw 1 ; 描画終了 return



昭和ロートル

リンク

2020/4/2(Thu) 13:47:54|NO.89910

追伸です。
本プログラムをHSPエディタで起動して、F5で実行中に、
いろいろ、ウインドウサイズを変えたり、スペースキーを押したりした後、
ウインドウ右上のXでウインドウを終了させると、ときどきクラッシュします。
原因は不明ですが、一応報告します。



アキアキノヒロロ

リンク

2020/4/2(Thu) 14:16:55|NO.89911

昭和ロートルさん、ありがとうございます。

私の環境でも、昭和ロートルさんの意図通りしっかり動いています。
このプログラムを勉強させて頂きます。

K-sさんのものは、最大化のみではありますが、画面を初期化することなく、
逐次、[最大化←→既定の大きさ]が可能なので、ゲーム中にも実行可能です。
昭和ロートルさんのものでも、そのようなことができたらなあ、と思っています。
なんとかならないか、ない知恵を絞ってやってみよう、などと無謀なことを
考えています。



昭和ロートル

リンク

2020/4/2(Thu) 14:38:59|NO.89912

アキアキノヒロロさん
157行をコメントアウトし
159行をgoto *main
に修正すると初期化せずにゲームを続けられました。
私の場合、ゲームの起動時に自分のモニター解像度に合わせられることだけしか
考えてなかったので、初期化することしか思ってませんでした。
HGIMG4 も結構融通性があるようですね。



アキアキノヒロロ

リンク

2020/4/2(Thu) 15:04:20|NO.89913

すごい。

こちらでも、確認致しました。
これを自分の「サッカーゲーム」で出来ないか、やってみようと思います。



アキアキノヒロロ

リンク

2020/4/2(Thu) 17:17:36|NO.89917

本題から外れるようで申し訳ないのですが、「HGIMG4」や「HSP3.6β2」つながりで、
「物理挙動」、「Blender」利用、「Unity」との関係等々、色々、昭和ロートルさんの
お話が聞けないものか、とても興味があります。
是非、別スレッドを立てて頂きたく思います。

物理挙動については、私なりに出来る工夫をしていますが、ゲームでの利用にはかなりの
無理があります。
Blenderでのモデル利用も、そのFBXファイルでのやり取りで苦労させられてきました。
Unityからのモーション利用もできるようになっているのですが、とても厄介な作業のようで、
やってみる勇気が出ません。

掲示板でこれらのことを取り上げても、反応がほとんどなく、どうも「3D」だと、みなさん
「HGIMG3」の方たちばかりのようです。

余計なことを申し上げてすいません。



昭和ロートル

リンク

2020/4/2(Thu) 18:23:03|NO.89922

アキアキノヒロロさん
御意向に答えたいとは思いますが、私からスレッドを立ち上げると言っても
今のところテーマが定まってません。
私もまだまだHSP初心者です。もう少しHSPを理解するまで待ってください。
もちろん、アキアキノヒロロさんからテーマを挙げて頂くのは全然かまいません。
分かる範囲でお答えします。
ただ、3Dレンダリングと物理演算は、それぞれ別テーマと考えた方がいいです。



アキアキノヒロロ

リンク

2020/4/3(Fri) 07:00:12|NO.89931

ありがとうございます。
そのようなご返答を頂けただけで、十分に思います。

感謝しております。



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