亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > 媒體動畫 > 正文

Authorware類和函數:authorware7程序設計基本的教學文章--腳本函數(1)

2024-09-08 19:24:40
字體:
來源:轉載
供稿:網友

3.5  腳本函數

腳本函數(script function)是由設計人員利用aws自行編寫的函數,與代碼片段相比,腳本函數具有更加完備的功能。使用腳本函數就如同使用系統函數一樣,可以向腳本函數傳遞參數,或者接收腳本函數的返回值。通過將常用的過程(例如3.4節中介紹的常用字符串處理過程)定義為腳本函數,可以大大提高設計人員的開發效率。

腳本函數可以有3種存在形式:內部腳本函數、外部腳本函數和字符串腳本函數。

與創建代碼片段相比,創建腳本函數要稍微復雜一些,但是設計人員付出的這種努力會帶來大量的回報。代碼片段就像是預定義的宏,需要在程序中展開代碼才能進行工作,而腳本函數是真正的函數,其實現細節被封裝在【腳本函數】設計圖標內部,便于對代碼進行統一管理。設計人員可以隨時補充和完善腳本函數的功能,只要保證函數接口(參數和返回值)不發生變化,這些修改工作不會給程序中的其他內容帶來任何不利影響。

3.5.1  內部腳本函數

內部腳本函數存在于【腳本函數】設計圖標之中?!灸_本函數】設計圖標并不是一種新的設計圖標,而是運算設計圖標的一種新形式。可以通過以下步驟創建一個【腳本函數】設計圖標。

(1)向流程線上拖放一個運算設計圖標,并以所需函數名對運算設計圖標進行命名。該設計圖標名必須是惟一的,不能與其他設計圖標同名,但是可以與系統函數同名?,F在將其命名為“box”。如圖3-38所示。

(2)執行modify>icon>properties菜單命令,打開運算設計圖標屬性檢查器,在屬性檢查器中打開contains script function復選框,將當前運算設計圖標定義為【腳本函數】設計圖標,如圖3-39所示。

(3)單擊屬性檢查器中的【ok】按鈕。此時運算設計圖標就變為【腳本函數】設計圖標,如圖3-40所示。此時設計圖標的外觀發生了變化。雙擊【腳本函數】設計圖標打開【運算】窗口,可以像使用普通運算設計圖標一樣向其中輸入代碼。向“box”運算窗口中輸入以下代碼:

repeat with i:= 1 to 100

    box(1, 0, 0, i, i )

    i:=i+1

end repeat

圖3-39  對運算設計圖標進行屬性設置

圖3-40  【腳本函數】設計圖標創建完畢

就創建了在【演示】窗口中繪制50個矩形這個簡單的腳本函數。

現在運行程序不會在【演示】窗口中看到任何矩形。【腳本函數】設計圖標是一種特殊的【運算】設計圖標,它與普通【運算】設計圖標的不同之處在于:當程序執行到流程線上的腳本設計圖標時會略過它,并不自動執行其中的代碼。腳本函數只能通過系統函數callscripticon進行調用。現在向【設計】窗口中添加一個【運算】設計圖標,如圖3-41所示,向“call box”設計圖標中輸入函數調用語句:

callscripticon(@"box")

就可以調用腳本函數box,在【演示】窗口中繪制矩形。由于authorware不會主動執行“box”設計圖標,因此兩個設計圖標的相對位置關系并不重要:將“call box”設計圖標放置在“box”設計圖標之前會得到同樣的運行結果。

對應的范例程序是chapter03文件夾下的scripticon-box.a7p。

 

    

圖3-41  調用腳本函數

與系統函數相比,腳本函數同樣可以具有參數和返回值??匆幌孪到y函數callscripticon完整的調用語法:

result:= callscripticon(iconid@"icontitle" [,args] [,byvalue] [,owner])

其中惟一的必選參數是【腳本函數】設計圖標的名稱??蛇x參數args就是向被調用的腳本函數傳遞的參數,該參數可以是各種類型,包括從最簡單的字符串類型到復雜的多維列表。腳本函數通過名為args的圖標變量來接受傳遞過來的參數,通過名為result的圖標變量返回執行結果。

例如要創建一個在【演示】窗口中隨機繪制多個矩形的腳本函數randombox,首先為其創建圖標變量args@"randombox",然后通過參數args指定繪制次數:

repeat with i:= 1 to args@"randombox"

--隨機挑選一種覆蓋模式

    setmode(random(0,4,1))

--隨機設置邊框的顏色

    setframe(1, rgb(random(0,255,1), random(0,255,1), random(0,255,1)))

--隨機設置填充顏色

    setfill(1, rgb(random(0,255,1), random(0,255,1), random(0,255,1)))

--隨機設置矩形的位置和大小并進行繪制

    box(random(1,8,1), random(1,windowwidth,1), random(1,windowheight,1),﹁

                 random(1,windowwidth,1), random(1,windowheight,1))

end repeat

在上述過程中,系統函數random()根據【演示】窗口寬度(windowwidth)和高度(windowheight),隨機決定矩形的大小、模式、顏色、位置和邊框,然后由系統函數box在屏幕中進行繪制。圖標變量args在這里決定了循環執行的次數,即繪制矩形的數目。在一個【運算】設計圖標中輸入以下函數調用語句,可以實現在【演示】窗口內部隨機繪制10個矩形的目的。

callscripticon(@"randombox ", 10)

程序流程和運行結果如圖3-42所示。接下來繼續創建兩個腳本函數:randomcircle和randomline,分別用于隨機繪制圓形和線段。

    

圖3-42  向腳本函數傳遞參數

--以下過程位于“randomcircle”設計圖標中

repeat with i:= 1 to args@"randombox"

    setmode(random(0,4,1))

    setframe(1, rgb(random(0,255,1), random(0,255,1), random(0,255,1)))

    setfill(1, rgb(random(0,255,1), random(0,255,1), random(0,255,1)))

    box(random(1,8,1), random(1,windowwidth,1), random(1,windowheight,1), ﹁

random(1,windowwidth,1), random(1,windowheight,1))

end repeat

 

--以下過程位于“randomline”設計圖標中

repeat with i:= 1 to args@"randomline"

    setmode(random(0,4,1))

    setframe(1, rgb(random(0,255,1), random(0,255,1), random(0,255,1)))

--隨機挑選箭頭樣式

    setline(random(0,3,1))

    line(random(1,8,1), random(1,windowwidth,1), random(1,windowheight,1), ﹁

random(1,windowwidth,1), random(1,windowheight,1))

end repeat

然后在【運算】設計圖標之中就可以通過以下函數調用語句,調用上述腳本函數開始繪圖:

callscripticon(@"randomcircle",10)

callscripticon(@"randomline",10)

腳本函數調用語句不必手工輸入。在創建新的腳本函數之后,函數面板中script icons類別下就會增加新的函數,如圖3-43所示。雙擊函數名稱,就可以直接將函數調用語句粘貼到【運算】窗口中,然后再根據需要補充調用參數就可以了。

 

圖3-43  新的函數

chapter03文件夾中的范例程序randomdraw.a7p演示了上述3個腳本函數的使用:如圖3-44所示,單擊【continue】按鈕,就可以在【演示】窗口中分別看到10個矩形、10個圓形和10條線段。

     

圖3-44  范例程序randomdraw.a7p


3.5.2  變量與參數

上述腳本函數中都使用了計數變量i,該變量屬于整個程序,而并非某個特定的腳本函數所有,任何設計圖標都可能使用該變量。為避免腳本函數和其他過程之間相互影響,應該在腳本函數中盡量使用圖標變量。

本節將3.4.3.2節中介紹的常用字符串處理過程轉換為腳本函數,并藉此介紹如何在腳本函數中處理變量和參數。

對于reverse過程,在將其改寫為腳本函數reverse時,除了利用圖標變量args@"reverse"接收準備處理的字符串參數(string)之外,還應該利用圖標變量result@"reverse"和i@"reverse"分別替換原有的變量result和i(result@"reverse"同時也作為腳本函數reverse的返回值):

result@"reverse":= ""

repeat with i@"reverse":= 1 to charcount(args@"reverse")

  result@"reverse":= substr(args@"reverse", i@"reverse", i@"reverse")^ ﹁

result@"reverse"

end repeat

這樣就將腳本函數本身的數據封裝在腳本函數內部,因為上述圖標變量在腳本函數之外通常是不可見的。以后就可以通過函數調用語句:

result:= callscripticon(@"reverse", "authorware 7.0 is coming")

對腳本函數reverse進行調用,并將函數返回的結果"gnimoc si 0.7 erawrohtua"存儲到全局變量result之中。變量result@"reverse"和result之間互不影響。

實際上在【腳本函數】設計圖標之外仍然可以訪問圖標變量i@"reverse",但此時該變量的名稱已經非常明顯地告訴設計人員:這是一個僅僅屬于“reverse”設計圖標的變量。

按照類似的方法,可以將encode、decode、wordreverse和casereverse過程分別轉換為腳本函數。

--以下是腳本函數encode

result@"encode":= ""

repeat with i@"encode":= 1 to charcount(args@"encode")

    ascii@"encode":= string(code(substr(args@"encode",i@"encode", i@"encode")))

    reverse@"encode":= ""

    repeat with j@"encode":= 1 to charcount(ascii@"encode")

      reverse@"encode":= substr(ascii@"encode", j@"encode", j@"encode")^ ﹁

reverse@"encode"

    end repeat

    result@"encode":= result@"encode"^reverse@"encode"^" "

end repeat

腳本函數也可以互相調用。由于前面已經定義了具有反轉字符串功能的函數reverse,實際上可以將函數encode簡化為:

result@"encode":=""

repeat with i@"encode":=1 to charcount(args@"encode")

    ascii@"encode":=string(code(substr(args@"encode", i@"encode", i@"encode")))

    reverse@"encode":=callscripticon(@"reverse",ascii@"encode")

    result@"encode":=result@"encode"^reverse@"encode"^" "

end repeat

但是為了在后續章節中能夠更好地描述各種腳本函數的工作方式,本書并沒有采用上述簡化代碼。

--以下是腳本函數decode

result@"decode":= ""

repeat with i@"decode":= 1 to wordcount(args@"decode")

    ascii@"decode":= getword(i@"decode", args@"decode")

    reverse@"decode":= ""

    repeat with j@"decode":= 1 to charcount(ascii@"decode")

      reverse@"decode":= substr(ascii@"decode", j@"decode", j@"decode")^ ﹁

reverse@"decode"

    end repeat

    result@"decode":= result@"decode"^ char(reverse@"decode")

end repeat

現在腳本函數便于調用的優勢已經凸顯出來,多次調用腳本函數encode,可以非常方便地對一個字符串進行多次加密,從而獲得較為理想的加密強度。

string:= "authorware 7.0 is coming"

--通過3次調用encode函數,對變量string的內容進行3重加密

repeat with i:= 1 to 3

    string:= callscripticon(@"encode",string)

end repeat

--必須通過3次調用decode函數,才能對變量string的內容完全解密

repeat with i:= 1 to 3

   string:=callscripticon(@"decode",string)

end repeat

函數encode并不是一個商業化的加密程序,它的作用僅僅是示范如何對字符串進行處理。不要使用它對同一字符串進行5次以上的加密,因為每次加密的結果都會以指數方式增長,很容易就會超出變量string的存儲容量(512kb)。

--以下是腳本函數wordreverse

result@"wordreverse":= ""

repeat with i@"wordreverse":= 1 to wordcount(args@"wordreverse")

result@"wordreverse":= getword(i@"wordreverse",args@"wordreverse")^" "﹁

^result@"wordreverse"

end repeat

result@"wordreverse":= substr(result@"wordreverse", 1, ﹁

charcount( result@"wordreverse")-1)

 

--以下是腳本函數casereverse

result@"casereverse":=""

repeat with i@"casereverse":=1  to charcount(args@"casereverse")

 result@"casereverse":=result@"casereverse"^test(code(substr(﹁

args@"casereverse", i@"casereverse", i@"casereverse"))>64&code(substr(﹁

args@"casereverse", i@"casereverse" , i@"casereverse" ))<91, ﹁

lowercase(substr(args@"casereverse", i@"casereverse" , ﹁

i@"casereverse" )),(test(code(substr(args@"casereverse", i@"casereverse" , ﹁

i@"casereverse" ))>96&code(substr(args@"casereverse", i@"casereverse" , ﹁

i@"casereverse" ))<123, uppercase(substr(args@"casereverse", i@"casereverse" ,﹁

i@"casereverse" )),substr(args@"casereverse", i@"casereverse" , ﹁

i@"casereverse" ))))

end repeat

到目前為止這些腳本函數都只接收1個參數。從系統函數callscripticon的使用語法也可以看出,只能向腳本函數傳遞一個參數args。由于一個列表型變量可以包含多個元素,每個元素的值和數據類型也可以不同,因此可以將需要處理的多個數據集中放置在一個列表型變量中,再將該列表型變量作為參數傳遞給腳本函數,這就達到了向腳本函數傳遞多個參數的目的。

同理,如果將腳本函數設計為返回一個列表型變量,那么腳本函數實際上也能返回多個(種)值。

字符排序過程sortchar實際上需要使用兩個參數:string和ascending,前者是待排序的字符串,后者指定排序方式(升序或降序)?,F在就為“sortchar”【腳本函數】設計圖標創建列表型變量args@"sortchar",通過它使腳本函數sortchar能夠接受兩個參數。

--以下是腳本函數sortchar

result@"sortchar":=""

charlist@"sortchar":=[]

ascending@"sortchar":=args@"sortchar"[2]

repeat with i@"sortchar":=1 to charcount(args@"sortchar"[1])

    addlinear(charlist@"sortchar", substr(args@"sortchar"[1], i@"sortchar", ﹁

i@"sortchar"))

end repeat

sortbyvalue(charlist@"sortchar",ascending@"sortchar")

repeat with i@"sortchar":=1 to charcount(args@"sortchar"[1])

    result@"sortchar":=result@"sortchar"^charlist@"sortchar"[i@"sortchar"]

end repeat

上述代碼中以粗體顯示的代碼是獲取第2個參數的語句?,F在可以通過兩種方式調用sortchart函數:

string:= "authorware 7.0 is coming"

--對變量string中的字符串以降序排序

string1:= callscripticon(@"sortchart", [string, 0])

--對變量string中的字符串以升序排序

string2:= callscripticon(@"sortchart", [string, 1])

對函數sortchar中的粗體代碼進行修改,可以實現更為靈活的參數傳遞。例如可以將函數sortchar中第2個參數設置為可選參數,如果調用者沒有給出排序方式,則函數sortchar自動以升序方式排序。實現代碼如下所示:

-- ascending@"sortchar"的默認值為true,如果參數列表存在第2個元素,則以該元素

--指定排序方式

if listcount(args@"sortchar")>1 then

    ascending@"sortchar":=args@"sortchar"[2]

  else  ascending@"sortchar":=true

end if

現在以下兩種函數調用方式是等價的(對變量string中的字符串以升序排序):

string1:= callscripticon(@"sortchart", [string])

string2:= callscripticon(@"sortchart", [string, 1])

可以通過以下代碼進一步拓寬參數的使用方式:

if listcount(args@"sortchar")>1 then

    ascending@"sortchar":=args@"sortchar"[2]

else  if  listcount(args@"sortchar")=1 then

       ascending@"sortchar":=true

     else

--如果參數不是一個列表,則將其轉換為列表再進行處理

       args@"sortchar":=list(args@"sortchar")

       ascending@"sortchar":=true

end if

現在下列三種函數調用方式都是等價的。

string1:= callscripticon(@"sortchart", [string])

string2:= callscripticon(@"sortchart", [string, 1])

string3:= callscripticon(@"sortchart", string)

以下是腳本函數sortchar的最終版本:

result@"sortchar":=""

charlist@"sortchar":=[]

if listcount(args@"sortchar")>1 then

    ascending@"sortchar":=args@"sortchar"[2]

else  if  listcount(args@"sortchar")=1 then

       ascending@"sortchar":=true

     else

       args@"sortchar":=list(args@"sortchar")

       ascending@"sortchar":=true

end if

repeat with i@"sortchar":=1 to charcount(args@"sortchar"[1])

    addlinear(charlist@"sortchar", substr(args@"sortchar"[1], i@"sortchar", ﹁

                    i@"sortchar"))

end repeat

sortbyvalue(charlist@"sortchar",ascending@"sortchar")

repeat with i@"sortchar":=1 to charcount(args@"sortchar"[1])

    result@"sortchar":=result@"sortchar"^charlist@"sortchar"[i@"sortchar"]

end repeat

讀者可能已經注意到這些腳本函數總是首先將圖標變量result的內容清空。這一操作是必需的,否則在下次調用腳本函數時,上次的調用結果將繼續參加下次的處理過程。

chapter03文件夾下的范例程序scripticon.a7p演示了這些腳本函數的功能。如圖3-45所示,讀者可以在演示窗口上方的文本輸入框中自由輸入字符串,然后單擊不同的按鈕調用腳本函數對輸入的字符串進行處理。注意在單擊encode按鈕后,才能使用decode按鈕對加密后的字符串進行解密,并且在單擊decode按鈕之前,其他按鈕處于禁用狀態。

圖3-45  范例程序scripticon.a7p

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产精品一区二区三区四区| 岛国av在线不卡| 精品国产91乱高清在线观看| 精品久久久在线观看| 亚洲人成在线观| 成人免费在线网址| 国产在线拍揄自揄视频不卡99| 91性高湖久久久久久久久_久久99| 日韩天堂在线视频| 久久久亚洲精品视频| 国产精品成av人在线视午夜片| 91精品视频播放| 91亚洲va在线va天堂va国| 91成人福利在线| 久久中文精品视频| 国产成人精品电影久久久| 国产一区香蕉久久| 久久久天堂国产精品女人| 亚洲国产欧美一区二区三区同亚洲| 欧美第一黄色网| 国产精品久久久久久av福利软件| 欧美高清视频在线观看| 国产精品美女久久久久av超清| 成人天堂噜噜噜| 国产精品久在线观看| 日韩在线免费观看视频| 国产最新精品视频| 日韩成人激情视频| 永久免费看mv网站入口亚洲| 亚洲人线精品午夜| 久久久久久中文字幕| 中文字幕日韩在线视频| 欧美日韩在线观看视频| …久久精品99久久香蕉国产| 中文字幕亚洲精品| 欧美性猛交xxxx| www.欧美精品| 18一19gay欧美视频网站| 国产一区二区三区高清在线观看| 国产精品入口免费视| 国产精品日韩欧美综合| 日韩美女写真福利在线观看| 精品久久香蕉国产线看观看gif| 国产视频久久网| 久久精品国产精品亚洲| 中文字幕在线观看日韩| 亚洲四色影视在线观看| 国产亚洲精品久久久| 欧美视频中文字幕在线| 狠狠做深爱婷婷久久综合一区| 91免费视频网站| 亚洲日本中文字幕| 日韩久久精品成人| 欧美寡妇偷汉性猛交| 在线激情影院一区| 日韩精品有码在线观看| 国产免费一区二区三区在线观看| 国产一区二中文字幕在线看| 久久久久久一区二区三区| 亚洲韩国欧洲国产日产av| 在线观看精品国产视频| 色哟哟亚洲精品一区二区| 日韩禁在线播放| 国产精品久久一区| 美日韩精品免费观看视频| 亚洲国产精品视频在线观看| 日本高清+成人网在线观看| 欧美丰满少妇xxxxx做受| 国产97在线播放| 97在线视频精品| 日本亚洲精品在线观看| 久久99青青精品免费观看| 97视频com| 国产99在线|中文| 精品国产一区二区三区在线观看| 黄色精品一区二区| 国产成人激情小视频| 韩剧1988在线观看免费完整版| 国产99久久精品一区二区永久免费| 亚洲精品一区二区网址| 国产一区二区动漫| 久久香蕉精品香蕉| 久久久久国色av免费观看性色| 日韩在线高清视频| 91国产高清在线| 欧美一区二区三区免费视| 久久精品最新地址| 777777777亚洲妇女| 色综合久久天天综线观看| 亚洲成人黄色网址| 亚洲丁香婷深爱综合| 精品欧美aⅴ在线网站| 国产精品视频最多的网站| 欧美激情亚洲激情| 国产一区二区三区在线播放免费观看| 亚洲欧美激情另类校园| 国产成人精品久久二区二区91| 91久久久久久久一区二区| 2021国产精品视频| 欧美特级www| 亚洲精品日韩丝袜精品| 色婷婷综合成人av| 久久久久久久影院| 久久电影一区二区| 亚洲欧美日韩视频一区| 亚洲精品v天堂中文字幕| 国产成人一区二区三区小说| 久久久久久国产三级电影| 成人观看高清在线观看免费| 欧美性猛交xxxx偷拍洗澡| 少妇高潮久久久久久潘金莲| 国产一区二区三区18| 国产成人精品999| 亚洲人成五月天| 日韩在线视频网站| 性色av一区二区三区红粉影视| 日韩av免费在线看| 九九视频直播综合网| 久久人人爽人人爽人人片av高清| 久久久免费观看| 日韩欧美高清在线视频| 亚洲国产欧美一区| 久久97久久97精品免视看| 欧美日本高清一区| 亚洲天堂av图片| 欧美日韩性视频| 欧美激情一区二区三区成人| 亚洲白虎美女被爆操| 国产91精品久久久久| 亚洲a∨日韩av高清在线观看| 亚洲精品色婷婷福利天堂| 日韩成人中文字幕| 国产精品一区二区三区久久久| 日韩中文字幕国产精品| 26uuu另类亚洲欧美日本老年| 在线视频日本亚洲性| 欧美亚洲国产视频| 中文字幕日本精品| 久久国产加勒比精品无码| 欧美日韩在线看| 国产成+人+综合+亚洲欧洲| 亚洲а∨天堂久久精品9966| 欧美成人在线免费视频| 国产欧美精品久久久| 日韩免费观看网站| 97国产精品免费视频| 亚洲天堂开心观看| 俺去啦;欧美日韩| 日韩成人激情在线| 国产精品久久久久久久久久东京| 精品激情国产视频| 国产精品久久一区| 欧美成人精品一区| 97在线看免费观看视频在线观看| 国产精品网址在线| 欧美性理论片在线观看片免费| 亚洲a中文字幕| 俺去啦;欧美日韩| 久久久久久美女| 欧美日韩一区二区三区在线免费观看| 国产狼人综合免费视频| 国产精品久久久久久久app| 国产福利成人在线| 久久久伊人欧美|