動きません。単体で動かすとできるのですが、自作スクリプト内では動きません。地形データ
などは載せていませんので、みて欠点を指摘していただけるだけでいいです。正確にどんな
スクリプトかというとウィンドウ内でマウスに動きがあればendする簡単なスクリプトです。
単体
自作スクリプト
repeat mx=mousex if oldmx!mx:end oldmx=mx await 100 loop
指摘をお願いします。
#include "hgimg3.as" //3Dオブジェクト #const MESH_X 32 //3Dマップ #const MESH_Y 32 #enum MYFLAG_STAY=0 //キャラモーション #enum MYFLAG_WALK #enum MYFLAG_RUN screen 0,ginfo(20)-65,ginfo(21),0,60,0 hgini //2Dマップ読み込み addmesh meshModel,MESH_X,MESH_Y,0,1600,1600 texload "E:\\hspファイル\\3Dファイル\\地形データ\\2Dmap1.bmp" regobj mesh,meshModel,OBJ_GROUND //3Dマップ読み込み buffer 1 picload "E:\\hspファイル\\3Dファイル\\地形データ\\3Dmap1.bmp" //2D+3Dマップ合成 dim meshArray,MESH_X+1,MESH_Y+1 getvarmap meshArray,MESH_X,MESH_Y,0 meshmap meshArray,meshModel,0+16,0.01 setborder 1580,5,1580 ;動ける範囲 //オブジェクト(キャラクター)登録 addxfile boxmodel,"tamane_s.x" addxanim boxmodel,"tamane_w.x" addxanim boxmodel,"tamane_r.x" #define psz 0.01 //プレイヤーの厚み(幅) regobj player, boxmodel,OBJ_BORDER|OBJ_FLIP|OBJ_STAND|OBJ_MOVE|OBJ_STATIC setscale player,0.005,0.005,0.005 setpos player,0,0,0 objfloor player,0. //高さ //自動追尾カメラ設定 cammode CAM_MODE_AUTOMOVE,player setwork HGOBJ_CAMERA, 3, 0, -2 //距離,0,高さ setdir HGOBJ_CAMERA,0,-1,0 //0,向き,0 //建物の生成 addbox model,1.5,1.5 regobj building1,model setcoli building1,2 //建物のコリジョンIDは2 setscale building1,3,1,2 setpos building1,10,-1,0 //空の色 clscolor $99CCFF mouse ginfo(20)/2+30,ginfo(21)/2 *main nmode=0 //カメラから見たオブジェクトの方向を取得 getpos HGOBJ_CAMERA,x,z,y getpos player,xx,zz,yy t=atan(x-xx,y-yy) addscale HGOBJ_LIGHT ,255,255,255 //ライト stick key,15 if key&128 : end plus = 0 getkey w,87:if w=1:plus=plus+1 getkey s,83:if s=1:plus=plus+2 getkey a,65:if a=1:plus=plus+4 getkey d,68:if d=1:plus=plus+8 if plus&1 :objwalk d,player,-0.1*sin(t), ,-0.1*cos(t):nmode=1 //前 if plus&2 :objwalk d,player, 0.1*sin(t), , 0.1*cos(t):nmode=1 //後 if plus&4 :objwalk d,player,-0.1*cos(t), , 0.1*sin(t):objwalk d,HGOBJ_CAMERA,-0.1*cos(t), , 0.1*sin(t):nmode=1 //左 if plus&8 :objwalk d,player, 0.1*cos(t), ,-0.1*sin(t):objwalk d,HGOBJ_CAMERA, 0.1*cos(t), ,-0.1*sin(t):nmode=1 //右 mx=mousex if oldmx!mx:end oldmx=mx setang player,0,t+3.2,0 on nmode goto *pmove_stay,*forward2,*forward *pmove_stay if myflag!=MYFLAG_STAY { objact player,0 myflag=MYFLAG_STAY } goto*owari *forward if myflag!=MYFLAG_RUN { objact player,2 myflag=MYFLAG_RUN } goto*owari *forward2 if myflag!=MYFLAG_WALK { objact player,1 myflag=MYFLAG_WALK } goto*owari *owari //プレイヤーと全ての建物の当たり判定をしてプレイヤーが建物の内側にいれば直近の壁側に押し出す処理 findobj ,2 //建物のコリジョンIDを検索対象にする getpos player,xx,zz,yy //プレイヤーのX,Z,Y座標をxx,zz,yyに取得 repeat nextobj id:if id<0:break //建物が見つからなくなったら検索終了 getpos id,tx,tz,ty //建物のX,Z,Y座標をtx,tz,tyに取得 getscale id,sx,sz,sy //建物の壁のX,Z,Yサイズをsx,sz,syに取得 //(※boxのサイズは2なのでスケールsx,sz,sy=建物の中心から壁際までの距離になる) if absf(xx-tx)<sx+psz & absf(yy-ty)<sy+psz & absf(zz-tz)<sz+1.4{ //プレイヤーの厚みを含めてプレイヤーが壁の内側に居る場合 //変数fvの配列0〜3に建物の壁 左、上、右、下 4枚の壁の中心座標とプレイヤー座標の距離を取得しておく fv(0)=absf(xx-(tx-sx-psz)) //左の壁 fv(1)=absf(yy-(ty-sy-psz)) //前の壁 fv(2)=absf(xx-(tx+sx+psz)) //右の壁 fv(3)=absf(yy-(ty+sy+psz)) //後の壁 fv(4)=absf(zz-(tz-sz-psz)) //上の壁 fv(5)=absf(zz-(tz+sz+psz)) //下の壁 min=fv:setpos player,tx-sx-psz,tv,yy //押し出すデフォルト座標は建物左側の壁 if fv(1)<min:min=fv(1):setpos player,xx,zz,ty-sy-psz //もし前側の壁が近ければそちらに押し出す if fv(2)<min:min=fv(2):setpos player,tx+sx+psz,zz,yy //もし右側の壁が近ければそちらに押し出す if fv(3)<min:min=fv(3):setpos player,xx,zz,ty+sy+psz //もし後ろ側の壁が近ければそちらに押し出す if fv(4)<min:min=fv(4):setpos player,xx,zz-sz-psz,yy //もし上側の壁が近ければそちらに押し出す if fv(5)<min:min=fv(5):setpos player,xx,zz+sz+psz,yy //もし下側の壁が近ければそちらに押し出す getpos player,xx,zz,yy //押し出し後のプレイヤー座標X,Z,Yをpx,pzに取得しておく } loop hgdraw hgsync 20 goto*main