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

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

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

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

SDL (Simple DirectMedia Layer)

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

Q&A

解決済

2回答

1667閲覧

SDLライブラリ 文字コードをソースコード上で引数に渡すときに変更する方法はないのか?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

SDL (Simple DirectMedia Layer)

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

0グッド

0クリップ

投稿2020/07/12 08:45

提示コードの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(); }

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

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

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

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

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

guest

回答2

0

ベストアンサー

「C++11から」と言う限定ではありますが、u8プレフィクスを文字列につけることでUTF-8文字列のリテラル文字列とすることができます。

[UTF-8文字列リテラル - cpprefjp]((https://cpprefjp.github.io/lang/cpp11/utf8_string_literals.html)

文字列リテラルと文字リテラルC++() - Microsoft Docs

Visual Studio 2019 のC++コンソールアプリケーション、文字セットで「マルチバイト文字セットを使用する」を指定してビルドした場合の例を挙げます。

C++

1#include <stdio.h> 2int main() { 3 // シフトJISリテラル文字列 4 const char sdefault[] = "あいうえお"; 5 6 for (const char* pref = sdefault; *pref != '\0'; pref++) { 7 printf("%02X ", (unsigned char)*pref); 8 } 9 printf("\n"); 10 11 // UTF-8リテラル文字列 12 const char sutf8[] = u8"あいうえお"; 13 for (const char* pref = sutf8; *pref != '\0'; pref++) { 14 printf("%02X ", (unsigned char)*pref); 15 } 16 printf("\n"); 17 18 return 0; 19}

これを実行すると以下のような出力結果となります。"あいうえお"の文字列について、シフトJIS、UTF-8それぞれの文字コードになっていることが分かります。

CMD

1ConApp1\Debug>ConApp1.exe 282 A0 82 A2 82 A4 82 A6 82 A8 3E3 81 82 E3 81 84 E3 81 86 E3 81 88 E3 81 8A 4 5ConApp1\Debug>

質問者さんがお使いのコンパイラが対応しているのであれば、u8プレフィクスを使うことも選択肢に入れて良いかと思います。

投稿2020/07/12 09:59

dodox86

総合スコア9256

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

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

SHOMI

2020/07/12 10:17

あ、u8がありましたね。SJISからの変換に気を取られていて意識から抜けていました…
退会済みユーザー

退会済みユーザー

2020/07/12 11:15

なるほど。こんな簡単なことでUft-8に文字コードを変更出来たのですね。以下のようにコードを修正しました。解決しました。 //image = TTF_RenderUTF8_Blended(mfont,str[0],mTextColor); image = TTF_RenderUTF8_Blended(mfont,u8"あいうお",mTextColor);
guest

0

L"あいうえお"と書いてUTF-16で保持しておき、WideCharToMultiByteUTF-8に変換できますよ。
SJISからなら、MultiByteToWideCharで一旦UTF-16に変換して後は同じ。

投稿2020/07/12 09:34

SHOMI

総合スコア4079

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問