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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

SDL (Simple DirectMedia Layer)

SDL (Simple DirectMedia Layer)は、C言語で記述されたクロスプラットフォームのマルチメディアライブラリです。画像や音などを 統一してアクセスするためのAPIを提供。LinuxやWindows、各種MacOSなどを公式にサポートしています。

Q&A

解決済

1回答

1344閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

SDL (Simple DirectMedia Layer)

SDL (Simple DirectMedia Layer)は、C言語で記述されたクロスプラットフォームのマルチメディアライブラリです。画像や音などを 統一してアクセスするためのAPIを提供。LinuxやWindows、各種MacOSなどを公式にサポートしています。

0グッド

0クリップ

投稿2020/07/11 12:31

提示コードの////ここです。 のコード部の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(); }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

投稿2020/07/11 14:50

編集2020/07/12 02:59
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/12 02:47

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問