どうも、hide92795です
前前前回の記事でノベルゲームのエンジンつくるお って感じで書きましたが、良い感じに苦戦しておりますww
あの記事を書いたときはSWT+Draw2Dでやっていたのですが、全体的に遅くなってしまったので諦めましたw
その後も、GTGEや普通にSwingなどでもつくってみたのですが、これらもイマイチ・・・・・
という訳で、Javaの文法から程遠いので使用を諦めていたLWJGLに落ち着いたわけですww
んで、このLWJGLを使う上で一番の悩みどころが
日本語の表示が簡単にできない
ということなんですよww
同じくLWJGLを使っているマインクラフトでは、v1.1から多言語表示に対応しましたが、対応方法は全部の文字が書かれたビットマップから文字を生成する
というもので画質が悪くなる上に、フォントの種類・太字等が変えられないという感じになってしまいますw
それだとさすがにあれなので、自分のやつでは
Graphics2d#drawString(String str, int x, int y) メソッドを使ってBufferedImageに文字を書き込み、
それをLWJGLでテスクチャとして貼り付けるということをすることにしましたww
ただし、この方法ではすでにどのような文字が表示されるのかが予めわかっているというのが前提なので、そうではない場合は使えないと思いますw
以下ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
BufferedImage bi = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB_PRE); Graphics2D g2d = bi.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g2d.setFont(new Font("メイリオ", Font.PLAIN, 24)); g2d.setColor(java.awt.Color.black); g2d.drawString("テスト", 50, 100); ByteArrayOutputStream bos = new ByteArrayOutputStream(); BufferedOutputStream os = new BufferedOutputStream(bos); bi.flush(); try { ImageIO.write(bi, "PNG", os); os.flush(); os.close(); Texture tex = TextureLoader.getTexture("PNG", new ByteArrayInputStream(bos.toByteArray())); } catch (IOException e) { e.printStackTrace(); } |
drawString自体にかかる時間は0.5秒ほどなので、別スレッドで画像の生成を行い、TextureにするのはGUIスレッドでという風にするのがいいと思いますw
また、drawStringした文字列の幅を取得して、一定数(幅)以上なら改行を行う
みたいなことを行なっていないので注意してくださいw
(そこで1時間ほど悩んでるwww)
ではノシノシ
ー2/13追記ー
LWJGLについて調べていたら、Slick Utilの中に「BufferedImageUtil」というクラスがあって、
それを使うとBufferedImageからTextureにダイレクトに変換することが出来るというのを見つけましたw
なので、OutputStreamなどなどが全てなくなって、
1 2 3 4 5 6 7 8 9 10 11 12 |
BufferedImage bi = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB_PRE); Graphics2D g2d = bi.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g2d.setFont(new Font("メイリオ", Font.PLAIN, 24)); g2d.setColor(java.awt.Color.black); g2d.drawString("テスト", 50, 100); try { Texture tex = BufferedImageUtil.getTexture("test", bi); } catch (IOException e) { e.printStackTrace(); } |
のようにすることができますw