質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

SDLライブラリ TTF_OpenFont();の引数にフォントファイル名を指定する方法が知りたい。どれをやってもエラーになる原因と対処法が知りたい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 677
退会済みユーザー

退会済みユーザー

提示コードの////ここです。 のコード部のif文ですがなぜ上の行のTTF_OpenFont();の第一引数のフォントのファイル名を指定することができないのでしょうか?拡張子をつける。付けないも試しました。また参考サイトからフォントデータをインストールしたり公式リファレンスを確認したりと色々試しましたが何をやってもnullptrになってしまいます。原因と対処方法が知りたいです。インストールしたフォントがなぜ開けないのか?
printf();のエラー出力結果         Couldn't open ipaexg.ttf  

参考サイト(A): https://ipafont.ipa.go.jp/
参考サイト(B):
https://www.hiroom2.com/2015/05/17/sdl2%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E6%8F%8F%E7%94%BB%E5%87%A6%E7%90%86/#sec-1

参考サイト(公式リファレンス): http://sdl2referencejp.osdn.jp/TTF_OpenFont.html

#include "Game.hpp"

const int thickness = 15;//厚さ
const float paddleH = 100.0f;//高さ

//コンストラクタ
Game::Game()
    :mWindow(nullptr)
    ,mRenderer(nullptr)
    ,mTicksCount(0)
    ,mIsRunning(true)
    ,mPaddleDir(0)
{

}

//初期化
//成功時:true 失敗時: false
bool Game::Initialize()
{
    //SDLの初期化
    int sdlResult = SDL_Init(SDL_INIT_VIDEO);
    if(sdlResult != 0)
    {
        SDL_Log("Unnable to initialize SDL: %s",SDL_GetError());
        return false;
    }

    //SDL ウインドを生成
    mWindow = SDL_CreateWindow(
        "Game Programming in C++ (chapter 1)",
        400,
        100,
        1024,
        768,
        0
        );

    //ウインドウ生成エラー
    if(!mWindow)
    {
        SDL_Log("failed to create window: %s",SDL_GetError());
        return false;
    }

    mRenderer = SDL_CreateRenderer(
        mWindow, // Window to create renderer for
        -1,         // Usually -1
        SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC
    );

    //レンダリング エラー
    if(!mRenderer)
    {
        SDL_Log("failed to create renderer %s",SDL_GetError());
        return false;

    }


    //TTFエンジンを初期化
    if(TTF_Init() == -1)
    {
        printf("bnbbb\n");
        exit(1);
        return false;
    }

    mfont = TTF_OpenFont("ipaexg.ttf",24);
    if(mfont == nullptr)//////////////////////////////ここのコードです。
    {
        printf("%s\n", TTF_GetError());
        return false;
    }

    SDL_Color mTextColor;
    mTextColor.r = 0;
    mTextColor.g = 0;
    mTextColor.b = 255;
    mTextColor.a = 0;

    image = TTF_RenderUTF8_Blended(mfont,"あいうえお\0",mTextColor);



    //パドル座標
    mPaddlePos.x = 10.0f;
    mPaddlePos.y = 768.0f / 2.0f;

    //ボール座標
    mBallPos.x = 1024.0f / 2.0f;
    mBallPos.y = 768.0f / 2.0f;

    //ボールの速度
    mBallVel.x = -200.0f;
    mBallVel.y = 235.0f;

    return true;
}

//ゲームループ
void Game::RunLoop()
{
    while(mIsRunning)
    {
        ProcessInput();
        UpdateGame();
        GenerateOutput();
    }
}

//入力処理
void Game::ProcessInput()
{
    SDL_Event event;
    while(SDL_PollEvent(&event))
    {
        //イベント処理
        switch(event.type)
        {
            case SDL_QUIT:
                mIsRunning = false;
                break;
        }
    }

    //キーボード
    const Uint8 *state = SDL_GetKeyboardState(NULL);
    if(state[SDL_SCANCODE_ESCAPE])
    {
        mIsRunning = false;
    }

    mPaddleDir = 0;
    if(state[SDL_SCANCODE_W])//W
    {
        mPaddleDir -= 1;
    }

    if(state[SDL_SCANCODE_S])//S
    {
        mPaddleDir += 1;
    }

}

void Game::UpdateGame()
{
    //フレーム
    //while(!SDL_TICKS_PASSED(SDL_GetTicks(),mTicksCount + 16));

    float deltaTime = (SDL_GetTicks() - mTicksCount) / 1000.0f;
    if(deltaTime > 0.05f)
    {
        deltaTime = 0.05f;
    }

    mTicksCount = SDL_GetTicks();

    if(mPaddleDir != 0)//パドル操作中だったら
    {
        mPaddlePos.y += mPaddleDir * 300.0f * deltaTime;

        if(mPaddlePos.y < (paddleH / 2.0f + thickness) )
        {
            mPaddlePos.y = paddleH / 2.0f + thickness;
        }else if(mPaddlePos.y > (768.0f - paddleH / 2.0f - thickness))
        {
            mPaddlePos.y = (768.0f - paddleH / 2.0f - thickness);
        }
    }


    //ボール移動
    mBallPos.x += mBallVel.x * deltaTime;
    mBallPos.y += mBallVel.y * deltaTime;
    //printf("x: %.2f\n",mBallVel.x);
    //printf("y: %.2f\n",mBallVel.y);

    float diff = mPaddlePos.y - mBallPos.y;
    diff = (diff > 0.0f) ? diff : -diff;

    if(diff <= paddleH / 2.0f && mBallPos.x <= 25.0f && mBallVel.x < 0.0f)
    {
        //mBallVel.x *= -1.0f;
    }else if(mBallPos.x  <= 0.0f && mBallVel.x < 0.0f)//left wall 跳ね返り
    {
        printf("Left Collision \n");

        mBallVel.x *= -1.0f;

    }else if(mBallPos.x >= (1024.0f - thickness) && mBallVel.x > 0.0f)//right wall 跳ね返り
    {
        printf("Right Collision \n");

        mBallVel.x *= -1.0f;
    }

    if(mBallPos.y <= thickness && mBallVel.y < 0.0f)
    {
        mBallVel.y *= -1;
    }else if(mBallPos.y >= (768 - thickness) && mBallVel.y > 0.0f)
    {
        mBallVel.y *= -1;
    }


}


//出力
void Game::GenerateOutput()
{
    //色を設定 青
    SDL_SetRenderDrawColor(mRenderer,
        0,
        0,
        255,
        255
    );

    SDL_RenderClear(mRenderer);
    SDL_SetRenderDrawColor(mRenderer,255,255,255,255);

    SDL_Rect wall
    {
        0,
        0,
        1024,
        thickness
    };

    SDL_RenderFillRect(mRenderer,&wall);
    wall.y = 768 - thickness;
    SDL_RenderFillRect(mRenderer,&wall);

    wall.x = 1024 - thickness;
    wall.y = 0;
    wall.w = thickness;
    wall.h = 1024;
    SDL_RenderFillRect(mRenderer,&wall);

    //paddle draw
    SDL_Rect paddle{
        static_cast<int>(mPaddlePos.x),
        static_cast<int>(mPaddlePos.y - paddleH / 2),
        thickness,
        static_cast<int>(paddleH),
    };
    SDL_RenderFillRect(mRenderer,&paddle);


    //ball draw
    SDL_Rect ball{
        static_cast<int>(mBallPos.x - thickness / 2),
        static_cast<int>(mBallPos.y - thickness / 2),
        thickness,
        thickness,
    };
    SDL_RenderFillRect(mRenderer,&ball);

    //front buffer and back buffer
    SDL_RenderPresent(mRenderer);
}


void Game::Shutdown()
{
    SDL_DestroyRenderer(mRenderer);
    SDL_DestroyWindow(mWindow);
    SDL_Quit();
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

参考サイトからフォントデータをインストールしたり

具体的にはどうしたのでしょうか?
実行ファイルと同じ場所にipaexg.ttfをコピーしたのであれば、カレントディレクトリが違うだけでは?
VisualStudioのデフォルト設定ではVisualStudioからの実行時のカレントディレクトリはプロジェクトファイルのあるディレクトリになっています。
プロジェクトファイル(拡張子vcxproj)と同じ場所にipaexg.ttfをコピーするか、
構成プロパティ-デバッグ-作業ディレクトリ$(ProjectDir)$(TargetDir)に変えてみてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/12 11:47

    プロジェクトファイル(拡張子vcxproj)と同じ場所にipaexg.ttfをコピーする。方法により解決しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • C++に関する質問
  • SDLライブラリ TTF_OpenFont();の引数にフォントファイル名を指定する方法が知りたい。どれをやってもエラーになる原因と対処法が知りたい。