#include "DxLib.h" #include "StageEditor.h" #include "StageEditor_TopButton.h" #include "StageEditor_Chara.h" #include "StageEditor_Object.h" #include "StageEditor_Event.h" #include "StageEditor_ClearCondition.h" #include "ToolLib.h" #include "TextParam.h" #include #include #include #include #include // カメラの画角 #define CAMERA_FOV (1.2f) // カメラの角度変更速度 #define CAMERA_MOUSE_ANGLE_SPEED (0.0056f) // カメラの移動速度 #define CAMERA_MOUSE_SPEED (10.0f) // カメラの奥行き方向の移動速度 #define CAMERA_MOUSE_Z_SPEED (100.0f) // セーブ完了表示をする時間 #define SAVECOMP_DISPTIME (1.0f) // セーブ完了表示をする座標 #define SAVECOMP_DISPTIME_X (SCREEN_WIDTH - 95) #define SAVECOMP_DISPTIME_Y (SCREEN_HEIGHT - 55) // 編集対象の明滅速度 #define TARGET_BRINK_SPEED (1.0f) // ステージエディターの情報 SStageEditorData g_SEData; // ステージエディターの初期化を行う // 戻り値 : 初期化が成功したか( true:成功した false:失敗した ) static bool StageEditor_Initialize( void ); // ステージエディターの後始末を行う static void StageEditor_Terminate( void ); // ステージエディターのメインループを行う // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) static bool StageEditor_MainLoop( void ); // マウスの状態推移処理を行う static void Mouse_Step( void ); // 状態推移処理を行う // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) static bool Step( void ); // 描画処理を行う static void Render( void ); // カメラのセットアップを行う static void CameraSetup( void ); // ステージエディターの初期化を行う // 戻り値 : 初期化が成功したか( true:成功した false:失敗した ) static bool StageEditor_Initialize( void ) { // 画面の解像度を設定 SetGraphMode( SCREEN_WIDTH, SCREEN_HEIGHT, 32 ); // ウインドウモードで起動する ChangeWindowMode( TRUE ); // ウインドウのテキストを設定 SetWindowText( "Stage Editor" ); // 3Dサウンドの1メートル当たりの値を設定 Set3DSoundOneMetre( 100.0f ); // DXライブラリを初期化 if( DxLib_Init() < 0 ) { return false; } // 描画先を裏画面に設定する SetDrawScreen( DX_SCREEN_BACK ); // ディレクショナルライトの設定を行う ChangeLightTypeDir( VNorm( VGet( 0.5f, -1.0f, -0.5f ) ) ); // フォントの初期化を行う ChangeFontType( DX_FONTTYPE_ANTIALIASING_EDGE_8X8 ); SetFontSize( 16 ); SetFontThickness( 6 ); // ツール処理の初期化を行う if( !Tool_Initialize() ) { return false; } // ステージデータの初期化を行う if( !StageData_Initialize( true ) ) { return false; } // 編集モードを初期化 g_SEData.EditMode = EEditMode_Num; // 各種速度を初期化 g_SEData.Camera.Speed = 0; g_SEData.Camera.SpeedF = 1.0f; g_SEData.MoveSpeed = 0; g_SEData.MoveSpeedF = 1.0f; g_SEData.AngleSpeed = 0; g_SEData.AngleSpeedF = 1.0f; g_SEData.ScaleSpeed = 0; g_SEData.ScaleSpeedF = 1.0f; // キャラ基本情報を初期化 if( !CharaBase_Initialize() ) { return false; } // 編集モード変更用ボタンや速度変更ボタンなどの処理を初期化 if( !StageEditor_TopButton_Initialize() ) { return false; } // キャラクター配置編集処理の初期化 if( !StageEditor_Chara_Initialize() ) { return false; } // オブジェクト配置編集処理の初期化 if( !StageEditor_Object_Initialize() ) { return false; } // イベント配置編集処理の初期化 if( !StageEditor_Event_Initialize() ) { return false; } // クリア条件編集処理の初期化 if( !StageEditor_ClearCondition_Initialize() ) { return false; } // ステージ1を読み込む LoadStage( 0 ); // 正常終了 return true; } // ステージエディターの後始末を行う static void StageEditor_Terminate( void ) { // ツール処理の後始末を行う Tool_Terminate(); // キャラの基本情報の後始末を行う CharaBase_Terminate(); // ステージデータの後始末を行う StageData_Terminate(); // DXライブラリの後始末を行う DxLib_End(); } // ステージエディターのメインループを行う // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) static bool StageEditor_MainLoop( void ) { LONGLONG NowTime; // 現在の時間を取得する g_SEData.TimeTemp = GetNowHiPerformanceCount(); // 最初のフレームの仮の経過時間を設定する g_SEData.StepTime = 0.01f; // ウインドウが閉じられるか、エラーが発生するまでループ while( ProcessMessage() == 0 ) { // 状態推移処理を行う if( !Step() ) { return false; } // 描画処理を行う Render(); // 裏画面の内容を表画面に反映する ScreenFlip(); // 現在の時間を取得する NowTime = GetNowHiPerformanceCount(); // 経過時間を算出する g_SEData.StepTime = ( NowTime - g_SEData.TimeTemp ) / 1000000.0f; // 現在の時間を保存する g_SEData.TimeTemp = NowTime; // 画面をクリアする ClearDrawScreen(); } // 正常終了 return true; } // ステージのデータを読み込む // 戻り値 : ステージの読み込みが成功したか( true:成功した false:失敗した ) bool LoadStage( // 読み込むステージの番号 int StageNumber ) { // 指定のステージのデータを読み込む StageData_Load( StageNumber ); // 画面のUIの状態をリセットする StageEditor_TopButton_UIReset(); // どの編集モードも選ばれていない状態にする g_SEData.EditMode = EEditMode_Num; // キャラ配置編集処理のステージ読み込み後の処理を行う if( !StageEditor_Chara_StageLoadInitialize() ) { return false; } // オブジェクト配置編集処理のステージ読み込み後の処理を行う if( !StageEditor_Object_StageLoadInitialize() ) { return false; } // イベント配置編集処理のステージ読み込み後の処理を行う if( !StageEditor_Event_StageLoadInitialize() ) { return false; } // クリア条件編集処理のステージ読み込み後の処理を行う if( !StageEditor_ClearCondition_StageLoadInitialize() ) { return false; } // カメラの状態を初期化する g_SEData.Camera.Position = VGet( 0.0f, 250.0f, 500.0f ); g_SEData.Camera.HAngle = 0.0f; g_SEData.Camera.VAngle = -0.4f; CameraSetup(); SetupTargetLookAtCamera(); // 正常終了 return true; } // ステージのデータを保存する // 戻り値 : セーブが成功したかどうか( true:成功した false:失敗した ) bool SaveStage( void ) { // ステージのデータを保存する if( StageData_Save() == false ) { return false; } // 「セーブ完了」を表示する時間をセット g_SEData.SaveCompDispTime = SAVECOMP_DISPTIME; // 正常終了 return true; } // マウスの状態推移処理を行う static void Mouse_Step( void ) { int MouseInput; int MouseX; int MouseY; int MouseMoveX; int MouseMoveY; int MouseWheelRot; // 現在のマウスカーソルの座標を取得 GetMousePoint( &MouseX, &MouseY ); // マウスのボタン押下状態を取得 MouseInput = GetMouseInput(); // マウスホイールの回転数を取得 MouseWheelRot = GetMouseWheelRotVol(); // マウスカーソルの移動量を算出 MouseMoveX = MouseX - g_SEData.Mouse.BackX; MouseMoveY = MouseY - g_SEData.Mouse.BackY; // マウスの中心ボタンがクリックされていたら // マウスカーソルの移動量に合わせてカメラの位置をマウスから見た上下左右方向に移動 if( MouseInput & MOUSE_INPUT_MIDDLE ) { g_SEData.Camera.Position.y += -MouseMoveY * CAMERA_MOUSE_SPEED * g_SEData.Camera.SpeedF; g_SEData.Camera.Position = VAdd( g_SEData.Camera.Position, VScale( g_SEData.Camera.Left, -MouseMoveX * CAMERA_MOUSE_SPEED * g_SEData.Camera.SpeedF ) ); } else // マウスの右ボタンがクリックされていたらカメラの向きを変更 if( MouseInput & MOUSE_INPUT_RIGHT ) { g_SEData.Camera.HAngle -= CAMERA_MOUSE_ANGLE_SPEED * MouseMoveX; if( g_SEData.Camera.HAngle < 0.0f ) { g_SEData.Camera.HAngle += DX_PI_F * 2.0f; } else if( g_SEData.Camera.HAngle >= DX_PI_F * 2.0f ) { g_SEData.Camera.HAngle -= DX_PI_F * 2.0f; } g_SEData.Camera.VAngle -= CAMERA_MOUSE_ANGLE_SPEED * MouseMoveY; if( g_SEData.Camera.VAngle < -( DX_PI_F / 2.0f - 0.1f ) ) { g_SEData.Camera.VAngle = -( DX_PI_F / 2.0f - 0.1f ); } if( g_SEData.Camera.VAngle > DX_PI_F / 2.0f - 0.1f ) { g_SEData.Camera.VAngle = DX_PI_F / 2.0f - 0.1f; } } // マウスホイールが回転されたらカメラの位置をカメラから見た前後の方向に移動 if( MouseWheelRot != 0 ) { g_SEData.Camera.Position = VAdd( g_SEData.Camera.Position, VScale( g_SEData.Camera.Front, MouseWheelRot * CAMERA_MOUSE_Z_SPEED * g_SEData.Camera.SpeedF ) ); } // マウスの座標を保存 g_SEData.Mouse.BackX = MouseX; g_SEData.Mouse.BackY = MouseY; // マウスのボタンが押されたかどうか、また、押されていたら // 押された瞬間のマウスカーソルの座標を取得する if( Tool_GetMouseEdgeInput( &g_SEData.Mouse.EdgeInput, &g_SEData.Mouse.ClickPosX, &g_SEData.Mouse.ClickPosY ) != 0 ) { // マウスがクリックされたときにマウスカーソルが指していた座標の // 3D空間での手前座標と奥座標を取得しておく g_SEData.Mouse.ClickPosNear = ConvScreenPosToWorldPos( VGet( ( float )g_SEData.Mouse.ClickPosX, ( float )g_SEData.Mouse.ClickPosY, 0.0f ) ); g_SEData.Mouse.ClickPosFar = ConvScreenPosToWorldPos( VGet( ( float )g_SEData.Mouse.ClickPosX, ( float )g_SEData.Mouse.ClickPosY, 1.0f ) ); } } // 状態推移処理を行う // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) static bool Step( void ) { // 編集対象の明滅用のカウンタの処理を行う g_SEData.TargetColorCounter += TARGET_BRINK_SPEED * g_SEData.StepTime; if( g_SEData.TargetColorCounter > 2.0f ) { g_SEData.TargetColorCounter = 0.0f; } // 「セーブ完了」の表示を行う残り時間を減らす処理を行う if( g_SEData.SaveCompDispTime > 0.0f ) { g_SEData.SaveCompDispTime -= g_SEData.StepTime; if( g_SEData.SaveCompDispTime < 0.0f ) { g_SEData.SaveCompDispTime = 0.0f; } } // マウスの状態推移処理を行う Mouse_Step(); // ツール処理の状態推移処理を行う if( !Tool_Step( g_SEData.StepTime ) ) { return false; } // 編集モード変更用ボタンや速度変更ボタンなどの状態推移処理を行う if( !StageEditor_TopButton_Step() ) { return false; } // 編集モードによって処理を分岐 switch( g_SEData.EditMode ) { case EEditMode_CharaEdit: // キャラ配置編集モードの場合はキャラ配置編集の状態推移処理を行う if( !StageEditor_Chara_Step() ) { return false; } break; case EEditMode_ObjectEdit: // オブジェクト配置編集モードの場合はオブジェクト配置編集の状態推移処理を行う if( !StageEditor_Object_Step() ) { return false; } break; case EEditMode_EventEdit: // イベント配置編集モードの場合はイベント配置編集の状態推移処理を行う if( !StageEditor_Event_Step() ) { return false; } break; case EEditMode_ClearConditionEdit: // クリア条件編集モードの場合はクリア条件編集の状態推移処理を行う if( !StageEditor_ClearCondition_Step() ) { return false; } break; } // 正常終了 return true; } // カメラのセットアップを行う static void CameraSetup( void ) { VECTOR TargetPosition; float temp; float CosParam; float SinParam; // カメラが映す手前距離と置く距離を設定 SetCameraNearFar( 30.0f, 10000.0f ); // カメラが向いている方向のベクトルを算出 g_SEData.Camera.Direction.x = cos( g_SEData.Camera.VAngle ); g_SEData.Camera.Direction.y = sin( g_SEData.Camera.VAngle ); g_SEData.Camera.Direction.z = 0.0f; CosParam = cos( g_SEData.Camera.HAngle ); SinParam = sin( g_SEData.Camera.HAngle ); temp = g_SEData.Camera.Direction.z * CosParam - g_SEData.Camera.Direction.x * SinParam; g_SEData.Camera.Direction.z = g_SEData.Camera.Direction.z * SinParam + g_SEData.Camera.Direction.x * CosParam; g_SEData.Camera.Direction.x = temp; // カメラの注視点を算出 TargetPosition = VAdd( g_SEData.Camera.Direction, g_SEData.Camera.Position ); // カメラの設定を描画処理に反映する SetCameraPositionAndTarget_UpVecY( g_SEData.Camera.Position, TargetPosition ); // カメラから見た左方向と前方方向を算出 g_SEData.Camera.Left = VNorm( VCross( g_SEData.Camera.Direction, VGet( 0.0f, 1.0f, 0.0f ) ) ); g_SEData.Camera.Front = VNorm( VCross( VGet( 0.0f, 1.0f, 0.0f ), g_SEData.Camera.Left ) ); // カメラの画角を設定 SetupCamera_Perspective( CAMERA_FOV ); // 3Dサウンドのリスナーの位置と方向を設定( カメラの位置と向きを設定 ) Set3DSoundListenerPosAndFrontPos_UpVecY( g_SEData.Camera.Position, TargetPosition ); } // カメラの注視点のセットアップを行う void SetupTargetLookAtCamera( void ) { VECTOR TargetPos; // 編集モード別の注視点取得関数を呼ぶ switch( g_SEData.EditMode ) { default: case EEditMode_CharaEdit: StagaEditor_Chara_GetTargetPos( &TargetPos ); break; case EEditMode_ObjectEdit: if( !StagaEditor_Object_GetTargetPos( &TargetPos ) ) { return; } break; case EEditMode_EventEdit: if( !StagaEditor_Event_GetTargetPos( &TargetPos ) ) { return; } break; case EEditMode_ClearConditionEdit: return; } // 注視点とカメラの向きからカメラの座標を更新する g_SEData.Camera.Position = VAdd( TargetPos, VScale( g_SEData.Camera.Direction, -ADD_UNIT_DISTANCE ) ); } // 描画処理を行う static void Render( void ) { int fps; // 明滅用の色を算出 g_SEData.BrinkColor.r = 1.0f; if( g_SEData.TargetColorCounter > 1.0f ) { g_SEData.BrinkColor.b = 1.0f - ( g_SEData.TargetColorCounter - 1.0f ); } else { g_SEData.BrinkColor.b = g_SEData.TargetColorCounter; } g_SEData.BrinkColor.g = g_SEData.BrinkColor.b; g_SEData.BrinkColor.a = 1.0f; // カメラのセットアップ CameraSetup(); // ステージモデルを描画 MV1DrawModel( g_StageData.ModelHandle ); // キャラ配置編集モードの描画処理を実行する StageEditor_Chara_Render(); // オブジェクト配置編集モードの描画処理を実行する StageEditor_Object_Render(); // イベント配置編集モードの描画処理を実行する StageEditor_Event_Render(); // 編集モード変更用ボタンや速度変更ボタンなどの処理の描画処理を実行する StageEditor_TopButton_Render(); // FPSを算出 fps = ( int )( 1.0f / g_SEData.StepTime * 1000.0f ); // 僅かに値がぶれるので、58fps以上は60fpsとして扱う if( fps >= 58000 ) fps = 60000; // FPSの描画 DrawFormatString( 0, SCREEN_HEIGHT - 18, GetColor( 255,255,255 ), "FPS:%.1f", fps / 1000.0f ); // 「セーブ完了」の表示時間が0では無い場合は「セーブ完了」を描画する if( g_SEData.SaveCompDispTime > 0.001f ) { DrawString( SAVECOMP_DISPTIME_X, SAVECOMP_DISPTIME_Y, "セーブ完了", GetColor( 255,255,0 ) ); } // ツール処理の描画処理を行う Tool_Draw(); } // ステージエディターのメイン処理 // 戻り値 : 正常に処理が完了したかどうか // ( true : 正常に処理を完了した false : エラーが発生した ) bool StageEditor_Main( void ) { // ステージエディターの初期化を行う if( !StageEditor_Initialize() ) { return false; } // ステージエディターのメインループを行う if( !StageEditor_MainLoop() ) { return false; } // ステージエディターの後始末をする StageEditor_Terminate(); // 正常終了 return true; }