Java对话逐字显示实现(将文字写在图片上)

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.image.BufferedImage;
import java.io.File;
import java.awt.Toolkit;
/** *//**
 *
 * Title: LoonFramework
 * 
 *
 * Description:JAVA实现对话逐字打印(由Loonframework提供)
 * 
 *
 * Copyright: Copyright (c) 2007
 * 
 *
 * Company: LoonFramework
 * 
 * 
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @version 0.1
 */
public final class WriterType extends Panel implements Runnable {
      // 最大对话数
      private int _MAX_COUNT = 10;
      //间隔标记
      private char _flag='|';
      
      private Image _screen;
      private Graphics _bg;
      private Thread _L_WriterType;
      private static Color _L_fClr;
      private static Color _L_bClr;
      private static String _M_Text[];
      private int _S_COUNT;
      private Font _L_TTF;
      private int _L_Speed;
      private int _L_Delay;
      private String _C_Text[];
      private static int _L_COUNT;
      private static int _F_COUNT;
      
      private static int _T_COUNT;
      private static int _N_Text;
      private String _FontName;
private final static int _WIDTH = 500;
      private final static int _HEIGHT = 375;
      private static int _FontStyle;
      private static int _FontSize;
      private static    Image _back = null;
 /** *//**
       * 
       */
      private static final long serialVersionUID = 1L;
      private boolean _isRun;
      /** *//**
       * 析构函数,注入背景图,循环显示的文字数组,速度,延迟
       * @param img
       * @param strContent
       * @param speed
       * @param delay
       */
     public WriterType(Image img,String[] strContent, int speed, int delay) {          init(img,strContent, speed, delay);      }      private WriterType() {      }      public void init(Image img,String[] strContent, int speed, int delay) {          //初始背景色          setBackground(Color.BLACK);          // 原始对话信息          _M_Text = new String[_MAX_COUNT];          // 缓存对话信息          _C_Text = new String[_MAX_COUNT];          _back=img;          _FontName = "宋体";          _FontStyle = 0;          _FontSize = 15;          _L_TTF = new Font(_FontName, _FontStyle, _FontSize);          _L_bClr = Color.BLACK;          _L_fClr = new Color(250, 250, 250);          int length = strContent.length;          // 循环次数          _N_Text = strContent.length - 1;          // 直接copy String数组          System.arraycopy(strContent, 0, _M_Text, 0, length);          //速度及延迟设定          _L_Speed = speed;          _L_Delay = delay;                   //缓存区域          _screen = new BufferedImage(_WIDTH, _HEIGHT, 1);          _bg = _screen.getGraphics();          //开启线程              _isRun = true;              _L_WriterType = new Thread(this);              _L_WriterType.start();               }      /** *//**       * 停止线程       *       */      public void stop() {          _S_COUNT = 0;          _L_COUNT = 0;          _F_COUNT = 0;          if (_L_WriterType != null) {              _isRun = false;              _L_WriterType = null;          }      }      /** *//**       * 绘制图形       */      public void paint(Graphics g) {          _bg.setColor(_L_bClr);          _bg.fillRect(0, 0, _WIDTH, _HEIGHT);          _bg.setColor(_L_fClr);          _bg.setFont(_L_TTF);          _bg.drawImage(_back, 0, 0, this);          for (int i = 0; i <= _L_COUNT; i++) {              //转换当前字体top位置              Double top = new Double((double) _FontSize                      * (3.0D + 2.0D * (double) i));              if (_C_Text[i] != null) {                  _bg.drawString(_C_Text[i], 50, top.intValue());              }          }          g.drawImage(_screen, 0, 0, this);      }      /** *//**       * 图形变更       */      public void update(Graphics g) {          paint(g);      }      /** *//**       * 重新开始       *       */      private void begin() {          //清除所有缓存数据。          for (int i = 0; i < _C_Text.length; i++) {              _C_Text[i] = null;          }          _F_COUNT = 0;          _S_COUNT = 0;          _L_COUNT = 0;          _T_COUNT++;          if (_T_COUNT > _N_Text) {              _T_COUNT = 0;          }          repaint();      }      public void run() {          while (_isRun) {              try {                  //字符串累加                  _S_COUNT++;                  //当字符串完成整段对话时                  if (_S_COUNT == _M_Text[_T_COUNT].length()) {                      _C_Text[_L_COUNT] = _M_Text[_T_COUNT].substring(_F_COUNT,                              _S_COUNT);                      begin();                      Thread.sleep(_L_Delay);                      repaint();                  }                  //比对标识设定缓存对话                  if (_M_Text[_T_COUNT].charAt(_S_COUNT) != _flag) {                      _C_Text[_L_COUNT] = _M_Text[_T_COUNT].substring(_F_COUNT,                              _S_COUNT)                              + "_";                  } else {                      _C_Text[_L_COUNT] = _M_Text[_T_COUNT].substring(_F_COUNT,                              _S_COUNT);                  }                  //用以分辨是否转化对话组时的不同延迟                  boolean shortSleep;                  //当'|'标识存在时执行                  if (_M_Text[_T_COUNT].charAt(_S_COUNT) == _flag) {                      _L_COUNT++;                      _S_COUNT++;                      _F_COUNT = _S_COUNT;                      shortSleep = true;                  } else {                      shortSleep = false;                  }                  //刷新                  repaint();                  //判断速度                  if (!shortSleep) {                      Thread.sleep(_L_Speed);                  } else {                      Thread.sleep(10 * _L_Speed);                  }              } catch (InterruptedException e) {                  stop();              }          }      }           public int getMaxCount() {          return _MAX_COUNT;      }      public void setMaxCount(int max_count) {          _MAX_COUNT = max_count;      }      public static void main(String[] args) {          String[] abracadabra = new String[] {          "身为剑体,|钢铁之血灼璃之心.|手创千剑,身经百战;| 无一败绩,无一知己.|常一人自醉于剑丘之巅;|此生亦无任何意义;| 故此身,定为无限剑成;|故此命,定为无限剑制.",           "I am the bone of my sword;|Steel is my body, and fire is my blood.|           I have created over a thousand blades.|
          Have withstood pain to create many weapons.| Yet,those hands will never hold anything.|
          So as I pray, unlimited blade works." };          Frame frm = new Frame();          frm.setTitle("Java图形程序中的对话逐字显示(由Loonframework提供)");          frm.setSize(_WIDTH, _HEIGHT + 20);          frm.setResizable(false);          Image im=Toolkit.getDefaultToolkit().createImage("back.jpg");          frm.add(new WriterType(im,abracadabra,50,5000));          frm.setVisible(true);      } }

效果图:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值