主题:  创建随机列表

alalala

职务:普通成员
等级:1
金币:2.0
发贴:64
#12003/6/23 10:32:59
只是想为多媒体的发展尽一份力。以下是翻译director online 上的一篇关于随机列表的文章,觉得简单有用,所以给大家共享。动机单纯。-------alalala



创建随机列表

随机元素对任何一个director电影来说都是极好的丰富。举例来说,你事先预备了10个声音,用户点击按钮将随机播放一个。这种随机的方式极有可能导致一个声音连续播放两次。一个简单的解决方法就是储存下最后播放的声音,然后确定下一个随机的选择不会与这个雷同。程序大致看上去会象这样。

Global gprevioussound

On playrandomsound

Repeat while true
R=random(10)
If r<>gprevioussound then exit repeat
End repeat

Gprevioussound = r
Puppersound 1,”sound”&&r
End

这种情况下,循环就会不断的产生随机数字直到得出不同于以前的数字。这是一种简单的解决方法。然而,这种方法仍有产生奇数序列的可能,就象同样的两个声音不断交替播放,或者,更可能是一个或两个声音根本不播,只是非常意外的播一次。

更好的确定所有声音以一种随机的方式播放的方法是创建一个打乱次序的列表。这种列表包含原来的元素,但是在挑选的时候却是随机的。元素是一样的,但次序是随机的。

使用打乱次序的列表,这样你就能每个声音都确切的播放一次。但是一旦所有的声音播完,你必须从头再播或者从新打乱列表,可这两种选择都有问题。第一种选择使得声音的播放有了可预知的次序,第二种选择将不能保证同样的声音不播放两次。

最好的解决方法是将列表分成两个部分来打乱。所有在列表第一部分的声音保持在第一部分,不过用新的次序。对于列表的后半部分也同样的方法。以下是打乱列表的方法。

On reshuffle list

Newlist=[]

----做一个分开的标志
m=list.count/2

-----随机第一部分
I=1
Repeat while m>0
R=random(m)
Newlist.add(list[r])
List.deleteat(r)
M=m-1
End repeat

-----随机剩下的部分
repeat while list.count >0
r=random(list.count)
newlist.add(list[r])
list.deleteat(r)
end repeat
return newlist
end

举个例子来说明。首先,创建一个有序列表。然后打乱它的次序。进行打乱的时候,数字有了新次序,但是前半部分和后半部分的数字还是原来那些。

On test
Mylist=[1,2,3,4,5,6,7,8,9,10]
Mylist=shuffle(mylist)
Put mylist
End

在消息窗口可以看到以下信息

test
--[8,4,9,1,2,6,7,5,3,10]
--[2,9,1,8,4,5,6,10,3,7]

注意,数字1,2,4,8,9出现在列表的第一部分。这便可以保证同样的声音不会出现两次了。增加些这样的性质到你的director movie中可使其看起来更专业些。



zhangkui

职务:普通成员
等级:1
金币:0.0
发贴:58
#22003/6/25 13:06:29
好文章,我要是以前看到,就不用花几个晚上钻研了 :)



lanhan111

职务:普通成员
等级:1
金币:0.0
发贴:4
#32005/6/6 17:23:46
真的不错啊,我也有个随机的的问题需要向大家请教,非常简单,我没用过 director ,现在只是要用他来为我实现一个功能,希望指点 谢谢

问题:我从外部应用了两个avi格式的文件,我将两个cast已经添加到stage中了,我向在stage中添加两个命令按钮,当单击第一个命令按钮时播放第一个cast的动画,单击第二个命令按钮时播放第二个动画,我该怎么添加命令按钮以及该在script中怎么写, 谢谢