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から座標を生成
~~
}
みたいにしないといけない気がするのですが
もっと効率のよい方法はあるのでしょうか?
かなりわかりにくい質問と理解しております。
上手く説明が出来ないので勘弁して頂けますと助かります。
OpenGLで文字列のテクスチャを扱いたい
-
めるぽん
Re:OpenGLで文字列のテクスチャを扱いたい
>数字でしたら以下の様に座標を求められるかと思います。
>X・・・num%4
>Y・・・num/4
その並び方だと、4 じゃなくて 5 ですね。
あと座標を求めるなら1個あたりの幅や高さを掛ける必要があります。
> switch(string){
> case "A":
> number = 1;
C, C++ の場合、switch に文字列を使用することはできません。
convertAlpha 関数が多分質問の答えになっていると思いますが、A-Z が連続していないような環境でもちゃんと動作させたい場合は、各アルファベットを特定の数値に変換する作業が必要になってきます。
そういう場合はまあ、テーブルを作るなり毎回文字を検索するなり、レンジさんみたいに switch を書くような実装に convertAlpha を変更してもいいと思います。
>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 を変更してもいいと思います。