主题:  源程序分析报告

南山东篱摄螂

职务:普通成员
等级:4
金币:10.0
发贴:1840
#12001/6/19 23:03:26
yjh的 counter_click 分析:

我的“counter_click 一个单击次数统计器”源代码的分析报告
该程序用两个帧剧本一个演员剧本实现了记录并显示点按按钮次数的效果,具体分析如下:
程序首先执行以下脚本:
on exitFrame--当该帧播放完毕,执行下面程序
global gCount--定义“gCount”为全局变量
set gCount=0--把“0”这个值赋予变量“gCount”
end--结束程序
通过gCount=0赋予了这个变量的初始值为0。

进一步程序执行以下脚本:
on exitFrame--当该帧播放完毕,执行下面程序
global gCount--定义“gCount”为全局变量
set the text of field "countIt"=string(gCount)--指代域演员用“countIt”接受当前变量信息,并取一个值(即当前"gCount"的变量)返回一个字符串
go to the frame--重新返回到当前帧
end--结束程序
运用the text of field "countIt"=string(gCount)--指代域演员用“countIt”接受当前变量信息,并取一个值(即当前"gCount"的变量)返回一个字符串

接着程序执行以下脚本:
on mouseUp me--当光标位于按钮上时,用户释放鼠标键
global gCount--定义“gCount”为全局变量
set gCount = gCount + 1--改变已经存在的变量“gCount”的值,“gCount”的值递加1
end--程序结束

简单的说就是通过脚本一初始变量,通过脚本二接受变量,通过脚本三改变变量。
完了。。请赐教

————————————————————————————————————————————————————————————————————————————————————————

cizi3000的Dryclean

棒槌打苹果电脑的程序分析
(我的分析和每条语句相对应,就像是注释)

棒槌上面的语句
--钉锤之所以放在第120个通道,是要留出空的
--通道来放击中使显示的血迹图。现面的语句
--主要是让棒槌跟随鼠标移动
property mySprite
on beginSprite me
mySprite=the spriteNum of me
end
on exitFrame me
sprite(mySprite).loc=the mouseLoc
end

下面是每个苹果精灵上的语句(精华部分)
--定义局部静态变量,附着在每一个苹果的精灵上,意义如下
--mySprite:当前精灵号
--ThingState:当前精灵的状态(共有四种,用来判断精灵的状态)
--ThingSpeed:精灵的速度(随机变化)
--FirstH、FirstV:苹果精灵开始的位置坐标,用来还原精灵的位置
--Target:苹果精灵将要到达的最远距离,随机产生,用函数random(700),有可能超出屏幕
--HitScore:全局变量,用来计算游戏的成绩,即打了多少个苹果

property mySprite
property ThingState,ThingSpeed
property FirstH,FirstV
property Target
global HitScore

on beginSprite me
mySprite=the spriteNum of me
--开始的状态为Sleeping(休眠状态)
ThingState = #sleeping
--获取苹果精灵的原始坐标
FirstV = sprite(mySprite).locV
FirstH = sprite(mySprite).locH
end

--但鼠标按下时,即拿起锤子打苹果时的情况
on mouseDown me
--如果这个精灵本身就是被打中了的,则退出句柄,这种情况发生在用户按键太快,连续点击了两下的时候
if ThingState = #rip then exit
--打中了,就发出声音
puppetSound 2,"Argh"
--调用Blood函数,用来显示一幅鲜血的图片,并把它保留在舞台上
blood
--恢复苹果的状态(没有被打中的状态)
ThingState = #rip
--积分,累加
HitScore=HitScore+1
--显示分数
member("FinalScore").text="People saved :"&HitScore
updateStage
end

on exitFrame me
--如果状态势休眠,则在停顿一段时间后,改变苹果精灵的状态,让它动起来
if ThingState = #sleeping then
--random(60)=1表示随机停顿一段时间,知道等于1
if random(60) = 1 then
--随机产生最远距离
Target=random(700)
--改变状态为running,即让苹果精灵开始运动
ThingState = #running
--随机产生精灵运动的速度,当然是限制在一定的范围中
ThingSpeed = random(10)+10
end if

-- 如果苹果精灵的状态为奔跑,向右移动
else if ThingState = #running then
--横坐标累加
sprite(mySprite).locH = sprite(mySprite).locH + ThingSpeed

--如果到达了目标点,即Random(700)产生的随机电target,则设置状态为返回
if sprite(mySprite).locH > FirstH+Target then
ThingState = #goback
end if

--返回状态,苹果精灵将向左移,回到原来的位置
else if ThingState = #goback then
--横坐标累减
sprite(mySprite).locH = sprite(mySprite).locH - ThingSpeed

--到达终点时,则设置苹果精灵的状态为休眠,终点就是精灵刚开始的坐标
if sprite(mySprite).locH <= FirstH then
ThingState = #sleeping
--随机改变精灵的成员,这样可以实现精灵的变化,这样每次呈现出来的精灵都是不同的精灵,具有不同的颜色
sprite(mySprite).member = random(5)
end if

--苹果精灵被打中的情况,这时直接时精灵退回到原来的位置,并且改变状态为休眠
else if ThingState = #rip then
sprite(mySprite).locH = FirstH
ThingState = #sleeping
end if
end

下面是整个程序开始时的语句
on startMovie
--splash:参照Blood函数的解释
--hitscore:用来记录成绩
global splash
global HitScore
HitScore=0
splash=20
--将锤子精灵限制在精灵1中,精灵一是一个透明的方框,这样设置后,锤子精灵就不会跑到屏幕外面去
the constraint of sprite 120=1
end

下面是函数Blood
--但苹果精灵被打中,在屏幕上显示血迹的句柄,主要原理是用
--空的通道来生成一个精灵,然后将这个精灵的成员设置成血迹图
on blood
--splash记录空的通道,并在苹果精灵被击中时自加,使每一次
--击中苹果精灵是都能够利用新的通道来显示一个血迹图。其初始值为20
--表示从第20个通道开始生成显示血迹的精灵
global splash
splash=splash+1
--设置puppetsprite属性为真,这样就可以让血迹图显示在屏幕上而不消失
puppetSprite splash,true
--显示血迹图
sprite(splash).member=14
--设置墨水效果
sprite(splash).ink=8
--显示在鼠标位置
sprite(splash).loc=the mouseLoc
updateStage
end

下面是随机呈现的特殊图形(掌上电脑的图)精灵上的语句
--随机呈现一个所谓的随机图形,原理和苹果的出项差不多
--也是设置两种状态Yes:No,然后当yes出项时,就随机计算
--一个坐标,让这个成员逐渐显示出来,当棒槌击中时也同样
--记分并还原隐藏。(下面的语句就不多解释了,很简单)

property mySprite,posdepart,Switch,WakeUp
global HitScore
on beginSprite me
mySprite = the spriteNum of me
posdepart = sprite(mySprite).loc
Switch = 0
WakeUp=#no
end
on exitFrame me
if random(100)=1 then
if WakeUp=#yes then
return
else
WakeUp=#yes
end if
end if
if WakeUp=#yes then
if Switch = 0 then
sprite(mySprite).blend = sprite(mySprite).blend + 4
if sprite(mySprite).blend >= 100 then
Switch = 1
end if
end if
if Switch = 1 then
sprite(mySprite).blend = sprite(mySprite).blend - 4
if sprite(mySprite).blend <= 0 then
Switch = 0
WakeUp=#no
sprite(mySprite).locH=random(340)+40
sprite(mySprite).locV=random(340)+40
end if
end if
end if
end

on mouseDown me
puppetSound 2,"Argh"
blood
sprite(mySprite).blend=0
WakeUp=#no
sprite(mySprite).locH=random(340)+40
sprite(mySprite).locV=random(340)+40
HitScore=HitScore+1
updateStage
end


下面是附着在滚动条精灵上的语句
--时间条上附着的语句,用来控制时间条,在游戏开始时不停右移,右移的量是
--用时间来控制的,共有42×60(ticks)->42秒,以后每一秒滚动条向左位移
--10个象素,知道为零时,跳到第40帧!
property mySprite
global a
on beginSprite me
mySprite=the spriteNum of me
startTimer
a=the timer+42*60
end
on exitFrame me
sprite(mySprite).locH = (a-the timer)/6
if sprite(mySprite).locH <0 then
go 40
end if
end


主要的程序就这些
cizi3000
2001.6.15


——————————————————————————————————————————————————————————————————————————————————————————

koala的 dvinfo 分析报告:
以下的全是对qt而言的
1. 影片的总长为:duration 是sprite property
eg:
member("duration display").text = string(sprite(1).duration)
2.
影片的当前播放时间为:movieTime 也是sprite property
eg:
member("current time").text = string(sprite(1).movieTime)
这两个时间都是以ticks为单位的(1 second=60 ticks)
3.有是会遇到需要qt全屏播放的问题。
只需要 rect 就可以办到了
eg:
sprite(1).rect=rect(0,0,800,600) --digital video in sprite 1
4,还有其他的如做各种各样形状的digital video,这是我们就需要用到 qt member 的
mask property 了
eg:
member("QuickTimeMov").mask=member("mask1")
这里要注意的问题是member("mask1")为1 bit bitmap 黑的部分是要显示的部分。
5. 我这有一个能选择 qt的所有的property的 行为


---- written for Director 8 ---
----
--- Custom Properties ---
property sourcemember,WhereTo,show_video,play_sound,preload_video,directtostage_video,pausedatstart_video,loop_video,Show_Controller,Streaming_Prop
--- Get Behavior Description List ---
on getPropertyDescriptionList me
QTMembersList=searchDigitalVideo (me)
descriptionlist = [:]
spriteassignlist=["Mouse Up","Mouse Down", "Mouse Enter","Mouse Leave"]
frameassignlist=["Exit Frame","Enter Frame"]
if QTMembersList.count > 0 then
addprop descriptionlist,#sourcemember,[#comment:"Digital Video Cast member :", \
#format:#String,#range:QTMembersList,#default:QTMembersList[1]]
else
addprop descriptionlist,#sourcemember,[#comment:"Digital Video Cast member :",#format:#Graphic,#default:1]
end if
addprop descriptionlist,#show_video,[#comment:"Set Show Video Property To :",#format:#Boolean,#default:True]
addprop descriptionlist,#play_sound,[#comment:"Set Play Sound Property To :",#format:#Boolean,#default:True]
addprop descriptionlist,#Show_Controller,[#comment:"Set Show Controller Property To :",#format:#Boolean,#default:True]
addprop descriptionlist,#preload_video,[#comment:"Set Preload Property To :",#format:#Boolean,#default:True]
addprop descriptionlist,#directtostage_video,[#comment:"Set DirectToStage Video Property To :",#format:#Boolean,#default:True]
addprop descriptionlist,#Streaming_Prop,[#comment:"Set Streaming Property To :",#format:#Boolean,#default:True]
addprop descriptionlist,#pausedatstart_video,[#comment:"Set PausedAtStart Property To :",#format:#Boolean,#default:True]
addprop descriptionlist,#loop_video,[#comment:"Set Loop Property To :",#format:#Boolean,#default:True]
if the currentspritenum <> 0 then
addprop descriptionlist, #WhereTo, [#comment:"Where To Assign this Script ?", #format:#String,#range:spriteassignlist,#default:spriteassignlist[1]]
else
addprop descriptionlist, #WhereTo, [#comment:"Where To Assign this Script ?", #format:#String,#range:frameassignlist,#default:frameassignlist[2]]
end if
return descriptionlist
end getPropertyDescriptionList
--- Get Behavior Description List ---



-- events --
on mouseUp me
if WhereTo="Mouse Up" then
SetProperties
end if
end

on mouseDown me
if WhereTo="Mouse Down" then
SetProperties
end if
end

on mouseEnter me
if WhereTo="Mouse Enter" then
SetProperties
end if
end

on mouseLeave me
if WhereTo="Mouse Leave" then
SetProperties
end if
end

on enterframe
if WhereTo="Enter Frame" then
SetProperties
end if
end

on ExitFrame
if WhereTo="Exit Frame" then
SetProperties
end if
end
-- events --

-- custom handlers --
on SetProperties
if member(sourcemember).type = #QuickTimeMedia then
member(sourcemember).controller=Show_Controller
member(sourcemember).video=show_video
member(sourcemember).sound=play_sound
member(sourcemember).preload=preload_video
member(sourcemember).DirectToStage=directtostage_video
member(sourcemember).PausedAtStart=pausedatstart_video
member(sourcemember).loop=loop_video
member(sourcemember).streaming=Streaming_Prop
end if
end
-- custom handlers --

------ Availbale for both Frame & Sprite Script ------
on isOKToAttach (me, aSpriteType, aSpriteNum)
case aSpriteType of
#graphic:
return true
#script:
return True
end case
end isOKToAttach
------ Availbale for both Frame & Sprite Script ------


------ Search for QT Member ------
on searchDigitalVideo me
AVIMembersList = []
maxCastLib = the number of castLibs
repeat with theCastLib = 1 to maxCastLib
maxMember = the number of members of castLib theCastLib
repeat with memberNumber = 1 to maxMember
theMember = member(memberNumber, theCastLib)
if theMember.type = #QuickTimeMedia then
if theMember.name = EMPTY then
AVIMembersList.append(theMember)
else
AVIMembersList.append(theMember.name)
end if
end if
end repeat
end repeat
return AVIMembersList
end
------ Search for QT Member ------



6.还有对视频的控制

movierate=0--------stop
movierate=1--------play
movierate=-1--------快退
movierate=2--------快进

我所知道的也就这些了。 请你改正!
koala
2001.6.15

_______________________________________________

编辑历史:[这消息被flyingbird编辑过(编辑时间2001-06-20 04:51:44)]


南山东篱摄螂

职务:普通成员
等级:4
金币:10.0
发贴:1840
#22001/7/6 21:50:02
漫天飞雪 的 Fuel 分析报告:

  这是一个测试反应速度的小游戏.在图框中随机出现人物的头像,用鼠标点击,当命中头像的时候,头像会改变颜色,同时在成绩栏中每命中一次增加100,当累积总和大于1500的时候,这个游戏就结束了.

  因此关键在于命中头像时要加100,并且要改名头像.可以看到在这个程序中是通过跳帧来实现头像的改变的,对于累积积分则比较简单,设置一个全局变量ghit来保存这个值,每次命中,则给全局变量加100,同时先要判断这个变量是否大于1500,如果大于则跳到游戏的结束画面,不再累积.如果小于,则继续累积.同时这个值直接赋予member scorecard,显示在成绩栏中.

  命中时头像的改变方法是这样的,首先设置一个全局变量doorway,来保存通过随机函数random产生的随机数.因为一共有两个头像,而且放置头像的图框中共可以容纳5个头像,所以有10种可能随机显示头像.为此随机数要在1-10之间产生.这个过程从进入游戏之后就开始了,也就是在marker为start1的帧脚本中.得到这个值后就会跳到和这个值相同的marker所标记的帧上,也就是显示这帧中所摆放的头像.如果鼠标没有来得及点中这个头像,就会跳回到start1所标记的起始帧,重新产生随机数,重复上面的过程.如果鼠标点中了头像,首先ghit会加100,并显示在scorecard中,然后marker会和s连接在一起,程序会跳到和这个新的值,也就是带s的这个值一样的另外的marker所标记的帧上.而这一帧所放置的就是头像被点中时的状态.最后再重新回到起始帧start1,循环上述的过程.

  我认为这个程序的巧妙之处在于直接使用随机数作为marker,也就是中间变量,来实现程序的控制,简单可靠的实现了所需要的功能.因此在编写程序的时候应该根据具体的功能要求尽可能的用最简单的程序和较少的变量来实现.


  不过有一处我觉得不太理解,
set doorway = random(10) + random(1)
set doorway = doorway - 1

  这个random(1)似乎没有必要.