共同目的ゲーム制作室1/スクリプトの標準化で議論しながら、このソースを変えていこうと考えてます
ソース
ブラウザFirefoxで見るとスクロールバーが勝手が表示、行番号のずれなど
ちょっとわかりませんorz
ペンマークからだと編集画面に全てのソースが表示されません
#include
//screen
screenw = 640 : screenh = 480
screen 0, screenw, screenh, 1
title "X:ジャンプ V:カメラ回りこみ 大きい棺に向かいジャンプ+↑キー:縁をつかむ"
//初期化
; E3DEnableDbgFile
E3DInit 0, -1, 0, 16, 0, scid1
//file のpath 用のバッファーの作成
pathlen = 2048
sdim mediadir, pathlen
;ステージ読み込み
mediadir = dir_cur + "\\stage"
sdim pathbuf, pathlen, 2
pathbuf.0 = mediadir + "\\kojou_0.mqo"
E3DLoadMQOFileAsGround pathbuf.0, 15.0, toti1
; pathbuf.0 = mediadir + "\\huti.mqo"
; E3DLoadMQOFileAsGround pathbuf.0,15.0,huti
pathbuf.0 = mediadir + "\\ugoku.mqo"
E3DLoadMQOFileAsGround pathbuf.0, 40.0, toti2
;壁データ読み込み
pathbuf.0 = mediadir + "\\wall.mqo"
E3DLoadMQOFileAsMovableArea pathbuf.0,15.0,wall
pathbuf.0 = mediadir + "\\huti.mqo"
E3DLoadMQOFileAsMovableArea pathbuf.0,15.0,huti
pathbuf.0 = mediadir + "\\ugowall.mqo"
E3DLoadMQOFileAsMovableArea pathbuf.0, 15.0,wall2
//プレイヤー読み込み
mediadir = dir_cur + "\\PC"
sdim pathbuf, pathlen, 2
;プレイヤー
pathbuf.0 = mediadir + "\\vega.sig"
E3DSigLoad pathbuf.0, vega,,1.0
;プレイヤー
pathbuf.0 = mediadir + "\\da.sig"
E3DSigLoad pathbuf.0, da,,1.0
;MOAの読み込み
pathbuf.0 = mediadir + "\\vega.moa"
E3DLoadMOAFile vega, pathbuf.0, 5
PC=vega
//カメラの初期化
camposx = 0.0 : camposy = 1500.0 : camposz = -2000.0
E3DSetPos da,camposx, camposy, camposz
camdegxz = 0.0 : camdegy = 0.0
E3DSetCameraDeg camdegxz, camdegy
E3DSetCameraTarget 0,0,0
proj_near = 10.0 : proj_far = 30000.0 : proj_fov = 60.0
E3DSetProjection proj_near, proj_far, proj_fov
//ライトの作成
lightdirx1 = 0.0
lightdiry1 = -1.0
lightdirz1 = 1.0
lightr1 = 255
lightg1 = 255
lightb1 = 255
E3DCreateLight lid1
E3DSetDirectionalLight lid1, lightdirx1, lightdiry1, lightdirz1, lightr1, lightg1, lightb1
//文字
E3DCreateFont fontheight, 0, fontweight, 0, 0, 0, "MS ゴシック", fontid1
//配列変数
dim keybuf0, 256
dim keybuf1, 256
//クウォータニ音
E3DCreateQ q0
E3DCreateQ q1
//初期値
//空中
accy = 0.0 ;速度計算
vely = 0.0 ;座標計算
fmidair = 0 ;空中フラグ(0:地表、1:空中)
grav = -20.0;重力
//移動
upkyori=3000.0 ;カメラ距離
downkyori=2000.0;カメラ距離
yyy=2000
*main
//キー
E3DGetKeyboardState keybuf0
E3DGetKeyboardCnt keybuf1
if keybuf0.VK_ESCAPE = 1 : goto *bye ; [ESC]で終了
//MOA
E3DSetNewPoseByMOA PC, PCeventno
E3DGetMotionFrameNo PC, PCcurmk, PCcurframe
E3DGetNextMotionFrameNo PC,PCcurmk, PCnextmk, PCnextframe
if fmidair=0:PCeventno = 0
//PC操作
gosub*sousa
//ステージの壁、地面の当たり判定
gosub *ChkConf
//カメラ
gosub*camera
//アプリケーションでは、レンダリングを実行する前には必ずこのメソッドを呼び出し、レンダリングの終了時、および再度E3DBeginSceneを呼び出す前には、必ず E3DEndSceneを呼び出す。
E3DBeginScene scid1
;ステージ
E3DChkInView scid1, toti1
E3DRender scid1, toti1,0
E3DRender scid1, toti1,1,,,,,1
E3DChkInView scid1, toti2
E3DRender scid1, toti2
E3DChkInView scid1, huti
E3DRender scid1, huti
;壁
E3DChkInView scid1, wall
E3DChkInView scid1, wall2
;PC
E3DChkInView scid1, PC
E3DRender scid1, PC
;PC
E3DChkInView scid1, da
E3DRender scid1, da
;文字描画
gosub *DrawText
//このメソッドが成功すると、シーンがレンダリングされ、レンダリング後のシーンがデバイス サーフェスに保持される。
E3DEndScene
//バックバッファの内容を、プライマリバッファに転送する
E3DPresent scid1
; mes "aaaaaaa"
//指定したfpsに、近くなるように、waitします。
E3DWaitbyFPS 30, chkfps1
await 0
//E3DChkConfGroundで使用する座標を保存します。
E3DSetBeforePos PC
E3DSetBeforePos da
goto *main
//ESCキーで閉じる
*bye
E3DBye
end
//操作
*sousa
vkey=0
dirx=0
dirz=0
if keybuf0.VK_LEFT = 1 :vkey+=1 ;左
if keybuf0.VK_RIGHT = 1 :vkey+=4 ;右
if keybuf0.VK_UP = 1 :vkey+=2 ;上
if keybuf0.VK_DOWN = 1 :vkey+=8 ;下
if vkey=1 :dirx=-1 :dirz= 0 //左
if vkey=2 :dirx= 0 :dirz=-1 //上
if vkey=3 :dirx=-1 :dirz=-1 //左上
if vkey=4 :dirx= 1 :dirz= 0 //右
if vkey=6 :dirx= 1 :dirz=-1 //右上
if vkey=8 :dirx= 0 :dirz= 1 //下
if vkey=9 :dirx=-1 :dirz= 1 //左下
if vkey=12:dirx= 1 :dirz= 1 //右下
//Y座標を省いたカメラとPCの距離
e3dgetpos PC,px,py,pz
e3dgetpos da,cx,cy,cz
vx=px-cx
;vy=py-cy
vz=pz-cz
E3DVec3Length vx, 0, vz,kyori
//移動スピード
speed=160.0
//特定のモーション、フレームによって移動スピードを0にする
if PCcurmk=6 | jump_mae<=5 | PCcurmk=3 | burasagari=1 : speed=0.0
kaiten_speed=3
//移動スピード
if dirx!=0 & dirz!=0:speed=speed/1.5
//前進
if dirz!=0{
PCeventno=1
e3dgetpos PC,px,py,pz
e3dgetpos da,cx,cy,cz
vx=px-cx
vy=py-cy
vz=pz-cz
e3dinitq q1
E3DLookAtQ q1, vx, 0, vz, dirx, diry, dirz, 0, 1
E3DMultQVec q1,0,0,-1,multvx,multvy,multvz
if dirz=-1{
if kyori>=upkyori{
e3dsetpos da,cx+(multvx*speed) ,cy ,cz+(multvz*speed)
}
e3dsetpos PC,px+(multvx*speed) ,py ,pz+(multvz*speed)
}
if dirz= 1&kyori>=800{
if kyori<=downkyori{
e3dsetpos da,cx+(multvx*speed) ,cy ,cz+(multvz*speed)
}
e3dsetpos PC,px+(multvx*speed) ,py ,pz+(multvz*speed)
}
E3DLookAtQ q0, vx, 0, vz, dirx, diry, dirz, 0, 5
}
//回転
if dirx!=0{
PCeventno=1
e3dgetpos PC,px,py,pz
e3dgetpos da,cx,cy,cz
vx=px-cx
vy=py-cy
vz=pz-cz
e3dinitq q1
E3DLookAtQ q1, vx, 0, vz, dirx, diry, dirz, 0, 1
E3DMultQVec q1,0,0,-1,multvx,multvy,multvz
r = sqrt( (cx - px) * (cx - px) + (cz - pz) * (cz - pz) )
E3DVec3Normalize px + speed * multvx - cx, 0.0, pz + speed * multvz - cz, vx, vy, vz
kaitenx = cx + (vx * r)
;kaiteny = cy
kaitenz = cz + (vz * r)
e3dsetpos PC,kaitenx,py,kaitenz
E3DLookAtQ q0, vx, 0, vz, dirx, diry, dirz, 0, 5
}
//カメラをPCの後ろに回りこませる
if keybuf0.'V' = 1 |cresult=1{
cspped=350.0 ;カメラ回転スピード
if cresult=1:cspped=200.0 ;カメラ回転スピード
E3DMultQVec q0,0,0,-1,multvx,multvy,multvz
e3dgetpos PC,px,py,pz
e3dgetpos da,cx,cy,cz
vcx=cx-(px+(multvx*-upkyori))
vcz=cz-(pz+(multvz*-upkyori))
E3DVec3Length vcx, vcy, vcz,ckyori
E3DVec3Normalize vcx, vcy, vcz,vcx, vcy, vcz
if ckyori>=cspped:E3DSetPos da,cx-(vcx*cspped),cy,cz-(vcz*cspped)
}
//しゃがむ
if keybuf0.'C' = 1 & wresult=0{
PCeventno=2
}
//上昇
if (keybuf1.'X' = 1)&(fmidair = 0):PCeventno=4:jump_mae=0
if jump_mae>=0:jump_mae++;移動を禁止する
if PCcurmk=4 & PCcurframe=5 :jump=250.0:vely = jump:uee=2;モーション5フレーム目でジャンプ
//2段ジャンプ
if (keybuf1.'X' = 1)&(fmidair = 1):PCeventno=32:jump=350.0:vely = jump
//下降
if vely <=-1&(py>(adjusty+500.0)):PCeventno=8
//着地
if ((PCcurmk=4 & PCcurframe>=6)|PCcurmk=5|PCcurmk=7) &(fmidair = 0):PCeventno=16
//ジャンプ、上昇、落下処理
E3DGetPos PC, posx, posy, posz
vely += accy ;速度計算
posy += vely ;座標計算
E3DSetPos PC, posx, posy, posz ;空中
//動く床
e3dsetpos toti2,0,yyy,0
e3dsetpos wall2,0,yyy,0
if yyy=2000:totitime++:totiUP=2
if yyy=4000:totitime++:totiUP=3
if totitime=50&totiUP=2:totitime=0:totiUP=1
if totitime=50&totiUP=3:totitime=0:totiUP=0
if totiUP=1:yyy+=50
if totiUP=0:yyy-=50
//
;E3DSetCameraTarget vx,vy,vz
if vkey > 1 & hwresult = 1{
vely=0
if hwresult!=0:PCeventno=64
e3dsetpos pc,hwadjustx,1710,hwadjustz
E3DLookAtQ q0, hwnx, hwny, hwnz, 0, 0, 1, 0, 2
}
return
*ChkConf
//壁とPCのあたり判定
//ふち判定
E3DChkConfWall PC, huti, 0, hwresult, hwadjustx, hwadjusty, hwadjustz, hwnx, hwny, hwnz
if hwresult=1{
e3dgetpos pc,hwadjustx, hwadjusty, hwadjustz
}
//カメラ位置、PC位置を結んだ線に壁が割り込んでいる判定
E3DChkConfWall2 px,py,pz,cx,cy,cz,wall,60,cresult,cadjustx,cadjusty,cadjustz,cnx,cny,cnz
//カメラ壁判定
E3DChkConfWall da, wall, 60, cwresult, cwadjustx, cwadjusty, cwadjustz, cwnx, cwny, cwnz
if cwresult=1{
e3dsetpos da,cwadjustx, cwadjusty, cwadjustz
//壁にぶつかるとスピードが遅くなるのでカメラの距離を近づける
e3dgetpos da,cx,cy,cz
e3dgetpos PC,px,py,pz
vx=px-cx
vz=pz-cz
E3DVec3Length vx, 0, vz,vykyori
E3DVec3Normalize vx, 0, vz,vnx, vny, vnz
E3DSetPos da,cx+(vnx*100.0),cy,cz+(vnz*150.0)
}
; E3DGetCameraPos old_cx,old_cy,old_cz
e3dgetpos PC ,px,py,pz
E3DChkConfWall PC, wall, 60, wresult, wadjustx, wadjusty, wadjustz, wnx, wny, wnz
E3DChkConfWall PC, wall2, 60, wresult2, wadjustx2, wadjusty2, wadjustz2, wnx2, wny2, wnz2
if wresult!=0{
e3dsetpos PC,wadjustx, py, wadjustz
}
if wresult2!=0{
e3dsetpos PC,wadjustx2, py, wadjustz2
}
//地面とPCのあたり判定
mapheight = 200.0 ;高さの最大値
mapminy = -10000 ;地面データのY座標の最小値。実際の最小値より、少し小さな値を入れる。
E3DChkConfGround PC, toti2, 1, mapheight, mapminy, mterrain2, adjustx2, adjusty2, adjustz2, nx2, ny2, nz2
E3DChkConfGround PC, toti1, 1, mapheight, mapminy, mterrain, adjustx, adjusty, adjustz, nx, ny, nz
; E3DChkConfGround PC, huti, 1,mapheight, mapminy, hwresult, hwadjustx, hwadjusty, hwadjustz, hwnx, hwny, hwnz
if (posy>adjusty+200.0){
accy = grav
fmidair = 1 ;空中フラグon
} else {
accy = 0.0
vely = 0.0
fmidair = 0 ;空中フラグoff
E3DSetPos PC, adjustx, adjusty, adjustz ;地面の上に移動
}
ycsp=100;カメラのY座標、移動スピード
if adjusty2>adjusty{
if (posy>adjusty2+100.0)|(mterrain2=0) {
accy = grav
fmidair = 1 ;空中フラグon
} else {
accy = 0.0
vely = 0.0
fmidair = 0 ;空中フラグoff
E3DSetPos PC, adjustx2, adjusty2, adjustz2 ;地面の上に移動
ycsp=50
}
}
return
*camera
//カメラのY座標設定
e3dgetpos da,cx,cy,cz
e3dgetpos PC,px,py,pz
vy=(py+2000)-cy
E3DVec3Length 0, vy, 0,vykyori
E3DVec3Normalize 0, vy,0,vnx, vny, vnz
if (vykyori>=ycsp)&(vely <= jump-ycsp):E3DSetPos da,cx,cy+(vny*ycsp),cz
//PC向き
E3DSetDirQ2 PC, q0
//カメラ向き
e3dgetpos PC,px,py,pz
e3dgetpos da,cx,cy,cz
E3DSetCameraPos cx,cy,cz
E3DGetCameraPos cx,cy,cz
vx=px-cx
vy=py-(cy)
vz=pz-cz
E3DCameraLookAt vx, vy+1000, vz,0,3
return
*DrawText
textr = 250 : textg = 250 : textb = 250
textscale = 1
textposx = 5 : textposy = 5
strchk3 = "PC_X " + pcnx + " : PC_Y " + pcny+ " : PC_Z " +pcnz
E3DDrawText textposx, textposy, textscale, textr, textg, textb, strchk3
textposy +=20
strchk3 = "chkfps1 " +hwresult+"*"+py
E3DDrawText textposx, textposy, textscale, textr, textg, textb, strchk3
return