提示コードのInitialize();関数部の//文字表示用テキストファイルを取得というコードの部分ですが文字コードの関係でUTF-8とVisual studioの文字コードがshift-jisの関係でただ文字を"あいうえお"と入力しても文字化けしてしまうのでテキストファイルを取得する方式をなくなく導入したいのですがこれはVisual studioの文字コードをUTF-8に変更するしか方法はないのでしょうか?調べましたがソースコード内で文字コードを変更する方法はないようです。
#include "Game.hpp" const int thickness = 15;//厚さ const float paddleH = 100.0f;//高さ #define WINDOW_WIDTH (float)1024.0f #define WINDOW_HEIGHT (float)768.0f //コンストラクタ Game::Game() :mWindow(nullptr) ,mRenderer(nullptr) ,mTicksCount(0) ,mIsRunning(true) ,mPaddleDir(0) { } //初期化 //成功時:true 失敗時: false bool Game::Initialize() { //TTFエンジンを初期化 if(TTF_Init() == -1) { // printf("bnbbb\n"); exit(1); return false; } //文字表示用テキストファイルを読み込む errno_t e = fopen_s(&mText_File,"utf-8Text.txt","r"); if(e != 0) { printf("%d\n",e); exit(1); } fgets(str,100,mText_File); if(str == nullptr ) { printf("fgets() エラー"); exit(1); } //文字の色を設定 黒 mTextColor.r = 200; mTextColor.g = 200; mTextColor.b = 255; mTextColor.a = 255; mfont = TTF_OpenFont("ipaexg.ttf",50); if(mfont == nullptr) { printf("%s\n", TTF_GetError()); return false;//exit(1); } // printf("aaaa\n"); //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, WINDOW_WIDTH, WINDOW_HEIGHT, 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; } //パドル座標 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)); // printf("paddlePos.x: %.2f\n",mPaddlePos.x); // printf("paddlePos.y: %.2f\n",mPaddlePos.y); 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); //-----------------------------------------------------当たり判定-------------------------------------------------------------------------------------------- //壁に当たっときの跳ね返り 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; }else if(mBallPos.y >= (WINDOW_HEIGHT - thickness) && mBallVel.y > 0.0f)//下部の 跳ね返り { //printf("up Collision \n"); mBallPos.y = (WINDOW_HEIGHT - thickness); mBallVel.y *= -1.0f; }else if(mBallPos.y <= ( 0.0f + thickness ) && mBallVel.y < 0.0f)//上部の 跳ね返り { //printf("down Collision\n"); mBallPos.y = thickness; mBallVel.y *= -1.0f; } //パドルと衝突判定 if((mPaddlePos.x + thickness >= mBallPos.x)) { if((mPaddlePos.y + paddleH >= mBallPos.y && mPaddlePos.y <= mBallPos.y + thickness)) { mBallVel.x *= -1.0f; } } //------------------------------------------------------------------------------------------------------------------------------------------------------- } //描画 void Game::GenerateOutput() { //背景色を設定 青 SDL_SetRenderDrawColor(mRenderer, 0, 0, 0, 255 ); SDL_RenderClear(mRenderer); mfont = TTF_OpenFont("ipaexg.ttf",50); //SDL_RenderClear(mRenderer); SDL_SetRenderDrawColor(mRenderer,200,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); //-------------------------文字描画 //文字を描写したTextureのサイズを取得する int iw = 0,ih = 0; //Textureを描写する //描写元の描写する部分,描写先の描写する部分) //サイズが違うと勝手にTextureを伸展してくれる image = TTF_RenderUTF8_Blended(mfont,str,mTextColor); texture = SDL_CreateTextureFromSurface(mRenderer,image); SDL_SetRenderDrawColor(mRenderer,0,0,0,255); SDL_QueryTexture(texture, NULL, NULL, &iw, &ih); SDL_Rect txtRect = {0,0,iw,ih}; SDL_Rect pasteRect = {100,100,iw,ih}; SDL_RenderCopy(mRenderer, texture, &txtRect, &pasteRect);//画面に書き込む //------------------------- //front buffer and back buffer SDL_RenderPresent(mRenderer); SDL_FreeSurface(image); SDL_DestroyTexture(texture); TTF_CloseFont(mfont); } void Game::Shutdown() { SDL_DestroyRenderer(mRenderer); SDL_DestroyWindow(mWindow); SDL_Quit(); }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/12 10:17
退会済みユーザー
2020/07/12 11:15