OpenGLで文字列のテクスチャを扱いたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
レンジ

OpenGLで文字列のテクスチャを扱いたい

#1

投稿記事 by レンジ » 15年前

OpenGLで文字列のテクスチャを扱おうとしております。
今回の質問は切り取り位置についての質問です。

drawNumber(int num)という関数があったとします。
この関数は引数に入れた数字をテクスチャから切り取り
画面中心に表示するだけの簡単なものです。

数値でしたら綺麗に書けるのですが文字列となると長くなってしまいます。
例えば下記の様に並んでいる画像があったとします。
////////////////////////////////////
01234
56789
////////////////////////////////////
数字でしたら以下の様に座標を求められるかと思います。
X・・・num%4
Y・・・num/4

これを文字列で行うと
drawString(char string[/url]){
int number = 0;

switch(string){

case "A":
number = 1;
break;
case "B":
number = 2;
break;




}
//numberから座標を生成
~~

}


みたいにしないといけない気がするのですが
もっと効率のよい方法はあるのでしょうか?

かなりわかりにくい質問と理解しております。
上手く説明が出来ないので勘弁して頂けますと助かります。

シエル

Re:OpenGLで文字列のテクスチャを扱いたい

#2

投稿記事 by シエル » 15年前

文字列はどう並んでるんですか?

めるぽん

Re:OpenGLで文字列のテクスチャを扱いたい

#3

投稿記事 by めるぽん » 15年前

>数字でしたら以下の様に座標を求められるかと思います。
>X・・・num%4
>Y・・・num/4
その並び方だと、4 じゃなくて 5 ですね。
あと座標を求めるなら1個あたりの幅や高さを掛ける必要があります。

> switch(string){
> case "A":
> number = 1;
C, C++ の場合、switch に文字列を使用することはできません。
const int width_count = 10; // 横に並んでいる文字の数
const int width = 8;        // 1個のアルファベットあたりの横幅
const int height = 16;      // 1個のアルファベットあたりの縦幅

int convertAlpha(char c)
{
    // A-Zが連続してることは仕様的には保証されないけど、大抵の環境では問題ないだろう
    return c - 'A';
}

void drawChar(char c, int x, int y)
{
    int sx, sy;
    int n = convertAlpha(c);
    if (n < 0 || n >= 26) return;

    sx = (n % width_count) * width;
    sy = (n / width_count) * height;
    // 画像の sx, sy の位置から width, height だけ切り取って、x, y の位置に描画する
}

void drawString(const char* str, int x, int y)
{
    while (*str != '\0')
    {
        drawChar(*str++, x, y);
        x += width;
    }
}

// 画面中央に文字列を表示する
void drawStringCenter(const char* str)
{
    // screen_width, screen_height は画面の幅, 高さとする
    drawString(str,
        (screen_width - strlen(str) * width) / 2,
        (screen_height - height) / 2);
}
こんな感じでどうでしょうか。

convertAlpha 関数が多分質問の答えになっていると思いますが、A-Z が連続していないような環境でもちゃんと動作させたい場合は、各アルファベットを特定の数値に変換する作業が必要になってきます。
そういう場合はまあ、テーブルを作るなり毎回文字を検索するなり、レンジさんみたいに switch を書くような実装に convertAlpha を変更してもいいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る