>カメラをグリグリ動かして、マス目処理するには数学できないとだめでしょうか...
2Dから3D座標の変換はネット上に色々解説はあるだろうから
仕組みは分からなくても目的を達成したいなら下のモジュールを使ってみて
#include "hgimg3.as"
//必ず#include "hgimg3.as"の後に配置
#module
//[---モジュールの初期化---]
//cnvsptowp_init
//必ずhginiの後に実行(カメラのefxグループを変更したりスクリーンサイズを変更した時も実行する必要がある)
//返り値refdvalにスクリーン座標系から3D座標系に変換する実数値が返る
//refdval*スクリーン座標*カメラからの距離で2Dから3Dに出来る
#deffunc cnvsptowp_init
getefx HGOBJ_CAMERA,FOV,NearZ,FarZ
ssx=1.0*ginfo_sx
ssy=1.0*ginfo_sy
whsx=0.5*ssx
whsy=0.5*ssy
wwx=ssx/ginfo_winx
wwy=ssy/ginfo_winy
tc=sin(0.5*FOV)/cos(0.5*FOV)/whsy
return tc
//[---スクリーン座標をワールド座標に変換---]
//fvstw wp, sx, sy, cdz
// wp = 3D座標を取得する配列(wp=x,y,z)
// sx = スクリーンX座標指定
// sy = スクリーンY座標指定
// cdz = カメラからの距離を3D座標系で指定(プラスがカメラの前方向)
//カメラの移動回転に対応
#deffunc fvstw array wp,double sx,double sy,double cdz
getpos HGOBJ_CAMERA,cpx,cpy,cpz
getang HGOBJ_CAMERA,crx,cry,crz
fvset wp,crx,-cry,crz
fvdir wp,(((sx-whsx/wwx)*cdz*tc)*wwx),(sy-whsy/wwy)*cdz*tc*wwy,-cdz
fvadd wp,cpx,cpy,cpz
return
//[---スクリーン座標からレイを飛ばすベクトルを取得---]
//fvray rvec, sx, sy, cdz
// rvec = レイのベクトル(rvec=vx,vy,vz)
// sx = スクリーンX座標指定
// sy = スクリーンY座標指定
// cdz = カメラからの距離を3D座標系で指定
//カメラの移動回転に対応
#deffunc fvray array rvec,double sx,double sy
getang HGOBJ_CAMERA,crx,cry,crz
fvset rvec,crx,-cry,crz
fvdir rvec,(((sx-whsx/wwx)*tc)*wwx),(sy-whsy/wwy)*tc*wwy,-1.0
return
//[---スクリーン座標からレイを飛ばしてワールドY座標が0になる時のワールドX,Z座標を取得---]
//getRayPos wpx, wpy, wpz, sx, sy
// wpx = 3DX座標を取得
// wpy = 3DY座標を取得
// wpz = 3DZ座標を取得
// sx = スクリーンX座標指定
// sy = スクリーンY座標指定
//カメラの移動回転に対応
#deffunc getRayPos var wpx,var wpy,var wpz,double sx,double sy
fvray _rvec, sx, sy
getpos HGOBJ_CAMERA,cpx,cpy,cpz
if 0.0 = _rvec(1) {_rvec(1)=0.00000001}//_rvec(1)が0.0だと次の行で割り算に使えないので適当な小さい数値を入れる(これは地面方向の傾きが0の時の対策)
dis=-cpy/_rvec(1) //カメラの高さをレイのYで割るとY座標0までのカメラからの距離が出る
fvmul _rvec,dis,dis,dis //レイの方向ベクトルに距離を掛ければワールド座標になる
fvadd _rvec,cpx,cpy,cpz //カメラ座標を足してカメラを基準にした座標にする (この二行は fvstw _rvec,sx,sy,dis に置き換ても同等の事が出来る)
wpx=_rvec
wpy=_rvec(1)
wpz=_rvec(2)
return
#global
//モジュールここまで
hgini
//必ずhginiの後に実行(カメラのefxグループを変更したりスクリーンサイズを変更した時も実行)
cnvsptowp_init
chpsize=5.0
setuv 0,0,128,128
addplate m_plate,0,chpsize,chpsize
texload dir_exe+"\\sample\\hgimg3\\chrome.bmp"
bgtex_id=stat
dim mapid,20,20
repeat 20
y=cnt
repeat 20
regobj pid,m_plate
setang pid,-M_PI/2
setpos pid,-chpsize*10+chpsize/2+chpsize*cnt,0.0,-chpsize*10+chpsize/2+chpsize*y
mapid(cnt,y)=pid
loop
loop
addbox mbid,2,2
regobj bid,mbid //3Dカーソル代わりのボックス
setpos 0,0,-100,0
setang 0,-1.4
repeat
stick k,$fff
sx=mousex
sy=mousey
if k=1 {addang HGOBJ_CAMERA,0.0,0.0,-0.01}
if k=4 {addang HGOBJ_CAMERA,0.0,0.0,0.01}
addpos HGOBJ_CAMERA,0.0,-0.01*mousew,-0.01*mousew
if k&512 {
if rc=0{
sx1=sx
sy1=sy
rc=1
}else{
addang HGOBJ_CAMERA,0.01*(sy1-sy),0.01*(sx1-sx),0.0
sx1=sx
sy1=sy
}
}else{
rc=0
}
//カメラ操作が終ってから実行
getRayPos wpx, wpy, wpz, sx, sy
setpos bid,wpx, wpy, wpz
mapx=limit((wpx+chpsize*10)/chpsize,0,19)
mapy=limit((wpz+chpsize*10)/chpsize,0,19)
setefx mapid(mapx,mapy),limit(128+sin(0.1*cnt)*100,0,255)
title ""+mapx+" "+mapy
hgdraw
hgsync 16
loop