http://www.3geye.net/bbs/thread-168-1-1.html
本文講述如何在游戲開發中實現類似于打字的功能,其實原理和前面講述的文字滾屏差別不大,主要還是利用Timer和Canvas提供的函數。
我們的目的是把幾個字按照順序和一定的時間間隔打印在屏幕上,這就要求我們計算好文字的寬度和具體打印的位置。例如這樣一個數組
private final String[] content = { "hello ", "world ", "who ", "are ","you ",
"?" };
我使用的辦法是計算它們的相對距離,這樣我用一個int類型的數組來存儲這些數值。
private int[] slen =
new
int[content.length];
slen[0]存儲字開始打印的位置,這里我設置為10,slen[1]則存儲開始位置與hello這個字的長度之和作為下個單詞world的開始位置,依次類推。
private void initSlen()
{
int temp = 10;
for (int i = 0; i < content.length; i++)
{
slen = temp;
temp = temp +
font.stringWidth(content);
}
}
注意這里并沒有考慮屏幕寬度的因素,如果你要顯示多行的話應該考慮到屏幕的寬度,調整你的算法。
在paint()方法里面我們就按照得到的坐標位置進行繪畫
protected void paint(Graphics
arg0)
{
if (first)
{
arg0.setColor(128, 0, 128);
arg0.fillRect(0, 0, getWidth(),
height);
first = false;
}
arg0.setColor(255, 255, 255);
arg0.setFont(font);
arg0.drawString(content, slen,
height / 2, Graphics.LEFT
| Graphics.TOP);
}
程序并不復雜,下面給出源代碼。
import javax.microedition.lcdui.Display;
import
javax.microedition.midlet.MIDlet;
import
javax.microedition.midlet.MIDletStateChangeException;
public class TypeMIDlet extends MIDlet
{
private Display display;
private TypeCanvas typeCanvas;
protected void startApp() throws MIDletStateChangeException
{
display = Display.getDisplay(this);
typeCanvas = new
TypeCanvas();
display.setCurrent(typeCanvas);
}
protected void pauseApp()
{
}
protected void destroyApp(boolean arg0) throws
MIDletStateChangeException
{
}
}
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.lcdui.Canvas;
import
javax.microedition.lcdui.Display;
import
javax.microedition.lcdui.Displayable;
import
javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
public class TypeCanvas extends Canvas
{
private Timer timer = new
Timer();
private int i = 0;
private boolean first = true;
private int height = getHeight();
Font font =
Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
Font.SIZE_MEDIUM);
private final String[] content = { "hello ", "world ",
"who ", "are ",
"you ", "?" };
private int[] slen = new
int[content.length];
public TypeCanvas()
{
super();
initSlen();
TypeTask tt = new TypeTask();
timer.schedule(tt, 300, 300);
}
protected void paint(Graphics arg0)
{
if
(first)
{
arg0.setColor(128, 0, 128);
arg0.fillRect(0, 0, getWidth(), height);
first = false;
}
arg0.setColor(255, 255, 255);
arg0.setFont(font);
arg0.drawString(content, slen,
height / 2, Graphics.LEFT
| Graphics.TOP);
}
private void initSlen()
{
int temp = 10;
for (int i = 0; i < content.length; i++)
{
slen = temp;
temp = temp +
font.stringWidth(content);
}
}
private class TypeTask extends TimerTask
{
public void
run()
{
if (i < content.length - 1)
{
repaint();
i++;
}
else
{
timer.cancel();
}
}
}
}