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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1124
まめすけ3Dシムシティのカーソル処理とカメラ処理2解決


まめすけ

リンク

2013/11/24(Sun) 00:57:23|NO.58413

シムシティのようなゲームを作っているんですが、カーソルのマス目処理ができなくて困っています。

仕方ないから見下ろしにして、当たり判定でマス目の処理をさせてるんですけど...
カメラをグリグリ動かして、マス目処理するには数学できないとだめでしょうか...

サイン?コサイン?タンジェント?なにそれ美味しいの状態です。

すみません。なにか方法はないでしょうか。

hgimg3です。



この記事に返信する


暇人

リンク

2013/11/24(Sun) 13:31:06|NO.58425

>カメラをグリグリ動かして、マス目処理するには数学できないとだめでしょうか...
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



まめすけ

リンク

2013/11/26(Tue) 21:44:13|NO.58477

遅くなってしまいすみません。
使わせていただきます。ありがとうございました!



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