zoukankan      html  css  js  c++  java
  • DelphiX教程系列 2 使用声音

    用到的组件(TDXSound、TDXWave、TDXWaveList、TImage、TTimer、TTrackbar、TButton):
    TDXSound TDXWave TDXWaveList TImage TTimer TTrackBar TButton

    原文链接:http://www.delphigamedev.com/tutorials/dxtut2.htm

    Hi-Fi之旅
    在这一教程里,我们将通过使用DXSound组件——DXWave和DXWaveList组件来探究声音的世界。我们在这里研究的领域并不会很难,至少比DelphiX里的帮助文件要清晰得多。

    DXSound 组件
    OK,首先,您需要把DXSound组件放到窗体上。这使您的游戏关联到DirectX Sound并能够使用其中的功能。在本教程里,您不需要为其设置任何的属性。接下来你需要添加DXWave组件。

    DXWave组件
    您需要为其设置您要用到的声音文件。我们不会详细地讨论该组件,因为DXWaveList组件比它有用多了(如果您需要在游戏中使用多个声音文件)。基本上,您能通过它关联到DXSound组件来播放声音文件。

    DXWaveList组件
    通过该组件,我们能够开始使用多个声音文件来为我们好好地服务。我们可以设置其音量,频率和左右平衡来制造例如人声,汽车从旁边驶过等效果。我们将会通过下面的例子来为您说明它的用法。

    例子···
    首 先我们需要设置我们需要用到的声音文件。在第一个例子里面我们只用一个声音文件。为您的窗体添加DXSound和DXWaveList组件。单击您刚刚添 加到窗体上的DXWaveList组件,注意其在对象浏览器(Object Inspector)的属性。您将看到其第一个属性是DXSound。点击其下拉菜单您会看到DXSound组件的名字,譬如DXSound1。选择之, 你现在把DXSound和DXWaveList这两个组件关联起来了。

    接下来我们要为我们的列表添加声音文件,点击其 Item属性旁边的那“...”按钮弹出声音文件的编辑窗口。您看到只有一个按钮可以点击。那个是添加声音文件的按钮,点击它以添加新的项目。您会看到对 象浏览器有所变化。这些新的属性与新建的项目相关联。我们只关心其中的Wave属性,点击“...”按钮,然后点击“Load”按钮浏览所需要的声音文 件。点击“OK”返回声音文件编辑列表。您或许要为这些声音文件命名,在这里我把它命名为Clip1。这里还要把它的looped属性设置为true使其能不断的重复播放。当您完成这些之后,您的设置应该和下方的差不多。

    DXWaveList Item Editor

    现 在关闭编辑窗口并返回到我们的窗体上。在继续前,我们需要添加一个TImage控件到窗体上,这样我们能够在图像在屏幕上移动的同时改变程序左右声道的平 衡。选择适合您声音文件的图片,在这里我选了一张叫CarImg的小车图片。现在准备就绪,接下来我们要令小车动起来并为其改变声效。

    时间设置
    我们当然要添加TTimer组件到窗体上。然后双击它为其编写每个时间间隔里要运行的代码。我们将利用声道工具(Pan Facilities)来设置左右扬声器出来的声音音量。我们使用 dxwavelist1.items[0].pan 来控制其值在-10000至10000之间变化。-10000表示只有左扬声器有声响,0表示左右平衡,10000表示只有右扬声器有声响。所以如果要为其设置为10000则我们要输入 dxwavelist1.items[0].pan := 10000 items[0] 表示声音列表里的第几个文件(译注:0是第一个,1是第二个,如此类推)。我们需要做的是在图片移动的同时设置pan的值在-10000和10000之间变化,这样出来的效果就好像物体在我们旁边通过(译注:多普勒效应)。参考如下的代码:

    procedure TForm1.Timer1Timer(Sender: TObject);
    var
    CurrentPan: integer;
    begin
    if
    CarImg.Left + CarImg.Width < ClientWidth - 5 then
    begin

    CarImg.Left := CarImg.Left + 5;
    CarX := CarImg.Left;
    CurrentPan := 20000 * CarX div ClientWidth - 10000;
    dxwavelist1.items[0].pan := CurrentPan end else
    end;

    如果您有看过之前的教程,您不会对开头两行代码感到陌生,它们用来移动图片直到屏幕右方为止。余下的代码可能比较新鲜。很明显,第三行代码是设置CarX变量的,我们在public区域为其声明了 CarX: integer; 。接下来的几行虽然有点难理解。

    基本上我们用CurrentPan这个变量来为我们的声音文件来设置声道平衡。可以在每次调用中改变它的值(随着CarX变量每次加5的速度递增直到到达屏幕右方)。这一行比较有数学深度。您不需要知道它的细节。基本上,它用来确保我们的变量只在-10000和10000之间变化。下面的一行代码则用来为声音文件的CurrentPan变量重新赋值。

    OK,以上的是timer事件的设置,但是还有一件事情要做。在声音开始播放前,我们需要在FormCreate过程里添加一行代码。在窗体上空白的地方双击,输入如下代码:

    dxwavelist1.items[0].play(false);

    这会令声音开始播放,然后您就能为其设置声道平衡/频率/音量。我们在窗体创建的时候就让它播放,但您也可以其他地方添加它,只要在为其设置声道平衡/频率/音量之前就可以了。

    频率是什么?
    我们不仅能够处理声音的左右平衡。而且还可以为其设置频率和音量。为演示频率的处理,我们添加一个track bar到窗体上,这样我们能通过移动track bar上的滑块来调整频率。选择组件栏上Win32标签,添加一个TTrackbar到窗体上。设置其Max entry为44100,Min entry为4410。然后在窗体上双击它,为其添加OnChange事件的代码:

    dxwavelist1.items[0].Frequency := FreqTrackBar.Position;

    这 将从track bar上取出值并为声音文件赋值。您为频率赋的值是非常重要的。如果您按帮助文档那样把它的值设置为100到100,000之间,实际上在您把频率设置到 这两个极端值时,可能听到一点声音或根本听不到。44100是您的wave文件最常用的频率,您可以尝试以1000为变化量来调整它,看看出来的效果如 何。例如,试试改变Trackbar的Max entry为441000,Min entry为44100,您会发现物体的速度由低到高的变化。

    声量调整是最简单的,您可以简单地把它的值设置在-10,000到10,000之间,最低值为静音,0为普通的音量,10,000则最大声。所以如果我们想要大声一点则只需输入如下代码:

    dxwavelist1.items[0].volume:= dxwavelist1.items[0].volume + 100;

    这把当前的音量增加100。在下载的代码里,我添加了2个按钮来调整音量(每次增加或减少100)。

    So to summarise...
    There are effectively four procedures you carry out on a sound file at any point in your program:

    小结
    还有4个对您程序里的声音文件比较有用的过程:

    • 当您想播放第一个声音文件时,您可以输入 dxwavelist1.items[0].play(false); ,这会按标准的音量/声道平衡/频率来播放。注意:在程序的FormCreate过程里候调用它,这样在程序刚开始运行时就能播放声音。

    如果您已经输入以上代码,那么就可以调用下面的代码了:

    • 输入声道平衡的值 dxwavelist1.items[0].pan := VALUE
    • 输入频率的值 dxwavelist1.items[0].frequency := VALUE
    • 输入音量的值 dxwavelist1.items[0].volume := VALUE

    停止播放...
    另一方面,您需要知道如何停止播放声音。在只播放一次的情况下,您并不需要这样做(例如爆炸的声音)。但是在您为其设置了重复播放的时候(本教程例子),您讲需要添加如下代码来停止重复播放:

    dxwavelist1.items[0].Looped := False;


    That's 'it'...
    通过以上叙述,你知道如何好好利用您的声音文件。您会在下载的源代码黎找到另外一个示例程序,它使用了另一个TTimer,在图像从屏幕的一边移动到另一边时,播放相应的声音片段。如果您有任何问题,请通过Email的形式或者给我留言



    版权说明

    本系列译文在博客园发表,除允许在互联网上自由转载外,不允许以其它任何方式拷贝、编辑、印刷出版、制作发行及传播,包括不允许 在笔者未知晓的情况下制作成各种格式的电子文档并传播,更不得在未经笔者本人允许的情况下以任何形式的拷贝用于商业用途。笔者对本系列译文保留有追究其侵 权责任的权利。

    若需制成电子文档并用于非商业用途方式的传播,请保留以下版权信息,并与笔者联系邮寄副本一份。

    作者:Nicholas.Yuen
    网名:小丸
    Email:ruanjiayuan AT gmail.com ( AT -> @)
    Blog:http://genkagen.blogspot.com
    时间:2008.08.05
    Copyright: All right resver

    PS:转载请保留以上版权信息
  • 相关阅读:
    Codeforces 514C Watto and Mechanism(字典树)
    计蒜客 直线的交点(计算几何 + 逆序对)
    Codeforces 837D Round Subset(背包)
    计蒜客 商汤科技的行人检测(随机化+计算几何)
    HDU 5893 List wants to travel(树链剖分+线段树)
    操作系统的中断处理
    Linux 安装 webmin
    Fedora 安装 phpMyAdmin(可能只有自己看得懂)
    httpd编译安装php
    IA-32e架构下的内核初始化内存管理
  • 原文地址:https://www.cnblogs.com/waterfalleagle/p/1766332.html
Copyright © 2011-2022 走看看