2012-02-03 10 views
0

エンティティに基づいてJavaを使用して2次元エンジンを作成しています。物理とスプライトは終わりですが、まだBaseTextクラスでテキストを描くことができる必要があります。私は、しかし、のsetText(final String Text)メソッドにこのコードを移動するかできるようにしたいと思いJavaの文字列からサイズイメージを作成する

BufferGraphics.drawString(((BaseText) Entity).getText(), (int) -(Origin.getX() * PositionTransform), (int) -Origin.getY()); 

:実験目的のために私は(それはすべてのスプライトとし、このような描画処理する)Rendererクラスに次のコードを使用していますBaseTextエンティティ、つまり新しいイメージと呼ばれるときに、指定されたテキスト(異なるフォントやサイズなどで、決まっていない可能性があります)を含むイメージが作成されます。

私の問題はこれです:私は自分の好みに合わせてテキストのサイズを変更(スケール)できるようにしたいと思います。私はそれの寸法を取得し、テキストエンティティ自体のサイズを設定することができますので、イメージをイメージに変換させることもいいでしょう。

基本的に、私は必要なのは、これらの線に沿って何かを、以下:

  1. は、目的の文字列を取り、setText方法にそれを養います。
  2. 文字列を取り込んで、テキストが正確に収まるように、イメージ上に描画します。
  3. エンティティ内のImageフィールドにこの新しいイメージを設定して、エンジンが描画できるようにします。

これも可能ですか? FontMetricsクラスまたはこれを呼び出すことができる方法があるかもしれませんが、以前はそれを使用していないので、私はそれほど確信していません。

編集:私は明確にしましょう:私は特定のフォントやサイズ、ないサイズのイメージに合うようにテキストに設定され、いくつかのテキストのサイズに基づいてBufferedImageを作成にしたいです。

編集2:この優秀なコードを提供してくれたこの仲間のアンドリューのおかげで、エンジンにコードを追加することができました。是非ともになるはずです。しかし、そこにdrawRectがあっても、画像は透明であるか、何らかの形で描画されません。ブレッドクラムを提供しましょう:-snip-

愚かなことは、他のすべてのスプライトや画像などが上手く描画されることです。レンダリングの仕方がわかりません。ところで、それはpaint()メソッドでした。

編集3:
...
ええと...
...
オーマイ。
私は...
...
テキストは、私が左手の手のひらで顔の中で自分自身を傷つけたことを説明できません。

BaseText.java

@Override 
public BufferedImage getImage() {return null;} 

Renderer.java

BufferedImage Image = Entity.getImage(); 

私は巨大な馬鹿
ています。
ありがとう、アンドリュー、そのコードです。それは正常に働いた。

編集4:

public void setText(final String Text) 
{ 
    Graphics2D Draw = (Graphics2D) Game.View.getBuffer().getDrawGraphics(); 
    FontMetrics Metrics = Draw.getFontMetrics(); 
    Rectangle2D Bounds = Metrics.getStringBounds(Text, Draw); 
    BufferedImage NewImage = new BufferedImage((int) Bounds.getWidth(), (int) (Bounds.getHeight() + Metrics.getDescent()), BufferedImage.TYPE_INT_RGB); 
    Draw = (Graphics2D) NewImage.getGraphics(); 
    Draw.setColor(new Color(0xAAFF0000)); 
    Draw.drawRect(0, 0, NewImage.getWidth(), NewImage.getHeight()); 
    Draw.drawString(Text, 0, (int) Bounds.getHeight()); 
    this.Image = NewImage; 
    this.Text = Text; 
    this.setSize(new Vector(NewImage.getWidth(), NewImage.getHeight())); 
} 
+0

※「テキストは表示されません」※画像の可視領域***より上の点***に書かれている可能性があります。例については私の答えを見てください。 –

答えて

2
  1. 使用FontMetricsGlyphViewまたは推奨サイズJLabel(便利な形式のテキストを表示するのに必要なサイズを取得するために:ところで、ここで私が使用し、最終的なコードです。
  2. それが収まるまで、ステップ1でのフォントのサイズを調整します。Graphics2Dオブジェクトを取得するにはBufferedImage.createGraphics()を呼び出します。それにStringをペイント。
  3. 私は、pを理解していませんoint 3、コメントしません。ここで

それはFontMetricsまたはJLabelのいずれかでどのように動作するかです。

import java.awt.*; 
import java.awt.image.*; 
import java.awt.geom.Rectangle2D; 
import javax.swing.*; 

class TextSize { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       // Technique 1 - FontMetrics 
       String s = "The quick brown fox jumps over the lazy dog!"; 
       BufferedImage bi = new BufferedImage(
        1, 
        1, 
        BufferedImage.TYPE_INT_RGB); 
       Graphics g = bi.getGraphics(); 
       FontMetrics fm = g.getFontMetrics(); 
       Rectangle2D b = fm.getStringBounds(s,g); 
       System.out.println(b); 
       bi = new BufferedImage(
        (int)b.getWidth(), 
        (int)(b.getHeight() + fm.getDescent()), 
        BufferedImage.TYPE_INT_RGB); 
       g = bi.getGraphics(); 
       g.drawString(s,0,(int)b.getHeight()); 

       JOptionPane.showMessageDialog(
        null, 
        new JLabel(new ImageIcon(bi))); 

       // Technique 3 - JLabel 
       JLabel l = new JLabel(s); 
       l.setSize(l.getPreferredSize()); 
       bi = new BufferedImage(
        l.getWidth(), 
        l.getHeight(), 
        BufferedImage.TYPE_INT_RGB); 
       g = bi.getGraphics(); 
       g.setColor(Color.WHITE); 
       g.fillRect(0,0,400,100); 
       l.paint(g); 

       JOptionPane.showMessageDialog(
        null, 
        new JLabel(new ImageIcon(bi))); 
      } 
     }); 
    } 
} 
+0

私はそれが何であるかと思います。とにかく私が意味するのは、フォント、サイズなどをあらかじめ用意しておき、そのテキストに適合するBufferedImage自体を作成することです。あなたはBufferedImageとArrayListを比較することができます。イメージは、すでにサイズを設定しているテキストを明示的に保持するサイズになっています...私は意味がありますか? –

+0

あなたが作っている感覚は、私の答えでカバーされているようです。 –

+0

可能な解決策のためにOPを編集しました。 (私は睡眠不足の嫌いです) –

関連する問題