アキアカノヒロロさん
ご要望のソースを添付しました。
本ソースだけでは、動きません。
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