提示コードの////ここです。 のコード部の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(); }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/07/12 02:47