 |
 |
 |
Javaの道 >
掲示板 >
掲示板(初心者 文字表示の改行をしたいのですがやりかたがわかりません) |
 |
| 閲覧数:1227 |
掲示板(初心者 文字表示の改行をしたいのですがやりかたがわかりません) |
 |
| 名前 |
匿名
|
| 題名 |
初心者 文字表示の改行をしたいのですがやりかたがわかりません
|
質問内容
質問を評価する
(0ポイント)
|
前回質問させていただいたゲームを作っている初心者で す。 前回質問http://www.javaroad.jp/bbs/answer.jsp? q_id=20130215033120249
画像の表示に成功したのでメッセージレイヤの制作にと りかかったのですが、文字の改行がうまくいきません。 ゲーム用なので1文字づつの表示にすることはうまくい くのですが、改行がうまくいきません。 以下にコードを記します。 import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.Timer; import java.util.TimerTask;
public class message extends Layer{ BufferedImage image; //画像 int messegeSpeed=100; //メッセー ジスピード(ミリ秒) int minspeed=1000; // 最遅メッセージスピード int messageSize=30; // フォントのサイズ int messnum; // 現在表示しているメッセージ Timer t; Font f = new Font(null, 1,messageSize );// 使用するフォント String message="おはようございます。テスト ちゅう。テストといえば高校時代のテストもっと頑張っ とけばよかったな"; int x=0,y=0; // 表示サイズ int lx=0,ly=30; // 表示場所 int originalX,originalY; //画像のオ リジナルサイズ int startX,startY; // 元画像の一部を表示したい時に使用 message(){ //コンスト ラクタ setVisible(true); setFont(f); t=new Timer(); t.schedule(new Message(),0,messegeSpeed); //messegeSpeedミリ秒経つ度にTimerTaskであるMessage を呼び出し } public void p(String imgpath,int lX,int lY,int X,int Y){ //画像の読み込み、および表 示 image=Imagedraw(imgpath,lX,lY,X, Y); //画像を表示してイメージをimageに入れる。 } public void p(String imgpath,int lX,int lY){ //画像の読み込み、および表示。サイ ズ指定なし。 image=Imagedraw(imgpath,lX,lY); // 画像を表示してイメージをimageに入れる。 x=originalX=image.getWidth(); y=originalY=image.getHeight(); } public void p(String imgpath){ // 画像の読み込み、および表示。サイズ、表示場所指定な し。 image=Imagedraw(imgpath); // 画像を表示してイメージをimageに入れる。 x=originalX=image.getWidth(); y=originalY=image.getHeight(); } void write(){//メッセージがある限り次のメ ッセージを指定 if(messnum<message.toCharArray().length){ messnum=messnum+1; repaint(); }else{} } public void paint(Graphics g){ //イメージとメッセージを描画 g.drawImage(image,0,0,x,y,startX,startY,x+startX,y +startY,this); g.drawChars(message.toCharArray(),0, messnum, lx, ly); }
class Message extends TimerTask{ //messegeSpeedミリ秒経つ度に呼び出される。
public void run() { write(); }
}
}
どなたか御教授お願いいたします。
|
| 質問日時 |
2013-02-21 09:23:18 |
|
| 名前 |
匿名
|
回答内容
回答を評価する
(0ポイント)
|
質問者です。 また、前回のコードも改造しましたので合わせて拝見く だされば幸いです。
ゲームフレーム
import java.awt.Dimension; import javax.swing.*;
public class gameFrame extends JFrame{ int x,y; //表示サイズ int lx=0,ly=0; //表示場所 Layer[] Layer; //レイヤ messageWindow mw; message ml; JLayeredPane Lc =new JLayeredPane();
//コントラスタ gameFrame(String name,int X,int Y,int lX,int lY){ super(name); x=X;y=Y;lx=lX;ly=lY; try{ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE ); this.pack(); this.setLocation(lx,ly); this.setSize( new Dimension(x, y)); this.setVisible(true); }catch(Exception e){ e.printStackTrace(); } Lc.setLayout(null); setContentPane(Lc); obj(3); } gameFrame(String name,int X,int Y){ super(name); x=X;y=Y; try{ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE ); this.pack(); this.setSize( new Dimension(x, y)); this.setVisible(true); }catch(Exception e){ e.printStackTrace(); } Lc.setLayout(null); setContentPane(Lc); obj(10); } gameFrame(String name){ super(name); x=690;y=490; try{ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE ); this.pack(); this.setSize( new Dimension( x,y)); this.setVisible(true); }catch(Exception e){ e.printStackTrace(); } Lc.setLayout(null); setContentPane(Lc); obj(10); } //オブジェクト生成 public void obj(int Layernum){ Layer=new Layer[Layernum+1]; Layer[0]=new Layer(); this.getContentPane().add(Layer[0] ) ; Lc.setLayer(Layer[0],Lc.DEFAULT_LAYER ); for(int i = 1; i < Layernum; i++){ if(Layer[i]!=null){} else{ Layer[i]=new Layer(); this.getContentPane().add(Layer[i]); Lc.setLayer(Layer[i],Lc.DRAG_LAYER ,i); } } } //エラーウィンドウ(未 public void mw(){ mw=new messageWindow(this); } //レイヤ void ip(int Layernum,String img ,int lX,int lY,int X,int Y){ //イメージペイント if(img==null){ System.out.println("Layer["+Layernum+"]のimgはnull です"); } Layer[Layernum].p(img,lX,lY,X,Y); } void ip(int Layernum,String img ,int lX,int lY){ if(img==null){ System.out.println("Layer["+Layernum+"]のimgはnull です"); } Layer[Layernum].p(img,lX,lY); } void ip(int Layernum,String imgorcolor ){ if(imgorcolor==null){ System.out.println("Layer["+Layernum+"]のimgはnull です"); } Layer[Layernum].p(imgorcolor); } void ic(int Layernum,int position){ if(Layernum==0) {System.out.println("Layer[0]は背景レイヤのため移 動できません");} else{ Lc.setLayer(Layer[Layernum],position); } } //メッセージレイヤ public void newMessage(){ ml = new message(); this.getContentPane().add(ml); Lc.setLayer(ml,Lc.MODAL_LAYER ,1); ml.p("mess.png"); ml.setLocation((20)/2,y-230+10); } }
レイヤ
import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JPanel;
public class Layer extends JPanel { BufferedImage image; int x=0,y=0; //表示サイズ int lx=0,ly=0; //表示場所 int originalX,originalY; int startX,startY;
Layer(){ } public void p(String imgpath,int lX,int lY,int X,int Y){ image=Imagedraw(imgpath,lX,lY,X, Y); } public void p(String imgpath,int lX,int lY){ image=Imagedraw(imgpath,lX,lY); } public void p(String imgpath){ image=Imagedraw(imgpath); } public BufferedImage Imagedraw(String imgpath,int lX,int lY,int X,int Y){ BufferedImage img=null; x=X;y=Y;lx=lX;ly=lY; try{ img = readImage(imgpath); }catch(Exception e){ e.printStackTrace(); } setLocation(lx,ly); setSize(x,y); return img; } public BufferedImage Imagedraw(String imgpath,int lX,int lY){ lx=lX;ly=lY; x=10000;y=10000; BufferedImage img=null; try{ img = readImage(imgpath); }catch(Exception e){ e.printStackTrace(); } setLocation(lx,ly); setSize(x,y); return img; } public BufferedImage Imagedraw(String imgpath){ BufferedImage img=null; try{ img = readImage(imgpath); }catch(Exception e){ e.printStackTrace(); } x=originalX; y=originalY; setLocation(lx,ly); setSize(x,y); return img; } public void setLocation(int lX, int lY){ lx=lX;ly=lY; super.setLocation(lx,ly); } public void paint(Graphics g){ //イメージを描画 g.drawImage(image,0,0,x,y,startX,startY,x+startX,y +startY,this); }
public BufferedImage readImage(String path) throws IOException{ BufferedImage img; img = ImageIO.read(new File(path)); originalX=img.getWidth(); originalY=img.getHeight(); return img; }
}
|
| 回答日時 |
2013-02-21 09:27:41 |
|
| 名前 |
匿名
|
回答内容
回答を評価する
(0ポイント)
|
いちいち初心者と書かないと気が済まないのか…?
|
| 回答日時 |
2013-02-21 13:37:52 |
|
| 名前 |
匿名
|
回答内容
回答を評価する
(0ポイント)
|
投稿者です。 自己完結できました。
拙いかもしれませんが最大行の文字数maxCharを定めて drawCharsの部分を for(int i=0;i<maxLine;i++){ if(i*maxChar < m.toCharArray().length && (i+1)*maxChar > m.toCharArray().length){ g.drawChars(m.toCharArray() , i*maxChar , m.toCharArray().length-i*maxChar , r_margin , t_margin+f.getSize()*i); }else if(i*maxChar<m.toCharArray().length){
g.drawChars(m.toCharArray() , i*maxChar ,maxChar , r_margin , t_margin+f.getSize()*i); }else{}
とすることで解決しました。 メッセージウェイトに対応していないのでこれから挑戦 しようと思いますのでアドバイスありましたらよろしく お願いいたします。
|
| 回答日時 |
2013-02-27 10:46:59 |
|
| 名前 |
匿名
|
回答内容
回答を評価する
(0ポイント)
|
固定ピッチのフォントなら文字数での制御で良いが、可変ピ ッチだと「次の文字の幅を足して表示域の幅を超えそうなら 改行」というロジックになる。
http://mylinux.blog42.fc2.com/blog-entry-252.html
この辺が参考になるだろう。
|
| 回答日時 |
2013-02-27 20:17:16 |
|
質問から6ヶ月以上経過しているので、回答を書き込むことはできません。
|
|
 |
|
 |
 |