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


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
0527
YUZRANIUMhgimg4のカメラ操作7解決


YUZRANIUM

リンク

2023/5/27(Sat) 21:51:49|NO.99519

最初は難しそうだなぁ〜と毛嫌いしていたけれど
最近は、hgimg4のアップデートに心踊る自分がいる

デバッグのたびに、Minecraftのように、もっと感覚的に操作したい。
と思うようになり、下のふたつのページに行きつきました。

色んなところから色んなモノをパク...吸収して(笑)
トライ&エラーの精神でこの形になりました。

個人的にはちょっぴり満足です

* 参考文献 *

「HGIMG4で指定したXYZ回転ベクトルの向きへ物理挙動で力を加えたい」
(NO.94240/fv系命令を使って/昔の3Dゲーム的な移動)
http://hsp.tv/play/pforum.php?mode=pastwch&num=94233

「HSP開発Wiki/小ワザ/レーシング/カメラワーク」
(なんかブラウザで表示されているURLよりめっちゃ長くなる。なんか怖いから貼らない)



この記事に返信する


YUZRANIUM

リンク

2023/5/27(Sat) 21:52:21|NO.99520


#include "hgimg4.as" chdir dir_exe + "\\sample\\hgimg4" gpreset ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #module "my_hgimg4" ;#################################################################### ; hgimg4カメラ設定 ; [double] cam_power : 前後左右移動感度 ; [double] cam_row : 旋回角感度 ; [double] cam_distans : 操作用オブジェクトからの距離 ; #deffunc hgcam_init double cam_power, double cam_row, double cam_distans cam_P = cam_power : cam_R = cam_row : cam_D = cam_distans ddim CAM_pos, 3 : CAM_pos(1) = cam_distans ddim CAM_ang, 3 : CAM_ang(1) = M_PI ddim CAM_lok, 3 ; カメラの注視点座標 ddim lookat_y ; カメラの注視点Y座標への加算値 (カメラの仰角変更用) ddim CAM_pow, 3 ddim CAM__fv, 3 return ;#################################################################### ; hgimg4カメラ操作用 ;======================================================= ; 前後 #deffunc hgcam_FB int p1, int p2 if p1 {CAM_pow(2) = cam_P} else:if p2 {CAM_pow(2) = -cam_P} return ;======================================================= ; 左右 #deffunc hgcam_RL int p1, int p2 if p1 {CAM_pow(0) = cam_P} else:if p2 {CAM_pow(0) = -cam_P} return ;======================================================= ; 上下 #deffunc hgcam_UD int p1, int p2 if p1 {CAM_pow(1) = cam_P} else:if p2 {CAM_pow(1) = -cam_P} return ;======================================================= ; 旋回角 #deffunc hgcam_YR int p1, int p2 if p1 {CAM_ang(1) += cam_R} else:if p2 {CAM_ang(1) -= cam_R} return ;======================================================= ; 仰俯角 #deffunc hgcam_XR int p1, int p2 if p1 {lookat_y += cam_P} else:if p2 {lookat_y -= cam_P} return ;#################################################################### ; hgimg4カメラ内部処理用 ; #deffunc local hgcam_calc var ID_v fvset CAM__fv, -CAM_ang(0), -CAM_ang(1), -CAM_ang(2) fvdir CAM__fv, CAM_pow(0), CAM_pow(1), CAM_pow(2) setang ID_v, CAM_ang(0), CAM_ang(1), CAM_ang(2) addpos ID_v, CAM__fv(0), CAM__fv(1), CAM__fv(2) getpos ID_v, CAM_pos(0), CAM_pos(1), CAM_pos(2) ddim camT, 2 camT(0) = -CAM_ang(1) + (M_PI / 2) camT(1) = -CAM_ang(1) - (M_PI / 2) ; カメラの注視点用 ddim CAM_pow, 3 return ;#################################################################### ; hgimg4カメラ (単独行動) ; [ var ] CAM__ID : メインカメラID ; #deffunc hgcam var CAM__ID hgcam_calc@my_hgimg4 CAM__ID CAM_lok(0) = CAM_pos(0) - (cos(camT.1) * cam_D) CAM_lok(1) = CAM_pos(1) + lookat_y CAM_lok(2) = CAM_pos(2) - (sin(camT.1) * cam_D) gplookat CAM__ID, CAM_lok(0), CAM_lok(1), CAM_lok(2) return ;#################################################################### ; hgimg4カメラ (一人称視点) ; [ var ] CAM__ID : メインカメラID ; [ var ] CAM_ctl : 操作用オブジェクトID (操作キャラ) ; [double] cam_y : カメラの高さ ; #deffunc hgcam_FPP var CAM__ID, var CAM_ctl, double cam_y hgcam_calc@my_hgimg4 CAM_ctl CAM_pos(1) += cam_y CAM_lok(0) = CAM_pos(0) - (cos(camT.1) * cam_D) CAM_lok(1) = CAM_pos(1) + lookat_y CAM_lok(2) = CAM_pos(2) - (sin(camT.1) * cam_D) setpos CAM__ID, CAM_pos(0), CAM_pos(1), CAM_pos(2) gplookat CAM__ID, CAM_lok(0), CAM_lok(1), CAM_lok(2) return ;#################################################################### ; hgimg4カメラ (三人称視点) ; [ var ] CAM__ID : メインカメラID ; [ var ] CAM_ctl : 操作用オブジェクトID (操作キャラ) ; [double] cam_y : カメラの高さ ; #deffunc hgcam_TPP var CAM__ID, var CAM_ctl, double cam_y hgcam_calc@my_hgimg4 CAM_ctl CAM_pos(0) -= (cos(camT.0) * cam_D) CAM_pos(1) += cam_y CAM_pos(2) -= (sin(camT.0) * cam_D) CAM_lok(0) = CAM_pos(0) - (cos(camT.1) * cam_D * 2.0) CAM_lok(1) = CAM_pos(1) + lookat_y CAM_lok(2) = CAM_pos(2) - (sin(camT.1) * cam_D * 2.0) setpos CAM__ID, CAM_pos(0), CAM_pos(1), CAM_pos(2) gplookat CAM__ID, CAM_lok(0), CAM_lok(1), CAM_lok(2) return ;#################################################################### ; カメラ座標デバッグ表示 ; #deffunc hgcam_info array ID_ary, var mode, int p1 if p1 { setpos ID_ary(0), CAM_lok(0), CAM_lok(1), CAM_lok(2) setpos ID_ary(1), CAM_pos(0), CAM_pos(1), CAM_pos(2) gplookat ID_ary(1), CAM_lok(0), CAM_lok(1), CAM_lok(2) } rgbcolor 0x000000 : pos 10, 10 mes strf("CAMERA(%.2f, %.2f, %.2f)", CAM_pos(0), CAM_pos(1), CAM_pos(2)) mes strf("lookat(%.2f, %.2f, %.2f)", CAM_lok(0), CAM_lok(1), CAM_lok(2)) mes strf("PPmode : %s", mode) return #global ; my_hgimg4 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #const Space_key 0x00010 #const ESC_key 0x00080 #const Z_key 0x00800 #const X_key 0x01000 #const C_key 0x02000 #const A_key 0x04000 #const W_key 0x08000 #const D_key 0x10000 #const S_key 0x20000 #const E_key_ 69 #const Q_key_ 81 #const V_key_ 86 #define ctype chkey(%1,%2) ((%1 & %2) ! 0) #const winw 1280 #const winh 780 #const double SUBWINX ((2.0 / 3.0) * winw) #const double SUBWINY ((1.0 / 3.0) * winh) PPmode = "3人称視点", "1人称視点", "カメラ独立" ;================================================ ; メイン screen 0, winw, winh setcls CLSMODE_SOLID, 0xA0A0A0 ;----------------------------------------- ; メインカメラ dim ID_staf, 2 : ID_staf(1) = GPOBJ_CAMERA gpnull ID_staf(0) gpcamera ID_staf(0), , , 10 ; 床 gpfloor id_floor, 100, 100, $447777 gppbind id_floor, 0 ; キャラ gpload id, "res/tamane2" setscale id, 0.1, 0.1, 0.1 ; カメラとカメラ視点用 dim ID_box, 3 gpbox ID_box(0), 1, 0xFF0000 : setpos ID_box(0), 0.0, 0.0, 0.0 gpbox ID_box(1), 4, 0xFFFF00 : setpos ID_box(1), 0.0, 0.0, 0.0 gpbox ID_box(2), 4, 0x0000FF setscale ID_box(1), 0.50, 0.50, 3.0 setscale ID_box(2), 0.50, 0.50, 3.0 ;================================================ ; サブ buffer 1, winw, winh, screen_offscreen ;----------------------------------------- ; サブカメラ setpos ID_staf(1), 0.0, 45.0, 90.0 : gplookat ID_staf(1), 0.0, 0.0, 0.0 setpos ID_box(2), 0.0, 45.0, 90.0 : gplookat ID_box(2), 0.0, 0.0, 0.0 gsel 0 hgcam_init 0.60, 0.03, 30.0 ; カメラ設定 //////////////////// メインループ //////////////////// *main await (1000.0 / 60.0) ;============================================ ;キー設定 stick key, (262143 - Space_key) getkey E_key, E_key_ getkey Q_key, Q_key_ getkey V_key, V_key_ if chkey(key, ESC_key) {end} ;------------------------------------------------------ ; カメラキーコンフィグ hgcam_FB chkey(key, W_key), chkey(key, S_key) // 前後 hgcam_YR chkey(key, A_key), chkey(key, D_key) // 旋回 hgcam_XR V_key, chkey(key, C_key) // 仰角 hgcam_UD chkey(key, X_key), chkey(key, Z_key) // 上下 hgcam_RL Q_key, E_key // 左右 ;------------------------------------------------------ ; 視点切り替え if chkey(key, Space_key) {pchk++ : if (2 < pchk) {pchk = 0} } if (pchk = 0) {hgcam_TPP ID_staf(0), id, 30.0} // 三人称視点 else:if (pchk = 1) {hgcam_FPP ID_staf(0), id, 20.0} // 一人称視点 else:if (pchk = 2) {hgcam ID_staf(0) } // カメラ独立 ;============================================ ; サブ描画 gsel 1 redraw 0 gpusecamera ID_staf(1) gpdraw redraw 1 ;============================================ ; メイン描画 gsel 0 redraw 0 gpusecamera ID_staf(0) gpdraw ; サブ画面 rgbcolor 0x000000 : boxf (SUBWINX - 3), 0, winw, (SUBWINY + 3) pos SUBWINX, 0 : gmode 0 : celput 1, 0, (1.0 / 3.0), (1.0 / 3.0) hgcam_info ID_box, PPmode(pchk), 1 ; カメラ情報表示 redraw 1 goto *main



YUZRANIUM

リンク

2023/5/27(Sat) 22:07:00|NO.99521

ちなみに、stick命令とgetkey命令がめんどくさくなったので()
今はuserdef.asに下を乗っけています。

HDLにあるものすべてではないですが、とりあえず個人的に使いそうなものだけです

; stick key number #ifndef __MY_STICK_NUM__ #define global __MY_STICK_NUM__ ; 矢印キー 左 (←) #const global L_arow 0x00001 ; 矢印キー 上 (↑) #const global U_arow 0x00002 ; 矢印キー 右 (→) #const global R_arow 0x00004 ; 矢印キー 下 (↓) #const global D_arow 0x00008 #const global Space_key 0x00010 ; Spaceキー #const global Enter_key 0x00020 ; Enterキー #const global Ctrl_key 0x00040 ; Ctrlキー #const global ESC_key 0x00080 ; ESCキー ; マウスの左ボタン #const global LMB 0x00100 ; マウスの右ボタン #const global RMB 0x00200 #const global TAB_key 0x00400 #const global Z_key 0x00800 #const global X_key 0x01000 #const global C_key 0x02000 #const global A_key 0x04000 #const global W_key 0x08000 #const global D_key 0x10000 #const global S_key 0x20000 #enum global _A_key_ = 65 ; getkey #enum global B_key_ #enum global _C_key_ #enum global _D_key_ #enum global E_key_ #enum global F_key_ #enum global G_key_ #enum global H_key_ #enum global I_key_ #enum global J_key_ #enum global K_key_ #enum global L_key_ #enum global M_key_ #enum global N_key_ #enum global O_key_ #enum global P_key_ #enum global Q_key_ #enum global R_key_ #enum global _S_key_ #enum global T_key_ #enum global U_key_ #enum global V_key_ #enum global _W_key_ #enum global _X_key_ #enum global Y_key_ #enum global _Z_key_ ; L_arow + U_arow + R_arow + D_arow の合計 #const global arow_SUM (L_arow + U_arow + R_arow + D_arow) #const global WASD_SUM (A_key + W_key + D_key + S_key); WASDキーの合計 #const global LRMB_SUM (LMB + RMB) ; Z_key + X_key + C_key の合計 #const global ZXC_SUM (Z_key + X_key + C_key) ; Space_key + Enter_key + Ctrl_key + ESC_key の合計 #const global SECE_SUM (Space_key + Enter_key + Ctrl_key + ESC_key) ; arow_SUM + WASD_SUM + ZXC_SUM + LRMB_SUM + ESC_key #const global key_SUM1 (arow_SUM + WASD_SUM + ZXC_SUM + LRMB_SUM + ESC_key) ; stick キーの合計 #const global key_SUM2 ((arow_SUM + SECE_SUM + LRMB_SUM + ZXC_SUM + WASD_SUM) + TAB_key) ; ((%1 & %2) ! 0) #define global ctype chkey1(%1, %2) ((%1 &%2) ! 0) ; ( (%1 & %2) ! 0 ) & ( (%1 & %3) ! 0 ) #define global ctype chkey2(%1, %2, %3) (((%1 &%2) ! 0) & ((%1 &%3) ! 0)) #endif



YUZRANIUM

リンク

2023/6/10(Sat) 21:45:16|NO.99553

改良版hgimg4用キャラクター/カメラ操作モジュールhgcam

操作キャラを中心とした球面上にカメラを置くようなイメージでカメラのローカル位置を操作できるよ

#include "hgimg4.as" chdir dir_exe + "\\sample\\hgimg4" gpreset ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #module "my_hgimg4" ; 各種情報管理用変数 CAM // ddim CAM, 20 ; ; CAM(0), CAM(1), CAM(2) : カメラ座標 (x, y, z) ; CAM(3), CAM(4), CAM(5) : 焦点座標 (x, y, z) ; ; CAM(6), CAM(7), CAM(8) : 操作キャラ座標 (x, y, z) ; CAM(9), CAM(10), CAM(11) : 操作キャラ角度 (x, y, z) (Rad) ; ; CAM(12) : 焦点距離 ; CAM(13) : カメラ距離 ; CAM(14) : カメラ方位角 (Deg) ; CAM(15) : カメラ天頂角 (Deg) ; CAM(16) : 操作キャラ正面調整角 (ajast) (Deg) ; ; CAM(17) : 移動操作感度 (cam_move) ; CAM(18) : 旋回操作感度 (cam_yaw) ; CAM(19) : 操作状況 (0:カメラ独立, 1:一人称視点, 2:三人称視点) ;#################################################################### ; hgimg4 カメラ設定 ; [array] CAM : 各種情報管理 ; [double] ajast : 操作キャラ正面調整角度 (Deg) ; [double] look : 焦点距離 ; [double] cam_D : カメラ距離 ; [double] cam_move : 移動操作感度 ; [double] cam_yaw : 旋回操作感度 ; #deffunc hgcam_set array CAM, double ajast, double look, double cam_D, double cam_move, double cam_yaw PPmode = "カメラ独立", "1人称視点", "3人称視点" ddim cam_fv, 3 ddim cam_mv, 3 ddim look_mv, 3 ddim CAM, 20 CAM(10) = M_PI CAM(12) = look, cam_D CAM(14) = 90.00, 15.00, ajast CAM(17) = cam_move, cam_yaw return ;#################################################################### ; hgimg4 カメラキーコンフィグ ;======================================================= ; 前後 Front_and_Back #deffunc hgcam_FB array CAM, int p1, int p2 if p1 {cam_mv(2) = CAM(17)} else:if p2 {cam_mv(2) = -CAM(17)} return ;======================================================= ; 左右 Left_and_Right #deffunc hgcam_LR array CAM, int p1, int p2 if p1 {cam_mv(0) = CAM(17)} else:if p2 {cam_mv(0) = -CAM(17)} return ;======================================================= ; 上下 Up_and_Down #deffunc hgcam_UD array CAM, int p1, int p2 if p1 {cam_mv(1) = CAM(17)} else:if p2 {cam_mv(1) = -CAM(17)} return ;======================================================= ; 旋回角 Yaw #deffunc hgcam_YW array CAM, int p1, int p2 if p1 {CAM(10) += CAM(18)} else:if p2 {CAM(10) -= CAM(18)} return ;======================================================= ; 仰俯角 Elevation #deffunc hgcam_EV array CAM, int p1, int p2 if p1 {look_mv(1) += CAM(17)} else:if p2 {look_mv(1) -= CAM(17)} return ;======================================================= ; 操作キャラに対するカメラの方位角 Azimuth #deffunc hgcam_AZ array CAM, int p1, int p2 if p1 {CAM(14) += CAM(17)} else:if p2 {CAM(14) -= CAM(17)} return ;======================================================= ; カメラの天頂角 Zenith #deffunc hgcam_ZE array CAM, int p1, int p2 if p1 {CAM(15) += CAM(17)} else:if p2 {CAM(15) -= CAM(17)} return ;======================================================= ; 焦点距離 #deffunc hgcam_LK array CAM, int p1, int p2 if p1 {CAM(12) += CAM(17)} else:if p2 {CAM(12) -= CAM(17)} return ;======================================================= ; 操作キャラを中心とする球体半径 (カメラの距離) #deffunc hgcam_CL array CAM, int p1, int p2 if p1 {CAM(13) += CAM(17)} else:if p2 {CAM(13) -= CAM(17)} return ;#################################################################### ; hgimg4カメラ内部処理用 ; #deffunc local hgcam_calc array CAM, var ID_ary ddim cam_fv, 3 fvset cam_fv, -CAM(9), -CAM(10), -CAM(11) fvdir cam_fv, cam_mv(0), cam_mv(1), cam_mv(2) setang ID_ary, CAM(9), (CAM(10) + deg2rad(CAM(16))), CAM(11) addpos ID_ary, cam_fv(0), cam_fv(1), cam_fv(2) getpos ID_ary, CAM(6), CAM(7), CAM(8) ddim camT, 4 camT(0) = -CAM(10) + deg2rad(CAM(14)) camT(1) = -CAM(10) - (M_PI / 2.000) camT(2) = deg2rad(CAM(15)) camT(3) = deg2rad(CAM(15)) - M_PI ddim cam_mv, 3 return ;#################################################################### ; hgimg4カメラ (カメラ独立) ; [ var ] CAM_ID : メインカメラID ; #deffunc hgcam array CAM, var CAM_ID hgcam_calc@my_hgimg4 CAM, CAM_ID CAM(0) = CAM(6), CAM(7), CAM(8) CAM(3) = CAM(0) - (CAM(12) * cos(camT.1)) CAM(4) = CAM(1) + look_mv(1) CAM(5) = CAM(2) - (CAM(12) * sin(camT.1)) gplookat CAM_ID, CAM(3), CAM(4), CAM(5) CAM(19) = 0.00 ; 操作状況 return ;#################################################################### ; hgimg4カメラ (一人称視点) ; [ var ] CAM_ID : メインカメラID ; [ var ] CAM_ctl : 操作キャラのID ; [double] cam_y : カメラの高さ ; #deffunc hgcam_FPP array CAM, var CAM_ID, var CAM_ctl, double cam_y hgcam_calc@my_hgimg4 CAM, CAM_ctl CAM(0) = CAM(6) CAM(1) = CAM(7) + cam_y CAM(2) = CAM(8) CAM(3) = CAM(0) - (CAM(12) * cos(camT.1)) CAM(4) = CAM(1) + look_mv(1) CAM(5) = CAM(2) - (CAM(12) * sin(camT.1)) setpos CAM_ID, CAM(0), CAM(1), CAM(2) gplookat CAM_ID, CAM(3), CAM(4), CAM(5) CAM(19) = 1.00 ; 操作状況 return ;#################################################################### ; hgimg4カメラ (三人称視点) ; [ var ] CAM_ID : メインカメラID ; [ var ] CAM_ctl : 操作キャラのID ; [double] cam_y : カメラの高さ ; [double] cam_D : 操作キャラからの距離 ; #deffunc hgcam_TPP array CAM, var CAM_ID, var CAM_ctl hgcam_calc@my_hgimg4 CAM, CAM_ctl CAM(0) = CAM(6) - (CAM(13) * sin(camT.2) * cos(camT.0)) CAM(1) = CAM(7) + (CAM(13) * cos(camT.2)) CAM(2) = CAM(8) - (CAM(13) * sin(camT.2) * sin(camT.0)) CAM(3) = CAM(6) - (CAM(12) * cos(camT.1)) CAM(4) = CAM(7) + look_mv(1) CAM(5) = CAM(8) - (CAM(12) * sin(camT.1)) setpos CAM_ID, CAM(0), CAM(1), CAM(2) gplookat CAM_ID, CAM(3), CAM(4), CAM(5) CAM(19) = 2.00 ; 操作状況 return ;#################################################################### ; hgcam ; #deffunc hgcam_debug array CAM, var Box__ID, var Look_ID setpos Box__ID, CAM(0), CAM(1), CAM(2) setpos Look_ID, CAM(3), CAM(4), CAM(5) gplookat Box__ID, CAM(3), CAM(4), CAM(5) return ;#################################################################### ; カメラ座標表示 #deffunc hgcam_info array CAM rgbcolor 0x000000 mes strf("CAMERA(%.2f, %.2f, %.2f)", CAM(0), CAM(1), CAM(2)) mes strf("距離,方位,天頂角 (%.2f, %.2f, %.2f)", CAM(13), CAM(14), CAM(15)) mes strf("look (%.2f, %.2f, %.2f) %.2f", CAM(3), CAM(4), CAM(5), CAM(12)) mes strf("model (%.2f, %.2f, %.2f)", CAM(6), CAM(7), CAM(8)) mes strf("model (%.2f, %.2f, %.2f)", rad2deg(CAM.9), rad2deg(CAM.10), rad2deg(CAM.11)) mes strf("PPmode = %d : %s", int(CAM.19), PPmode(int(CAM.19))) mes return #global ; my_hgimg4 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; *キー操作 ;------------------------------------------------ ; **一、三人称視点ではキャラ操作、カメラ独立ではカメラ操作 ; ; W / S : 前後 ; A / D : 左右旋回 ; Q / E : 左右 ; X / Z : 上下(鉛直方向) ;------------------------------------------------ ; **カメラの焦点座標(gplookat)操作。 ; どちらも一、三人称視点では操作キャラに対する、カメラ独立ではカメラそのものに対する、ローカル座標 ; ; V / C : 焦点の上下 ; LMB(マウス左)/ RMB(マウス右) :(焦点)距離 ;------------------------------------------------ ; **操作キャラに対するカメラのローカル位置(三人称視点でのみ有効。一人称視点、カメラ独立では無視) ; ; 矢印上下(↑/↓) : カメラの天頂角 ; 矢印左右(←/→) : カメラの方位角 ; F / G : 操作キャラからのカメラの距離(操作キャラを中心とする球体半径) ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #const winw 1280 #const winh 720 #const double SUBWINX ((2.0 / 3.0) * winw) #const double SUBWINY ((1.0 / 3.0) * winh) #const double sub_x 0.00 #const double sub_y 40.0 #const double sub_z 75.0 #const L_arow 0x00001 ; 矢印キー 左 (←) #const U_arow 0x00002 ; 矢印キー 上 (↑) #const R_arow 0x00004 ; 矢印キー 右 (→) #const D_arow 0x00008 ; 矢印キー 下 (↓) #const AROW_SUM (L_arow + U_arow + R_arow + D_arow) #const LMB 0x00100 ; マウス左ボタン #const RMB 0x00200 ; マウス右ボタン #const MB_SUM (LMB + RMB) #const Z_key 0x00800 #const X_key 0x01000 #const C_key 0x02000 #const A_key 0x04000 #const W_key 0x08000 #const D_key 0x10000 #const S_key 0x20000 #const KEY_SUM (W_key + A_key + S_key + D_key + Z_key + X_key + C_key) ;################################################ ; メイン screen 0, winw, winh setcls CLSMODE_SOLID, 0xA0A0A0 dim ID_staf, 3 dim ID_model, 3 dim Box_main_cam, 3 dim Box_look_obj, 3 ; 床 gpfloor id_floor, 75, 75, 0xD3D3D3 gppbind id_floor, 0 ; キャラ gpload ID_model(0), "res/tamane2" : setscale ID_model(0), 0.1, 0.1, 0.1 gpload ID_model(1), "res/duck" : setscale ID_model(1), 4.0, 4.0, 4.0 ; カメラとカメラ視点用 gpbox Box_main_cam(0), 1, 0xFFFF00 : setscale Box_main_cam(0), 1.00, 1.00, 8.00 gpbox Box_main_cam(1), 1, 0x0000FF : setscale Box_main_cam(1), 1.00, 1.00, 8.00 gpbox Box_look_obj(0), 1, 0xFF0000 : setscale Box_look_obj(0), 1.00, 1.00, 1.00 gpbox Box_look_obj(1), 1, 0x00FF00 : setscale Box_look_obj(1), 1.00, 1.00, 1.00 gplookat Box_main_cam(1), 0.0, 0.0, 0.0 setpos Box_main_cam(1), sub_x, sub_y, sub_z ; メインカメラ gpnull ID_staf(0) gpcamera ID_staf(0), , , 10 setpos ID_staf(0), 0.0, 30.0, -10.0 ;################################################ ; サブ1 buffer 1, winw, winh, screen_offscreen ; サブカメラ ID_staf(1) = GPOBJ_CAMERA setpos ID_staf(1), sub_x, sub_y, sub_z gplookat ID_staf(1), 0.0, 0.0, 0.0 ; カメラ設定 hgcam_set CAM_1, 00.0, 30.0, 30.0, 0.6, 0.03 hgcam_set CAM_2, -90.0, 20.0, 30.0, 0.6, 0.03 hgcam_set CAM_3, 00.0, 20.0, 30.0, 0.6, 0.03 ;################################################ ; サブ2 buffer 2, winw, winh, screen_offscreen gpnull ID_staf(2) gpcamera ID_staf(2) setpos ID_staf(2), sub_x, sub_y, sub_z gplookat ID_staf(2), 0.00, 5.00, 0.00 dim PPmode, 3 ; 視点切り替え dim ch ; 操作切り替え ////////// メインループ ////////// *main await (1000.0 / 60.0) ;=============================================================================== ;キー設定 stick key, (KEY_SUM + AROW_SUM + MB_SUM) getkey E_key, 69 getkey F_key, 70 getkey G_key, 71 getkey Q_key, 81 getkey V_key, 86 if ((key & 0x00080) ! 0) {end} ; ESC_key ;------------------------------------------------------- ; 操作切り替え (TABキー) if ((key & 0x00400) ! 0) {ch++ : if (2 < ch) {ch = 0} } ; 視点切り替え (Spaceキー) if ((key & 0x00010) ! 0) { PPmode(ch)++ if (2 < PPmode(ch)) {PPmode(ch) = 0} } ;------------------------------------------------------- ; カメラキーコンフィグ if (ch = 0) { //// たまさん //// hgcam_FB CAM_1, ((key & W_key) ! 0), ((key & S_key) ! 0) // 前後 hgcam_YW CAM_1, ((key & A_key) ! 0), ((key & D_key) ! 0) // 旋回 hgcam_EV CAM_1, V_key, ((key & C_key) ! 0) // 仰角 hgcam_UD CAM_1, ((key & X_key) ! 0), ((key & Z_key) ! 0) // 上下 hgcam_LR CAM_1, Q_key, E_key // 左右 hgcam_AZ CAM_1, ((key & L_arow) ! 0), ((key & R_arow) ! 0) // 操作キャラに対するカメラの方位角 hgcam_ZE CAM_1, ((key & D_arow) ! 0), ((key & U_arow) ! 0) // 操作キャラに対するカメラの天頂角 hgcam_LK CAM_1, ((key & LMB) ! 0), ((key & RMB) ! 0) // 焦点距離 hgcam_CL CAM_1, F_key, G_key // 操作キャラを中心とする球体半径 } else:if (ch = 1) { //// あひる君 //// hgcam_FB CAM_2, ((key & W_key) ! 0), ((key & S_key) ! 0) // 前後 hgcam_YW CAM_2, ((key & A_key) ! 0), ((key & D_key) ! 0) // 旋回 hgcam_EV CAM_2, V_key, ((key & C_key) ! 0) // 仰角 hgcam_UD CAM_2, ((key & X_key) ! 0), ((key & Z_key) ! 0) // 上下 hgcam_LR CAM_2, Q_key, E_key // 左右 hgcam_AZ CAM_2, ((key & L_arow) ! 0), ((key & R_arow) ! 0) hgcam_ZE CAM_2, ((key & D_arow) ! 0), ((key & U_arow) ! 0) hgcam_LK CAM_2, ((key & LMB) ! 0), ((key & RMB) ! 0) hgcam_CL CAM_2, F_key, G_key } else:if (ch = 2) { //// わーるど //// hgcam_FB CAM_3, ((key & W_key) ! 0), ((key & S_key) ! 0) // 前後 hgcam_YW CAM_3, ((key & A_key) ! 0), ((key & D_key) ! 0) // 旋回 hgcam_EV CAM_3, V_key, ((key & C_key) ! 0) // 仰角 hgcam_UD CAM_3, ((key & X_key) ! 0), ((key & Z_key) ! 0) // 上下 hgcam_LR CAM_3, Q_key, E_key // 左右 hgcam_AZ CAM_3, ((key & L_arow) ! 0), ((key & R_arow) ! 0) } ;------------------------------------------------------- ; カメラ, モデル設置 if (ch = 0) { //// たまさん //// if (PPmode(0) = 0) {hgcam_TPP CAM_1, ID_staf(0), ID_model(0)} // 三人称視点 else:if (PPmode(0) = 1) {hgcam_FPP CAM_1, ID_staf(0), ID_model(0), 20.0} // 一人称視点 else:if (PPmode(0) = 2) {hgcam CAM_1, ID_staf(0)} // カメラ独立 } else:if (ch = 1) { //// あひる君 //// if (PPmode(1) = 0) {hgcam_TPP CAM_2, ID_staf(1), ID_model(1)} else:if (PPmode(1) = 1) {hgcam_FPP CAM_2, ID_staf(1), ID_model(1), 10.0} else:if (PPmode(1) = 2) {hgcam CAM_2, ID_staf(1)} } else:if (ch = 2) {hgcam CAM_3, ID_staf(2)} //// わーるど //// ;------------------------------------------------------- ; デバッグ hgcam_debug CAM_1, Box_main_cam(0), Box_look_obj(0) hgcam_debug CAM_2, Box_main_cam(1), Box_look_obj(1) ;=============================================================================== ; 描画処理 ;----------------------------------- ; サブ1 gsel 1 redraw 0 gpusecamera ID_staf(1) gpdraw redraw 1 ;----------------------------------- ; サブ2 gsel 2 redraw 0 gpusecamera ID_staf(2) gpdraw redraw 1 ;----------------------------------- ; メイン gsel 0 redraw 0 ; 使用カメラ切り替え if (ch = 0) {gpusecamera ID_staf(0)} else:if (ch = 1) {gpusecamera ID_staf(1)} else:if (ch = 2) {gpusecamera ID_staf(2)} gpdraw rgbcolor 0x000000 : boxf (SUBWINX - 3), 0, winw, (SUBWINY + 3) pos SUBWINX, 0 : gmode 0 : celput 2, 0, (1.0 / 3.0), (1.0 / 3.0) ; カメラ情報 pos 10, 10 hgcam_info CAM_1 hgcam_info CAM_2 hgcam_info CAM_3 redraw 1 goto *main



YUZRANIUM

リンク

2023/7/2(Sun) 01:14:48|NO.99664

hgimg4用親子設定?
もはやカメラワークですらなくなりました()

とりあえず親、子、孫、ひ孫......
というふうに無限に親子関係を連ねていけるようにしてみました。
(まぁ、当然その分長くなるんですけどね)

この段階で自分の頭の中に描いたものを実現できたのでおおよそ満足です。ハイ。

#include "hgimg4.as" chdir dir_exe + "\\sample\\hgimg4" gpreset #module "myPair" Base, Ang, Move, Yaw, Dir ;#################################################################### ; モジュール初期化 ; #deffunc local _my_Pair_init_ #enum mRadius = 0 #enum mAzimuth #enum mZenith #enum fRadius #enum fAzimuth #enum fZenith #enum mCenter_x #enum mCenter_y #enum mCenter_z #enum fCenter_x #enum fCenter_y #enum fCenter_z ; 自分の座標位置 #enum mpos_x #enum mpos_y #enum mpos_z ; 焦点の座標位置 #enum fpos_x #enum fpos_y #enum fpos_z ; 配列の長さ #enum dim_length ;-------------- #enum mA = 0 #enum mZ #enum fA #enum fZ ddim fv, 3 : ddim mv, 3 : ddim tmp, 3 : ddim camT, 3 sdim obj_name, 64 return ;#################################################################### ; 準備・設定 ;#################################################################### ; モジュール型変数設定 (内部隠蔽) ; #modinit double move_, double yaw_ Move = move_ ; 基本操作感度 Yaw = yaw_ ; 親旋回感度 ; 親座標(x, y, z), カメラ・焦点中心座標(x, y, z) ddim Base, 3 ddim Ang, 3 : Ang(1) = M_PI ; 親旋回角度移動量 ddim Dir, 3 ; 親のデフォ向き調整角 return ; hgimg4 カメラ設定 ; [struct] MOD_var : 各種情報管理 ; [double] move_ : 移動操作感度 ; [double] yaw_ : 旋回操作感度 ; #deffunc hgcam_set array MOD_var, double move_, double yaw_ newmod MOD_var, myPair, move_, yaw_ return ;======================================================= ; ローカルポジション設定 ; [array ] ary : 各種情報管理 ; [double] radius_ : 半径 ; [double] azimuth_ : 方位角 (※度数法) ; [double] zenith_ : 天頂角 (※度数法) ; #deffunc pair_set array ary, double radius_, double azimuth_, double zenith_ ddim ary, dim_length : ary(mRadius) = radius_, azimuth_, zenith_ ary(fRadius) = 1.0 return ;======================================================= ; ローカルポジション(焦点)設定 ; [array ] ary : 各種情報管理 ; [double] radius_ : 半径 ; [double] azimuth_ : 方位角 (※度数法) ; [double] zenith_ : 天頂角 (※度数法) ; #deffunc pair_focus array ary, double radius_, double azimuth_, double zenith_ ary(fRadius) = radius_, azimuth_, zenith_ return ;======================================================= ; 親デフォ向き調整 ; [struct] MOD_var : 各種情報管理 ; [double] x, y, z : 調整角 (※度数法) ; #modfunc hgcam_dir double x, double y, double z Dir = x, y, z return ;======================================================= ; 操作感度再設定 ; [struct] MOD_var : 各種情報管理 ; [double] move_ : 移動感度 ; [double] yaw_ : 旋回感度 ; #modfunc hgcam_ctrl double move_, double yaw_ Move = move_ : Yaw = yaw_ return ;#################################################################### ; 操作 ;#################################################################### ;=================================== ; 親 ;=================================== ; 前後 Front_and_Back ; [struct] MOD_var : 情報管理用変数 ; [ int ] p1, p2 : (前進 / 後退) キー入力情報 ; #modfunc hgcam_FB int p1, int p2 if p1 {mv(2) = Move} else:if p2 {mv(2) = -Move} return ;------------------------------------------------------- ; 左右 Left_and_Right ; [struct] MOD_var : 情報管理用変数 ; [ int ] p1, p2 : (左 / 右) キー入力情報 ; #modfunc hgcam_LR int p1, int p2 if p1 {mv(0) = Move} else:if p2 {mv(0) = -Move} return ;------------------------------------------------------- ; 上下 Up_and_Down ; [struct] MOD_var : 情報管理用変数 ; [ int ] p1, p2 : (上昇 / 下降) キー入力情報 ; #modfunc hgcam_UD int p1, int p2 if p1 {mv(1) = Move} else:if p2 {mv(1) = -Move} return ;------------------------------------------------------- ; 旋回角 Yaw ; [struct] MOD_var : 情報管理用変数 ; [ int ] p1, p2 : (左旋回 / 右旋回) キー入力情報 ; #modfunc hgcam_YW int p1, int p2 if p1 {Ang(1) += Yaw} else:if p2 {Ang(1) -= Yaw} return ;=================================== ; 子 ;=================================== ; 親を中心とする ; [array] ary : 情報管理用変数 ; [ int ] mode : 設定対象 (= 0, 0:Radius / 1:Azimuth / 2:Zenith) ; [ int ] p1, p2 : キー入力情報 ; #modfunc Pair_Ctrl array ary, int mode, int p1, int p2 ddim tmp : tmp = mRadius if (mode = 1) {tmp = mAzimuth} else:if (mode = 2) {tmp = mZenith} if p1 {ary(tmp) += Move} else:if p2 {ary(tmp) -= Move} ddim tmp return ; 親を中心とする ; [array] ary : 情報管理用変数 ; [ int ] mode : 設定対象 (= 0, 0:Radius / 1:Azimuth / 2:Zenith) ; [ int ] p1, p2 : キー入力情報 ; #modfunc FocusCtrl array ary, int mode, int p1, int p2 ddim tmp : tmp = fRadius if (mode = 1) {tmp = fAzimuth} else:if (mode = 2) {tmp = fZenith} if p1 {ary(tmp) += Move} else:if p2 {ary(tmp) -= Move} ddim tmp return ;#################################################################### ; 内部処理 ;#################################################################### ;=================================== ; 座標計算 ;=================================== ; #modfunc local hgcam_calc array ary, int ID ddim fv, 3 fvset fv, -Ang(0), -Ang(1), -Ang(2) fvdir fv, mv(0), mv(1), mv(2) ;--------------- 親のデフォルトの向き調整 ddim tmp, 3 repeat 3: tmp(cnt) = (Ang(cnt) + deg2rad(Dir(cnt))) :loop ;--------------- 親座標計算 setang ID, tmp(0), tmp(1), tmp(2) addpos ID, fv(0), fv(1), fv(2) getpos ID, Base(0), Base(1), Base(2) ; 親座標 ;--------------- 子の中心座標 = 親座標 repeat 3 ary(mCenter_x + cnt) = Base(cnt) ary(fCenter_x + cnt) = Base(cnt) loop ;--------------- 子 ddim camT, 4 camT(mA) = -Ang(1) + deg2rad(ary(mAzimuth)) ; 方位角 camT(mZ) = deg2rad(ary(mZenith)) ; 天頂角 camT(fA) = -Ang(1) + deg2rad(ary(fAzimuth)) ; 方位角 camT(fZ) = deg2rad(ary(fZenith)) ; 天頂角 ddim mv, 3 : ddim tmp, 3 : ddim fv, 3 return ;======================================================= ; hgimg4カメラ内部処理用 ; #deffunc local hgcam_post_process array ary, int myID, int parentID, int Focus_mode setpos myID, ary(mpos_x), ary(mpos_y), ary(mpos_z) if (Focus_mode = 0) { gplookat myID, ary(fpos_x), ary(fpos_y), ary(fpos_z) } else:if (Focus_mode = 1) { ddim tmp, 3 getpos parentID, tmp(0), tmp(1), tmp(2) gplookat myID, tmp(0), tmp(1), tmp(2) ddim tmp, 3 } return ;#################################################################### ; hgimg4カメラ (カメラ独立) ; [ int ] myID : 自分ID ; #modfunc hgcam array ary, int myID hgcam_calc@myPair thismod, ary, myID ary(mpos_x) = Base(0), Base(1), Base(2) ary(fpos_x) = Base(0) - (ary(fRadius) * sin(camT(fZ)) * cos(camT(fA))) ary(fpos_y) = Base(1) + (ary(fRadius) * cos(camT(fZ))) ary(fpos_z) = Base(2) - (ary(fRadius) * sin(camT(fZ)) * sin(camT(fA))) hgcam_post_process@myPair ary, myID return ;#################################################################### ; hgimg4カメラ (一人称視点) ; [ int ] myID : 自分ID ; [ int ] parentID : 親のID ; #modfunc hgcam_F array ary, int myID, int parentID hgcam_calc@myPair thismod, ary, parentID ary(mpos_x) = ary(mCenter_x), ary(mCenter_y), ary(mCenter_z) ary(fpos_x) = ary(fCenter_x) - (ary(fRadius) * sin(camT(fZ)) * cos(camT(fA))) ary(fpos_y) = ary(fCenter_y) + (ary(fRadius) * cos(camT(fZ))) ary(fpos_z) = ary(fCenter_z) - (ary(fRadius) * sin(camT(fZ)) * sin(camT(fA))) hgcam_post_process@myPair ary, myID return ;#################################################################### ; 親子設定? ; [suract] MOD_var : 親子全体設定 ; [array ] ary : "子"の位置情報 ; [ int ] myID : "子"にしたいオブジェクトのID ; [ int ] parentID : "親"にしたいオブジェクトのID ; #modfunc hgcam_T array ary, int myID, int parentID, int Focus_mode hgcam_calc@myPair thismod, ary, parentID ary(mpos_x) = ary(mCenter_x) - (ary(mRadius) * sin(camT(mZ)) * cos(camT(mA))) ary(mpos_y) = ary(mCenter_y) + (ary(mRadius) * cos(camT(mZ))) ary(mpos_z) = ary(mCenter_z) - (ary(mRadius) * sin(camT(mZ)) * sin(camT(mA))) ary(fpos_x) = ary(fCenter_x) - (ary(fRadius) * sin(camT(fZ)) * cos(camT(fA))) ary(fpos_y) = ary(fCenter_y) + (ary(fRadius) * cos(camT(fZ))) ary(fpos_z) = ary(fCenter_z) - (ary(fRadius) * sin(camT(fZ)) * sin(camT(fA))) hgcam_post_process@myPair ary, myID, parentID, Focus_mode return ;#################################################################### ; デバッグ・情報取得 ;#################################################################### ; 表示 ; [array] ary : 各種情報管理 ; [ int ] id : オブジェクトID ; #deffunc pair_debug array ary, int obj_id, int ID ddim tmp, 3 getang ID, tmp(0), tmp(1), tmp(2) setpos obj_id, ary(mpos_x), ary(mpos_y), ary(mpos_z) setang obj_id, tmp(0), tmp(1), tmp(2) ddim tmp return ;#################################################################### ; 座標表示 #deffunc hgcam_info array ary, int id rgbcolor 0x000000 getobjname obj_name, id mes "-------------------------------" mes "" + obj_name mes strf("POS(%.2f, %.2f, %.2f)", ary(mpos_x), ary(mpos_y), ary(mpos_z)) mes strf("RAZ(%.2f, %.2f, %.2f)", ary(mRadius), ary(mAzimuth), ary(mZenith)) return #global //// myPair //// _my_Pair_init_@myPair ; モジュール初期化 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #const ESC_key 0x00080 #const L_arow 0x00001 ; 矢印キー 左 (←) #const U_arow 0x00002 ; 矢印キー 上 (↑) #const R_arow 0x00004 ; 矢印キー 右 (→) #const D_arow 0x00008 ; 矢印キー 下 (↓) #const AROW_SUM (L_arow + U_arow + R_arow + D_arow) #const Z_key 0x00800 #const X_key 0x01000 #const C_key 0x02000 #const A_key 0x04000 #const W_key 0x08000 #const D_key 0x10000 #const S_key 0x20000 #const WASD_SUM (W_key + A_key + S_key + D_key + Z_key + X_key + C_key) #const winw 1280 #const winh 720 #const double SUBWINX ((2.0 / 3.0) * winw) #const double SUBWINY ((1.0 / 3.0) * winh) ;################################################ ; メイン screen 0, winw, winh setcls CLSMODE_SOLID, 0xA0A0A0 dim ID_Camera, 3 dim Box_look_obj, 3 dim ID_Turret dim ID_Shaft_R : dim ID_Barrel_R dim ID_Shaft_L : dim ID_Barrel_L ; 床 gpfloor id_floor, 75, 75, 0xD3D3D3 gppbind id_floor, 0 ; カメラ0とカメラ視点用 gpbox Box_look_obj(0), 0.5, 0x00FF00 : setscale Box_look_obj(0), 6.0, 1.0, 1.0 gpbox Box_look_obj(1), 0.5, 0x0000FF : setscale Box_look_obj(1), 6.0, 1.0, 1.0 ; 砲塔本体 #const C_Color 0x8CB7C8 gpbox ID_Turret, 1, C_Color : setscale ID_Turret, 5.0, 4.0, 4.0 setpos ID_Turret, 0.0, (4.0 / 2), 0.0 setobjname ID_Turret, "Turret" ; 砲身(右) gpbox ID_Barrel_R, 1, C_Color : setscale ID_Barrel_R, 0.3, 0.3, 6.0 setobjname ID_Barrel_R, "Right_Barrel" ; 砲身(左) gpbox ID_Barrel_L, 1, C_Color : setscale ID_Barrel_L, 0.3, 0.3, 6.0 setobjname ID_Barrel_L, "Left_Barrel" ; 砲身軸(右) gpnull ID_Shaft_R setobjname ID_Shaft_R, "Right_Barrel_shaft" ; 砲身軸(左) gpnull ID_Shaft_L setobjname ID_Shaft_L, "Left_Barrel_shaft" ; カメラ0 gpnull ID_Camera(0) gpcamera ID_Camera(0) setpos ID_Camera(0), 0.0, 4.0, 0.0 setobjname ID_Camera(0), "CAM 0" ;################################################ ; サブ1 buffer 1, winw, winh, screen_offscreen ; カメラ1 ID_Camera(1) = GPOBJ_CAMERA setpos ID_Camera(1), 10.0, 10.0, 18.0 gplookat ID_Camera(1), 0.0, 5.0, 0.0 // 親子の位置設定 // ※"親子設定" ではありません!!※ // ※あくまで "親から見た子の位置" 設定です // (親子全体の設定は "モジュール型"変数で, 子の位置情報は個別にdouble型1次元配列変数で) ;=================================== hgcam_set CANON, 0.80, 0.04 ; 親子全体設定 (CANONはモジュール型) ;----------------------------------- pair_set cam_0, 20.0, 225.0, 60.0 ; 砲塔(Turret) を親とするカメラ ;----------------------------------- pair_set rBlook, 2.0, 315.0, 60.0 ; 砲塔(Turret) を親とする 右砲身軸(ID_Shaft_R) pair_set rBarel, 3.5, 270.0, 90.0 ;;;; 右砲身軸(ID_Shaft_R) を親とする 右砲身(ID_Barrel_R) ;----------------------------------- pair_set lBlook, 2.0, 225.0, 60.0 ; 砲塔(Turret) を親とする 左砲身軸(ID_Shaft_L) pair_set lBarel, 3.5, 270.0, 90.0 ;;;; 左砲身軸(ID_Shaft_L) を親とする 左砲身(ID_Barrel_L) ////////// メインループ ////////// *main await (1000.0 / 60) ;=============================================================================== ;キー設定 stick key, (WASD_SUM + AROW_SUM) getkey E_key, 69 getkey F_key, 70 getkey G_key, 71 getkey I_key, 73 getkey J_key, 74 getkey K_key, 75 getkey L_key, 76 getkey O_key, 79 getkey P_key, 80 getkey Q_key, 81 if ((key & ESC_key) ! 0) {end} ; ESC_key ;------------------------------------------------------- ; キーコンフィグ ;----------------------------------- 砲塔本体 hgcam_FB CANON, ((key & W_key) ! 0), ((key & S_key) ! 0) // 前後 hgcam_YW CANON, ((key & A_key) ! 0), ((key & D_key) ! 0) // 旋回 hgcam_UD CANON, ((key & X_key) ! 0), ((key & Z_key) ! 0) // 上下 hgcam_LR CANON, Q_key, E_key // 左右 ;----------------------------------- カメラ0 Pair_Ctrl CANON, cam_0, 0, P_key, O_key Pair_Ctrl CANON, cam_0, 1, ((key & L_arow) ! 0), ((key & R_arow) ! 0) Pair_Ctrl CANON, cam_0, 2, ((key & D_arow) ! 0), ((key & U_arow) ! 0) ;----------------------------------- 左右砲身 (仰俯角) Pair_Ctrl CANON, rBarel, 2, K_key, I_key Pair_Ctrl CANON, lBarel, 2, K_key, I_key ;------------------------------------------------------- ; モデル設置 (※下で"親"と"子"の紐づけを行っている) ; hgcam_T 親子全体設定, "子"の位置情報, "子"にしたいオブジェクトのID, "親"にしたいオブジェクトのID ; hgcam_T CANON, cam_0, ID_Camera(0), ID_Turret, 1 ; カメラ0を砲塔の"子"として配置 ;----------------------------------- hgcam_T CANON, rBlook, ID_Shaft_R, ID_Turret, 1 ; 右の砲身軸を砲塔の"子"として配置 hgcam_T CANON, rBarel, ID_Barrel_R, ID_Shaft_R, 1 ; 右砲身を右の砲身軸の"子"として配置 ;----------------------------------- hgcam_T CANON, lBlook, ID_Shaft_L, ID_Turret, 1 ; 左の砲身軸を砲塔の"子"として配置 hgcam_T CANON, lBarel, ID_Barrel_L, ID_Shaft_L, 1 ; 左砲身を左の砲身軸の"子"として配置 ;------------------------------------------------------- ; デバッグ pair_debug rBlook, Box_look_obj(0), ID_Shaft_R pair_debug lBlook, Box_look_obj(1), ID_Shaft_L ;=============================================================================== ; 描画処理 ;----------------------------------- ; サブ1 gsel 1 redraw 0 gpusecamera ID_Camera(1) gpdraw redraw 1 ;----------------------------------- ; メイン gsel 0 redraw 0 gpusecamera ID_Camera(0) gpdraw rgbcolor 0x000000 : boxf (SUBWINX - 3), 0, winw, (SUBWINY + 3) pos SUBWINX, 0 : gmode 0 : celput 1, 0, (1.0 / 3.0), (1.0 / 3.0) ; 情報 pos 10, 10 hgcam_info cam_0, ID_Camera(0) hgcam_info rBarel, ID_Barrel_R hgcam_info rBlook, ID_Shaft_R hgcam_info lBarel, ID_Barrel_L hgcam_info lBlook, ID_Shaft_L redraw 1 goto *main



YUZRANIUM

リンク

2023/7/2(Sun) 01:32:52|NO.99665

上のスクリプトを実行した動画ですー
ついったーよろですぅー
https://twitter.com/YUZRANIUM/status/1675173100537942016

親子関係はこんな感じ

砲塔 (Turret : CANON) | |---- カメラ (ID_Camera(0) : cam_0) | |---- 右砲身軸 (ID_Shaft_R : rBlook) | |---- 右砲身 (ID_Barrel_R : rBarrel) | |---- 左砲身軸 (ID_Shaft_L : lBlook) |---- 左砲身 (ID_Barrel_L : lBarrel)
砲塔には3人の子ども(カメラ、右砲身軸、左砲身軸)と
2人の孫(右砲身、左砲身)がいます。



リンク

2023/7/16(Sun) 15:14:04|NO.99748

すげえ長いコード頭いいんじゃないの



YUZRANIUM

リンク

2023/7/16(Sun) 16:35:45|NO.99749

> 羊さん
いえいえ、長いのは不要部分が多いからです()

まだまだ未完成なものでして、
今現在も改良・修正中です。



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