當前位置:編程學習大全網 - 源碼下載 - Director 編寫“拼圖遊戲”

Director 編寫“拼圖遊戲”

Director 編寫“拼圖遊戲”

如今,世界上很多大公司都使用 Director 制作自己的多媒體教學光盤。這其中包括微軟公司,蘋果公司,Adobe 公司等等(盡管這些公司不是多媒體制作公司)。最近,二十世紀福克斯公司推出的“X Files Unrestricted Access ” (我最喜歡的電視劇《 X 檔案》的資料光盤)中也使用了 Director 和 QuikTime VR 技術。不僅在國外使用 Director 編寫多媒體光盤的人越來越多,國內也有不少人在從事 Director 的編程工作。Director 如今已成為多媒體制作工具事實上的標準。可是比較起來,我們對 Director 使用還處於較低的水平。看過很多國內多媒體公司制作的光盤,大多數的交互控制很簡單,無非是閃動的按鈕和圖像,單擊可進入其它場景,有如幻燈片。估計裏面使用了無數的 goto xx 語句,和充斥了美工制作的大量的二維動畫。這種光盤還不如使用 PowerPoint 來制作(只是個玩笑)。其中原因有很多,其中最重要的是我們的編程人員對 Lingo 語言沒有很好地掌握,這直接影響到對創意的取舍,如果編程人員用 Director 無法實現創意,很多原先的構思將被撤消,因此,編程人員對 Lingo 語言的運用直接影響到最終產品優劣。這需要更多的 Director 編程人員充分掌握 Lingo 。我僅在此拋磚引玉,將我使用 Director 制作小遊戲的經驗與眾多的 Director 愛好者分享。

很多人都玩過“拼圖遊戲”,我很早以前就是個“拼圖遊戲”的愛好者, . 最早是玩蘋果電腦( Macintosh)上拼圖遊戲 puzzle 。後來,壹個很偶然的機會,我得到壹張蘋果版的 Adobe Illustrator 的安裝光盤。意外的發現上面有壹個維娜斯頭像(此為 Illustrator 的啟動屏幕)的拼圖遊戲,並發現它是使用 Director 編寫的(香港方面用 Director 4.0 制作的《和劉小慧的壹個星期》也設計了壹個拼圖遊戲)。當時我已經開始使用 Director 編寫多媒體演示程序(那是 1995 年),但是缺少對 Lingo 的高級功能的掌握,往往我所編寫的程序使用了不少函數,而對列表和對象這樣的數據結構卻從未使用過。在某些情況下,這種編程經常是事倍功半。三年前,我使用 Director 編寫了第壹個“拼圖遊戲”,這個版本費了我很長時間(大約壹個星期),程序代碼很長,也很亂。後來連我自己都有些看不懂了。隨著我對 Lingo 的日益了解,逐漸發現在以前編寫的程序中沒有使用列表是多麽的愚蠢。幾天前,我重新用 Director 編寫了新版本的“拼圖遊戲”。不僅原代碼減小了(更易於理解),而且僅花費了兩個小時。現在我們逐步分析如何用 Director 編寫“拼圖遊戲”。

使用列表是編寫“拼圖遊戲”的關鍵,可以說列表在 Lingo 編程中比對象更為關鍵。因為使用 Lingo 面向對象功能的用戶要比使用其傳統據結構功能的用戶要少(國外使用 Lingo 對象的用戶很多)。我所編寫“拼圖遊戲”的界面

首先,我制作了 16 個 BMP 格式的拼圖,每個為每個為 100 * 100 像素大小。分別代表上圖中 16 個小拼圖,命名為 1.bmp,2.bmp,3.bmp,4.bmp,5.bmp, ..。並將這 16 個文件導入Director 中。它們分別是角色庫中的 1 到 16 位的角色。

同時,我們將這 16 個拼圖依次排列在 1 到 16 號通道上,

現在,我們要討論使用 Director 編寫“拼圖遊戲”的思路。Lingo 中的在線替換角色函數the memberNum of sprite 是其中所用到的最重要的函數。我們正是通過鼠標單擊在相應的精靈通道上時,將所單擊的精靈的角色替換為 16 個拼圖中唯壹的壹個空白位圖角色。這其中有幾個難點需要註意。第壹,這種替換並非是任意的,只有空白周圍垂直和水平方向的拼圖才可以移動。舉例說明,

上圖空白塊的周圍只有數字為 6,9,7,14 的拼圖才可以移動。而其它拼圖在單擊時,將不會與空白處相互替換。這需要建立空白塊在不同通道時的可以移動通道列表。這裏用到了壹個全局變量 gEmpty,它用來存儲角色為空白的通道號;第二,每次啟動該“拼圖遊戲”時,必須隨機排列此拼圖,而且每次圖案都不相同。這就必須建立壹個每個通道的角色列表;第三,必須建立壹個判定條件,最終玩家拼出如第壹個圖所示的圖案,則表明玩家已經成功地拼出圖形。這需要建立壹個列表,即最終圖案中各個通道中的角色庫列表,也就是列表 Finish = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]。為了和最終列表 Finish 比較,在當前幀循環時,每次退出當前幀都要生成壹個臨時的各個通道的角色列表;還有壹點,第壹次進入循環幀時需要根據隨機列表作所有通道的角色替換,而以後幾次循環時每次進入循環幀則不需要,因此需要壹個判定變量以判定是否為第壹次進入循環幀。

看起來很復雜,但實際做壹遍並沒有那麽麻煩,相對使用別的高級語言來編寫此程序, Lingo 需要您使用新的思路來考慮編程。它使您不用涉及許多編程細節,而更多的考慮解決問題的方法,而它又沒有傳統腳本語言那麽功能貧乏。

Director 編寫“拼圖遊戲”

首先,我們需要自己編寫幾個函數(或個人句柄)。

第壹個函數是生成 16 個隨機列表的函數 generateList。

它的具體代碼如下:

on generateList

global gEmpty,randomList

set randomList = []

repeat with x = 1 to 16

addAt(randomList,random(x),x)

end repeat

end

因為 Lingo 沒有提供對列表隨機排列的功能,所以這裏使用了來自 Tab Julius 先生的《Lingo !高級指南》中的壹段代碼,它非常巧妙地通過循環語句中使用 addAt(),random()函數生成隨機列表。它在循環中先隨機產生列表位置,並將其賦予 1-16 中的值,當 addAt()函數向列表中相同位置添加值時,它會將位置推後,這種特殊的工作方式將不會出現重復現象。

第二個函數也是最重要的壹個函數 exchange()。 它有壹個參數, . 此參數為通道號。當在壹個與空白垂直或水平相鄰的拼圖上單擊時,應將二者的角色對換,即,空白所在的通道將角色換為被單擊的通道的角色,而單擊的通道的角色換為空白。並將被單擊的通道號賦予標識空白所在通道的變量 gEmpty。函數中的變量 x 為臨時變量,用於作替換時暫存數據。

on exchange n

global gEmpty

set x to the memberNum of sprite gEmpty

set the memberNum of sprite gEmpty to the memberNum of sprite n

set the memberNum of sprite n to x

updatestage

set gEmpty = n

end

此函數用在每個循環幀中 1-16 號通道,用法如下:

on mouseup

Director 編寫“拼圖遊戲”

我已經講述了所有編寫的函數,剩下的壹步是最後的,也是最關鍵的壹步。即,在循環幀的幀腳本中調用這些函數。

具體幀腳本如下:

global gEmpty,randomList,First,Finish,Tmp,m1,m2,m3,m4,m5,m6,m7,

m8,m9,m10,m11,m12,m13,m14,m15,m16,mList,M

on enterframe

if First = 0 then

repeat with i = 1 to 16

puppetsprite i,TRUE

set the memberNum of sprite i to getAt(randomList,i)

end repeat

set First = 1

end if

if Finish = Tmp then

go the frame + 1

else

set tmp = []

end if

set M = move(gEmpty)

end

在進入幀事件句柄 on enterframe 中,首先根據變量 First 來判定是否第壹次進入當前循環幀,判定條件是 First 是否為0。如果是,則根據 randomList 列表中的值來更新通道 1 - 16 的角色。更新後,將變量 First 賦值為 1 。以免下次在執行此操作。然後比較最終列表 Finish與臨時列表 Tmp 之間是否相同,如果相同則,拼圖結束。跳到結束幀。否則繼續在當前幀循環,並將tmp 列表賦值為空,以免在 tmp 列表因 on exitFrame 的操作而疊加。最後取得空白在當前通道時的可移動列表 M。

on exitFrame

repeat with x = 1 to 16

addAt(Tmp,the memberNum of sprite x )

end repeat

go the frame

end

在退出幀事件句柄 on exitFrame 中,通過循環生成當前各個通道的角色臨時列表 Tmp,並用 go the frame 在當前幀循環。

所有程序代碼都已講述完畢。如果將這 16 張圖片換成您喜愛的圖片的拼圖,妳可以生成自己風格的拼圖遊戲。通過上面的講述,您會發現 Lingo 編程的確與眾不同。這樣的遊戲可以用如此簡單的代碼在很短的時間內編寫完畢。

  • 上一篇:怎麽判斷汽車電子膨脹閥故障
  • 下一篇:公司感謝信
  • copyright 2024編程學習大全網