第二十讲 动画制作及声音载入(三)

<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; /* 336x280, 创建于 07-11-21 */ google_ad_slot = "0989131976"; google_ad_width = 336; google_ad_height = 280; // </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

教 学 纲 要

Java 世界 里 最 激 动 人 心 的 时 刻 终 于 到 来 了 , 在 这 一 章 里 你 将 学到 在 主 页 里 播 放 动 画 的 技 巧 , 以 及 载 入 和 播 放 声 音 的 方法 , 掌 握 了 本 章 所 讲 授 的 这 些 技 巧 , 再 加 上 你 脑 子 里 各种 希 奇 古 怪 的 念 头 , 你 就 有 能 力 创 造 出 你 自 己 的 真 正 活灵 活 现 、 有 声 有 色 的 活 动 Web 主 页 来 。

正 文

载 歌 载 舞 的 小 企 鹅

    啊 哈 ! 现 在 我 们 已 经 可 以 把 动 画 做 得相 当 不 错 了 , 不 过 我 们 还 可 以 再 把 它 做 得 尽 善 尽 美 , 总不 能 让 我 们 的 动 画 是 无 声 片 吧 , 加 上 点 儿 声 音 的 确 是 个绝 妙 的 主 意 。 人 们 总 是 在 不 满 足 中 追 求 完 美 , 从 文 字 、图 形 到 动 画 , 虽 然 我 们 干 得 不 错 , 可 还 是 希 望 能 做 得 更好 , Java 恰 恰 为 你 的 精 益 求 精 提 供 了 支 持 , 你 可 以 在 Java 程 序 里 载 入 并 播 放 声 音 文 件 。

    和 Java 只 支 持 Gif 和 Jpg 两 种 图 形 文 件 一样 , 在 有 声 世 界 里 , 它 也 只 支 持 Au 这 一 种 声 音 文 件 的 格式 。 虽 然 这 不 是 一 种 CD 音 质 的 声 音 文 件 , 但 它 已 经 足 以让 你 为 之 欣 喜 若 狂 了 。 设 想 一 下 , 当 别 人 正 在 浏 览 你 的主 页 时 , 突 然 听 见 有 个 声 音 对 他 说 “ 欢 迎 光 临 ” , 那 该是 多 么 出 人 意 料 呀 !

    在 Java 程 序 里 加 载 声 音 文 件 就 如 同 在 你的 录 音 机 里 放 上 一 张 想 听 的 唱 片 一 样 简 单 。 声 音 文 件 的加 载 与 图 片 文 件 的 加 载 非 常 相 似 , 首 先 你 必 须 指 定 一 个包 含 有 声 音 文 件 的 URL , 然 后 用 加 载 声 音 文 件 的 方 法 来 加载 它 。 还 记 得 吗 , 加 载 图 片 时 我 们 用 的 是 getImage 这 个 方法 , 类 似 地 , 加 载 声 音 我 们 用 到 的 方 法 叫 getAudioClip 。 在这 个 方 法 里 , 和 getImage 一 样 , 我 们 应 该 指 定 这 个 声 音 文件 存 放 的 URL , 当 然 Java 里 的 URL 既 可 以 是 本 地 硬 盘 也 可 以是 网 络 上 的 某 一 台 主 机 , 对 Java 而 言 它 们 是 一 样 的 。 和加 载 图 片 一 样 , 加 载 声 音 文 件 也 有 两 种 格 式
    AudioClip getAudioClip ( URL url ) ;
    AudioClip getAudioClip ( URL url , String name );
    AudioClip 是 Java 定 义 的 一 个 类 , 用 它 来处 理 和 控 制 声 音 这 种 特 殊 的 数 据 对 象 。 使 用 它 就 可 以 方便 地 对 声 音 文 件 的 播 放 进 行 控 制 。
例 如 : 要 加 载 一 个 名 为 background.au 的 声 音文 件 , 并 把 它 赋 给 名 为 bg_snd 的 AudioClip 类 型 的 变 量 , 我们 只 需 这 样 写 :
    AudioClip bg_snd = getAudioClip ( getCodeBase( ) , " background.au" );

    加 载 了 声 音 文 件 以 后 , 接 下 来 就 是 播放 它 。 和 录 音 机 一 样 Java 里 也 用 Play 、 Loop 、 Stop 来 控 制唱 片 的 播 放 和 暂 停 。 它 的 使 用 录 音 机 一 样 简 单 , 你 只 需要 用 AudioClip 类 里 提 供 的 play( ) 、 loop( ) 和 stop( ) 方 法 就 可以 很 方 便 地 控 制 它 。

    假 如 你 只 想 播 放 声 音 一 次 , 那 你 就 使用 方 法 play( ) , 在 程 序 里 这 样 写 :
    bg_snd .play ( ) ;
运 行 这 条 语 句 的 时 候 , Java 就 会 像 你 按 下了 录 音 机 上 的 Play 键 一 样 开 始 播 放 声 音 , 当 这 个 声 音 文件 播 放 完 以 后 , 它 就 会 自 动 停 止 。

    你 也 许 希 望 有 一 个 循 环 播 放 的 背 景 音乐 , 不 用 人 去 干 预 它 就 能 一 遍 又 一 遍 地 循 环 播 放 所 加 载的 那 个 声 音 文 件 。 在 程 序 里 写 上 下 面 这 句 话 你 的 这 个 愿望 就 能 实 现 。
    bg_snd . loop ( ) ;
    要 是 你 觉 得 它 吵 得 厉 害 , 不 想 再 让 它出 声 了 , 对 录 音 机 你 是 怎 么 做 的 呢 ? 按 Stop 键 。 在 Java 里也 一 样 , 你 只 需 要 像 下 面 这 样 使 用 方 法 stop( ) 就 可 以 让声 音 立 即 停 下 来 。
    bg_snd . stop ( ) ;
    好 啦 ! 学 习 了 声 音 文 件 的 加 载 和 播 放, 我 们 终 于 可 以 给 我 们 的 小 企 鹅 翻 筋 斗 加 上 背 景 音 乐 了, 准 备 好 你 的 音 箱 了 吗 ? 载 歌 载 舞 的 小 企 鹅 很 快 就 要 出场 了 !
程 序 18.3
// tumble.java
import java.awt.*;
import java.applet.AudioClip;    // 引 入 AudioClip 程 序 包

public class tumble extends java.applet.Applet implements Runnable
{
    Image frame[ ];
Thread thd;
int num;
int pause;
Image backgnd;        // 说 明 作 为 背 景 图 片的 Image 对 象
int x,x_pos ;
AudioClip bg_snd ;    // 说 明 用 来 放 背 景 音 乐的 AudioClip 对 象

public void init( )
{
        int i;
String fps;
frame = new Image[17];
thd = null;
num = 0;
for (i = 0; i < frame.length; i )    // 加 载 动画 图 片
frame[i] = getImage(getCodeBase( ), "images/T" i ".gif");
backgnd = getImage (getCodeBase( ),"images/backgnd.gif");   // 加 载 背 景 图 片
bg_snd = getAudioClip(getCodeBase( ),"audio/backsound.au");   // 加 载 背 景 音 乐
fps = getParameter("speed");
if (fps == null)
fps = "10";
pause = 1000 / Integer.parseInt(fps);    // 计 算 每一 帧 图 片 显 示 的 时 间
}
public void start( )
{
        bg_snd.loop ( );    // 循 环 播 放 背 景音 乐
        if (thd == null)
        {
            thd = new Thread(this);    // 产生 线 程
            thd.start( );    // 启 动 线 程
        }
}

public void stop( )
{
        if (thd != null)
        {
            thd.stop( );    // 中 止 线 程
            thd = null;
        }
        if (bg_snd != null)
            bg_snd.stop( );    // 暂 停 背 景音 乐
}
public void run( )
{
        while (true)
{
            try { Thread.sleep(pause); }    // 图 片 显 示 期 间 , 让 进 程 睡 眠
            catch (InterruptedException e) {}
            repaint( );    // 重 画 窗 口
            num = (num 1) % frame.length;    // 对 显 示 帧 数 计 数
            x = ((x 130 5)%(size( ).width 250))-130;   // 计 算 下 一 帧 图 片 显 示 的 位 置
            x_pos= size( ).width-x ;
        }
    }
    public void paint(Graphics g)
    {
        g.drawImage(backgnd,0,0,this);    // 显示 背 景 图 片
        g.drawImage(frame[num], x_pos, 0, this);   // 显 示 动 画 图 片
    }
    public void update(Graphics g)
    {
        paint(g);
    }
}

    这 个 Java 程 序 的 HTML 和 程 序 18.2 的 HTML 一样 , 所 以 你 完 全 可 以 拷 贝 上 一 个 程 序 的 HTML 文 件 , 而 无需 做 什 么 修 改 。 运 行 程 序 时 , 先 把 你 的 音 箱 打 开 , 你 将会 看 到 程 序 里 的 小 企 鹅 在 背 景 音 乐 的 伴 奏 下 一 个 接 一 个地 翻 筋 斗 。

    在 这 个 程 序 里 , 我 们 用 loop 来 播 放 背 景音 乐 , 所 以 只 要 加 载 了 它 , 音 乐 就 会 一 直 不 停 地 响 下 去。 即 使 用 户 已 经 离 开 了 这 个 主 页 。 这 对 于 用 户 而 言 是 很不 礼 貌 的 , 所 以 我 们 在 方 法 stop( ) 里 加 上 了 下 面 两 句 话来 中 止 背 景 音 乐 的 播 放 。
    if (bg_snd != null)
    bg_snd.stop( );

    最 后 我 们 应 该 知 道 , 声 音 文 件 的 播 放和 控 制 是 通 过 AudioClip 类 实 现 的 , 所 以 凡 是 会 出 声 音 的 Java 程 序 开 头 都 应 该 引 入 java.applet.AudioClip 这 个 程 序 包 。 也 就是 说 , 程 序 开 始 都 应 该 有 这 句 话 :
    import java.applet.AudioClip ;

    今 天 就 到 此 为 止 吧 , 你 终 于 可 以 一 边喝 咖 啡 一 边 欣 赏 自 己 做 出 来 的 载 歌 载 舞 的 小 动 画 , 好 好地 休 息 一 下 了 。

小 结

    学 习 完 今 天 的 课 程 , 本 书 已 经 接 近 尾声 , 你 已 经 学 会 了 Java 编 程 的 大 部 分 技 巧 , 接 下 来 的 事就 是 用 你 已 经 掌 握 的 Java 知 识 , 去 实 现 你 脑 子 里 各 种 稀奇 古 怪 的 想 法 , 做 出 让 人 惊 叹 的 主 页 来 。 最 后 我 再 对 今天 所 学 的 内 容 作 一 个 小 结 。

  • 制 作 动 画 之 前 , 你 应 该 先 准 备 好 一 组 图 片 ,你 的 动 画 就 是 从 这 一 组 图 片 中 产 生 出 来 的 。
  • 制 作 动 态 效 果 的 程 序 , 你 必 须 用 到 多 线 程 ,多 线 程 程 序 是 通 过 实 现 Runnable 接 口 得 到 的 。
  • 按 照 固 定 的 步 骤 , 一 步 一 步 地 写 好 start( ) 、 stop( ) 和 run( ) 就 可 以 完 成 多 线 程 程 序 。
  • 在 start( ) 里 , 产 生 新 的 线 程 , 我 们 用 它 来 播放 动 画 。 用 stop( ) 中 止 线 程 。 在 run( ) 里 写 播 放 动 画 的 代码 。
  • 在 程 序 里 加 上 自 己 的 update 方 法 就 可 以 消 除 动画 里 的 闪 烁 现 象 。
  • 连 续 翻 筋 斗 的 小 企 鹅 是 通 过 一 边 显 示 动 画 图片 , 一 边 改 变 显 示 位 置 实 现 的 。
  • 在 动 画 里 加 上 背 景 音 乐 真 是 再 绝 妙 不 过 了 , getAudioClip 使 你 能 够 加 载 Au 格 式 的 声 音 文 件 , 然 后 我 们 用 AudioClip 类 里 的 play 、 loop 和 stop 来 控 制 它 的 播 放 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值