饒榮慶 -- 您今天UCWEB了嗎?--http://www.ucweb.com

          3G 手機開發網

             :: 首頁 :: 聯系 :: 聚合  :: 管理
            99 Posts :: 1 Stories :: 219 Comments :: 0 Trackbacks

          實現游戲中的簡單打字功能

          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();
                      }

                  }
              }
          }



          爬蟲工作室 -- 專業的手機軟件開發工作室
          3G視線 -- 專注手機軟件開發
          posted on 2007-09-23 21:20 3G工作室 閱讀(585) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 天峨县| 同德县| 桐城市| 永春县| 杨浦区| 荔波县| 唐海县| 濮阳市| 临沧市| 峨眉山市| 叶城县| 乌审旗| 静安区| 富裕县| 康平县| 遂川县| 东源县| 鄄城县| 铁力市| 深州市| 和政县| 新乡市| 抚顺县| 罗定市| 江源县| 科尔| 淅川县| 论坛| 阳江市| 澜沧| 日照市| 陇南市| 柳林县| 剑川县| 阿图什市| 中牟县| 安龙县| 礼泉县| 南投市| 延寿县| 宁波市|