Java实现动画逐字打印

在现代,摒弃传统的会话方式,很多的图形广告或游戏采用了[ 逐字打印]的效果来展示文字,当然,这样做的目的无非是为了突 出内容或吸引眼球。

但是这种实现方式却是值得借鉴的,以下,我给出一个JAVA实 现的简单用例,需要者可以自行扩充。

代码实现:

package org.test;
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 org.loon.framework.game.helper.ImageHelper;
/** *//**
* <p>
* Title: LoonFramework
* </p>
* <p>
* Description:JAVA实现对话逐字打印(由Loonframework提供 )
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
* <p>
* Company: LoonFramework
* </p>
*
* @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);
         frm.add(new WriterType(ImageHelper
                 .loadImage ("d:/back.jpg", true),abracadabra,50,5000));
         frm.setVisible(true);
     }

}

时间: 2025-01-30 12:55:19

Java实现动画逐字打印的相关文章

ssh-SSH框架,java web实现了打印功能,但是我每次打印显示的都是上一次内容,刷新才正常

问题描述 SSH框架,java web实现了打印功能,但是我每次打印显示的都是上一次内容,刷新才正常 SSH框架,java web实现了打印功能,但是我每次打印显示的都是上一次内容,刷新才正常,请教各位大神这是什么原因,我是个新手~希望能够得到具体方法帮忙改正. 解决方案 直接每次打印后.设置刷新不就好 了 解决方案二: 没有代码,肯定没法给你具体解决办法.你可以先刷新在打印,这样试试.

luaj lua调用java-lua中使用javaBridge调用java方法中的打印语句

问题描述 lua中使用javaBridge调用java方法中的打印语句 我用的是mac系统,ADT环境,最近在学习2dx游戏中植入百度SDK.luaj到底怎么用,有没有完整的代码.本人菜鸟,请大神指点 解决方案 不要总指望别人就给你现成的代码

JAVA一层for循环打印出倒立三角形

问题描述 如何使用JAVA一层for循环打印出倒立三角形?********* ******* ***** *** * 解决方案 StringBuilder sb=new StringBuilder("*********");for(int i=0;i<5;i++){System.out.println(sb);int n=sb.length()-1;sb.deleteCharAt(n);sb.deleteCharAt(n-1);sb.insert(0,' ');}解决方案二:虽然

存储过程 print-sql 存储过程的print 打印结果去了哪儿?java调用存储过程会打印吗?

问题描述 sql 存储过程的print 打印结果去了哪儿?java调用存储过程会打印吗? sql 存储过程的print 打印结果去了哪儿?java调用存储过程会打印吗? 解决方案 在sql的控制台上啊.会打印.

Java Applet动画设计

Applet是在浏览器中运行的小程序,Java也是从Applet开始风靡世界的.通过编写这个Applet,我们可以学习到如下知识: 1. Applet及JApplet中的主要接口 2. 图像的装载及MediaTracker的使用 3. 线程的使用及多个线程直接的通讯 4. Thread.join()方法的使用 5. volatile关键字的使用 首先看看运行效果:点击运行 动画的主要部分是一个Applet,从codebase中读取一组图片文件,然后每隔1秒轮换显示一张.代码如下: import

基于Java的动画编程基础(一)

基本技术: 在Java中实现动画有很多种办法,但它们实现的基本原理是一样的,即在屏幕上画出一系列的帧来造成运动的感觉. 我们先构造一个程序的框架,再慢慢扩展,使之功能比较齐备. 使用线程: 为了每秒中多次更新屏幕,必须创建一个线程来实现动画的循环,这个循环要跟踪当前帧并响应周期性的屏幕更新要求.实现线程的方法有两种,你可以创建一个类Thread的派生类,或附和在一个Runnable的界面上. 一个容易犯的错误是将动画循环放在paint()中,这样占据了主AWT线程,而主线程将负责所有的绘图和事件

Java小例子:打印一个金字塔

这是最基础的例子了,每个初学者都会要做这个题目.这个题目的目的是熟悉循环特 别是嵌套循环的使用.但是如果对 Java 足够熟悉,回头来再写这个程序,就完全不是这 么写的了. 嵌套循环是非常复杂的逻辑.特别是写得很长的嵌套循环,一个不小心把 j 写成 i, 就够你调试半天的.所以嵌套循环应该尽量避免.怎么避免?将内部循环提取成一个方法 .这样每个方法里都只有一层循环,容易看,容易改,而且不容易出错. import java.util.Arrays; /** * 打印一个字符组成的金字塔 */ pu

请问一下各位大神,java如何实现前台打印网页功能?

问题描述 如题,我现在需要实现这个功能:用户通过点击一个按钮,将当前页面上除了按钮那一行之外的所有内容全部通过打印机打印出来.请问有什么方法实现吗? 解决方案 如果是打印网页,就不要使用java打印API了.在js中直接使用window.print();就可以把当前网页的所有内容都打印出来.对于存在部分不需要打印的内容,最专业的就是使用css@media print { .notprint { display:none; } }比如你那里打印按钮不显示则<input type='button'

java collection-Java,为何打印出来是0的??

问题描述 Java,为何打印出来是0的?? package com.test.demon; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class hashSet { public static void main(String[] args) { Set<Customer> set=new HashSet<Customer>(); Customer custom