Windows10 Anime Class

Windows10 DirectX の Anime Class で美人のアニメーションを行います。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. DirectX2D Anime Class に掲載している Anime Class を使うと簡単です。
    Win10 Base を参照して「Windows10 ベースプロジェクト」を構築して下さい。
    ベースプロジェクトが存在するときは、フォルダーごとコピーしてフォルダー名を変更してもOKです。
    プロジェクトの名前は App1 にします。
  2. DirectX2D Anime Class から Anime.h, Anime.cpp を App1\Content\ のフォルダーに格納して下さい。
    また Bijin.jpg を App1\ のフォルダーに格納して下さい。
    App1 を選択して[追加][既存の項目]からプロジェクトに追加します。
  3. App1Main.h を選択して Anime.h を取り込んで、m_Anime を定義します。
    #include "Content\Anime.h"
    
            ・・・
    
            // TODO: これを独自のコンテンツ レンダラーで置き換えます。
            std::unique_ptr<Anime> m_Anime;
    
  4. App1Main.cpp で Anime Class を使って美人のアニメーションを描画します。
    App1Main の Constructor で Anime Class を生成して、"Bijin.jpg" をロードします。
    96, 96 は Sprite のサイズです。
    Update() 関数で Sprite 番号を更新します。
    Render() 関数でアニメーションを描画します。
    200, 200 は描画する座標です。
    #include "pch.h"
    #include "App1Main.h"
    #include "Common\DirectXHelper.h"
    
    using namespace App1;
    using namespace Windows::Foundation;
    using namespace Windows::System::Threading;
    using namespace Concurrency;
    
    // アプリケーションの読み込み時にアプリケーション資産を読み込んで初期化します。
    App1Main::App1Main(const std::shared_ptr<DX::DeviceResources>& deviceResources) :
        m_deviceResources(deviceResources)
    {
        // デバイスが失われたときや再作成されたときに通知を受けるように登録します
        m_deviceResources->RegisterDeviceNotify(this);
    
        // TODO: これをアプリのコンテンツの初期化で置き換えます。
        m_Anime = std::unique_ptr<Anime>(new Anime(m_deviceResources));
        m_Anime->Load(L"Bijin.jpg", 96, 96);
    
        // TODO: 既定の可変タイムステップ モード以外のモードが必要な場合は、タイマー設定を変更してください。
        // 例: 60 FPS 固定タイムステップ更新ロジックでは、次を呼び出します:
        /*
        m_timer.SetFixedTimeStep(true);
        m_timer.SetTargetElapsedSeconds(1.0 / 60);
        */
    }
    
    App1Main::~App1Main()
    {
        // デバイスの通知を登録解除しています
        m_deviceResources->RegisterDeviceNotify(nullptr);
    }
    
    //ウィンドウのサイズが変更される (デバイスの方向が変更されるなど) 場合に、 アプリケーションの状態を更新します。
    void App1Main::CreateWindowSizeDependentResources() 
    {
        // TODO: これをアプリのコンテンツのサイズに依存する初期化で置き換えます。
    }
    
    // アプリケーション状態をフレームごとに 1 回更新します。
    void App1Main::Update() 
    {
        // シーン オブジェクトを更新します。
        m_timer.Tick([&]()
        {
            // TODO: これをアプリのコンテンツの更新関数で置き換えます。
            m_Anime->Update(m_timer);
        });
    }
    
    // 現在のアプリケーション状態に応じて現在のフレームをレンダリングします。
    // フレームがレンダリングされ、表示準備が完了すると、true を返します。
    bool App1Main::Render() 
    {
        // 初回更新前にレンダリングは行わないようにしてください。
        if (m_timer.GetFrameCount() == 0)
        {
            return false;
        }
    
        auto context = m_deviceResources->GetD3DDeviceContext();
    
        // ビューポートをリセットして全画面をターゲットとします。
        auto viewport = m_deviceResources->GetScreenViewport();
        context->RSSetViewports(1, &viewport);
    
        // レンダリング ターゲットを画面にリセットします。
        ID3D11RenderTargetView *const targets[1] = { m_deviceResources->GetBackBufferRenderTargetView() };
        context->OMSetRenderTargets(1, targets, m_deviceResources->GetDepthStencilView());
    
        // バック バッファーと深度ステンシル ビューをクリアします。
        context->ClearRenderTargetView(m_deviceResources->GetBackBufferRenderTargetView(), DirectX::Colors::CornflowerBlue);
        context->ClearDepthStencilView(m_deviceResources->GetDepthStencilView(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
    
        // シーン オブジェクトをレンダリングします。
        // TODO: これをアプリのコンテンツのレンダリング関数で置き換えます。
        m_Anime->Render(200, 200);
    
        return true;
    }
    
    // デバイス リソースを解放する必要が生じたことをレンダラーに通知します。
    void App1Main::OnDeviceLost()
    {
    }
    
    // デバイス リソースの再作成が可能になったことをレンダラーに通知します。
    void App1Main::OnDeviceRestored()
    {
        CreateWindowSizeDependentResources();
    }
    
  5. Anime Class の画像全体をテスト描画する関数です。
    画像を切り分けて描画する関数は Anime.cpp を参照して下さい。
    // 画像全体をテスト描画
    void Anime::Render()
    {
        m_d2dContext->BeginDraw();  
        m_d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));
        m_d2dContext->DrawBitmap(m_bitmapPerspective.Get());
        HRESULT hr = m_d2dContext->EndDraw();
        if (hr != D2DERR_RECREATE_TARGET)
        {   DX::ThrowIfFailed(hr);  }
    }
    

超初心者のプログラム入門(DirectX Store)