<   2011年 07月 ( 2 )   > この月の画像一覧

JOGLとフォント2

1ドットずつ処理しようと思い、確認してみたら、

0x28FFFFFF

とか、すでにα値が入っていた罠。

つまりキレイに見えていなかった理由は、
テクスチャの表示指定が、抜き色になっていて、αが有効になっていなかっただけという。

これで、1ドットずつ処理する必要がなくなったぜ。
[PR]
by miries | 2011-07-04 00:26 | ゲームを作る

JOGLとテクスチャとフォント

ようやく(無理やり)自分の趣味のプログラムに戻ってきた。

数ヶ月放置していたので、読み返すと、「こんなクソコード」とお約束のように思う。

最近は、「お、こんなコード書いてたのか」とも思うようになり、
腕が落ちてるのかもしれない。

前回放置するきっかけとなったのが、フォント。
テクスチャとプリミティブが表示できたが、フォントを表示しないと、
タイピングゲームが作れない。

フォントを表示するには、大きくわけて2つ。

A. テクスチャとしてデータを持っておき、UV切抜きで1文字ずつ表示
B. Overlayを使って Graphics2Dとして表示

以前は、Bを使っていたのだが、

・激重い
・一番手前にしか表示できない

という欠点のため、今はテクスチャで表示している。
しかし、あらかじめデータを作るのが面倒だし、
以前作ったクライアントの環境に合わせたフォントを選ぶルーチンとかももったいない。

というわけで、BufferedImage で、内部的に drawFontで描き、
それをテクスチャに転用することにした。

最近のPCは処理能力もメモリもかなりの物を積んでいるので、
最初に全フォントを作るのもアリだろうし、
場面に応じて、必要なフォントを展開するようにしてもいいだろう。
(タイピングゲームで後者は難しいだろうが)

BufferedImageで作った画像で、抜き色を実現することはできた。

BufferedImage testImage = new BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB);

Graphics2D g2d = testImage.createGraphics();
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.0f));
Rectangle2D.Double rect = new Rectangle2D.Double(0,0,500,500);
g2d.fill(rect);
g2d.setPaintMode();

として、透明色で塗りつぶしておき、フォントを描画すると、キレイな抜き色フォントに…。
…。
何かおかしい。というか、アンチエイリアスがかかってない。
そりゃそうだ。

g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

というわけで、アンチエイリアス。
一応見た目はきれいなのだが…背景を明るくすると、エッジに暗い部分がでて粗くなる。

明るい背景を使うことは無いので、一応このままで行く予定だが、
気に入らなくなったら、BufferedImage.getRGB() でピクセル値をとりだし、
1ピクセルずつ、妥当なα値を入れる必要があるんだろうなぁ。

さすがにそこまですると、処理能力を超える気がする。
[PR]
by miries | 2011-07-03 13:50 | ゲームを作る