なんか楽しくてパコパコ作っちゃった。
もったいないので投下します。
HMD用に作ったので、通常のFPSとは操作方法が異なります。(WASDではないので注意)
・上下キーで前進・後退
・左右キーで旋回
・視点はマウスカーソルが画面の中心からどれだけ離れているかによって決定される。
・旋回は前進・後退に影響するが、視点の変更は前進・後退には影響しない。
↓のソースをエディタにコピペするだけで動くよ。
コメントもほぼ全行に書いてあるし、これを改変すれば1週間余裕じゃにゃい(^・ェ・^?)
;3D描画(フルスクリーン)
#include "e3dhsp3.as" ; Easy3D読込
E3DInit 0, -1, 1, 32, 0, SCID ; Easy3D初期化
;光源初期化
E3DCreateLight Light ; 光源を生成
E3DSetDirectionalLight Light, 0.5, -1, 0, 200, 200, 200 ; 光源の向きと色を設定
;カメラ初期化
CameraDegXZ = 0.0 ; カメラ横平面角度宣言
CameraDegY = 0.0 ; カメラ仰ぎ角度宣言
E3DSetCameraPos 0, 250, 0 ; カメラ初期座標設定
;地面初期化
E3DLoadMQOFileAsGround dir_exe + "\\sample\\easy3d\\Media\\ground.mqo", 10.0, GroundModel ; 地面モデルの読込
;展示品初期化
ArtDir = dir_exe + "\\sample\\easy3d\\Media\\" ; 展示品のフォルダを指定
sdim ArtFile ; 展示品ファイル名配列宣言
ArtFile( 0 ) = "banana.sig" ; 展示品を追加
ArtFile( 1 ) = "slime25.sig" ; 展示品を追加
ArtFile( 2 ) = "tako.sig" ; 展示品を追加
;展示品配置
MaxArtNum = 32 ; 展示品の最大数
dim ArtModel, MaxArtNum ; 展示品モデル配列宣言
randomize ; 乱数生成
repeat MaxArtNum ; 展示品の最大数分、展示品を作成開始
E3DSigLoad ArtDir + ArtFile( rnd( length( ArtFile ) ) ), ArtModel( cnt ) ; 展示品モデルをランダムに読込
E3DSetPos ArtModel( cnt ), -5000 + rnd( 10000 ), rnd( 1000 ), -5000 + rnd( 10000 ) ; 展示品の座標をランダムに設定
loop ; ↑のrepeatに戻ってループする
;マウス座標初期化
DefaultMouseX = ginfo_wx1 + ginfo_winx / 2 ; ウィンドウ横サイズの中心をマウスのデフォルトX座標にする
DefaultMouseY = ginfo_wy1 + ginfo_winy / 2 ; ウィンドウ縦サイズの中心をマウスのデフォルトY座標にする
MauseMoveRateX = 90.0 / ginfo_winx ; マウスを画面の横端まで持っていくとカメラが90度回転するように倍率を設定
MauseMoveRateY = 90.0 / ginfo_winy ; マウスを画面の縦端まで持っていくとカメラが90度回転するように倍率を設定
mouse DefaultMouseX, DefaultMouseY ; マウスカーソルをデフォルト座標に移動
;mouse -1 ; ←※この行を有効にするとマウスカーソルが非表示になる。
;フォント初期化
E3DCreateFont 20, 0, 400, 0, 0, 0, "MS ゴシック", FontID
*main ; メインラベル定義
; シーンの描画を開始
E3DBeginScene SCID ; シーンの描画を開始
;カメラ移動
E3DSetCameraDeg CameraDegXZ, CameraDeg ; カメラの角度を移動用に設定
getkey Left , 37 ; 左キーの状態を取得
getkey Up , 38 ; 上キーの状態を取得
getkey Right, 39 ; 右キーの状態を取得
getkey Down , 40 ; 下キーの状態を取得
if Up : E3DCameraPosForward 20 ; 上キーで前進
if Down : E3DCameraPosForward -20 ; 下キーで後退
if Left : CameraDegXZ += 1 ; 左キーで左旋回
if Right : CameraDegXZ -= 1 ; 右キーで右旋回
;カメラ回転
MouseMoveX = MauseMoveRateX * ( DefaultMouseX - ginfo_mx ) ; マウスの横移動距離を取得
MouseMoveY = MauseMoveRateY * ( DefaultMouseY - ginfo_my ) ; マウスの縦移動距離を取得
E3DSetCameraDeg CameraDegXZ + MouseMoveX, CameraDegY + MouseMoveY ; カメラの角度を描画用に設定
;地面描画
E3DChkInView SCID, GroundModel ; 地面モデルが視野内にあるか判定
E3DRender SCID, GroundModel ; 地面モデルを描画
;展示品描画
repeat MaxArtNum ; 展示品の最大数分、描画を開始
E3DRotateY ArtModel( cnt ), 1 ; 展示品モデルを回転
E3DChkInView SCID, ArtModel( cnt ) ; 展示品モデルが視野内にあるか判定
E3DRender SCID, ArtModel( cnt ) ; 展示品モデルを描画
loop ; ↑のrepeatに戻ってループする
;終了処理
getkey ESC, 27 ; ESCキーの状態を取得
if ESC : end ; ESCキーが押されていれば終了
;操作説明を表示(消しても平気だよ)
E3DDrawTextByFontID SCID, FontID, 0, 0, "↑ : 前進" , 255, 255, 255
E3DDrawTextByFontID SCID, FontID, 0, 20, "↓ : 後退" , 255, 255, 255
E3DDrawTextByFontID SCID, FontID, 0, 40, "← : 左旋回" , 255, 255, 255
E3DDrawTextByFontID SCID, FontID, 0, 60, "→ : 右旋回" , 255, 255, 255
E3DDrawTextByFontID SCID, FontID, 0, 80, "ESC : 終了" , 255, 255, 255
;描画反映
E3DEndScene ; シーンの描画を終了
E3DPresent SCID ; バッファをメインスクリーンにコピー
await 1 ; CPUを休ませる
goto *main ; メインラベルに移動(ループ)