Chương 6: Phõn tớch chương trỡnh

Một phần của tài liệu đồ án công nghệ thông tin Chương trình Macromedia Director (Trang 85)

Macromedia Director được dựng để xõy dựng cỏc phim trỡnh diễn và việc đưa õm thanh, hỡnh ảnh hay cỏc đối tượng multimedia khỏc rất thuận lợi. Ngoài ra, muốn tạo ra cỏc ứng dụng linh hoạt, cú tớnh tương tỏc cao thỡ ta cũn phải dựa vào khả năng lập trỡnh trong Director. Trong nội dung đồ ỏn này, tụi chỳ trọng đến khả năng lập trỡnh của nú và lập trỡnh theo kiểu hướng đối tượng.

Mục tiờu ở đõy là xõy dựng một bộ khung cho phộp đưa cỏc trang web lờn mạng và liờn kết chỳng theo cỏc chủ đề. Người dựng cú thể thờm, bớt, sửa, xoỏ và cập nhật nội dung của website. Ta xõy dựng hai phim Director với hai mục đớch khỏc nhau: phim thứ nhất sẽ được dịch thành dạng file “.exe” và cú nhiệm vụ cho phộp ta đọc cũng như thay đổi nội dung file chứa menu của Website; phim thứ hai sẽ được dịch thành dạng phim Shockwave và nhỳng vào trang chủ của website, nú cú nhiệm vụ đọc file menu từ Webserver và hiển thị lờn trang chủ.

II. Tổng thể chương trỡnh

Sơ đồ hoạt động của chương trỡnh như sau:

85 Web

client Webserver

Menu file Chương trình Chỉnh sửa menu đọc, ghi file đọc file Truyền file menu

Hiển thị hệ thống menu

chọn trang

Chương 7: Xõy dựng chương trỡnh

I. Phim left.dir

Ta xõy dựng trong Director một film tờn là left và sau đú chuyển thành dạng film Shockwave (sẽ cú tờn là left.dcr). Phim left.dcr được nhỳng vào trang web left.htm bằng dũng HTML:

<embed src="left.dcr" bgColor=#2D0000 width=200 height=650

type="application/x-director" pluginspage="http://www.macromedia.com/shockwave/download/">

</embed>

Trang chủ của website cú tờn là home.htm, nú được chia thành hai frame chứa

Menu ở trang left.htm cho phộp người dựng cú thể chọn cỏc trang web cần

hiển thị. Như ở hỡnh trờn ta cú thể click vào một trong cỏc mụn học để vào mức menu sõu hơn.

Cấu trỳc dữ liệu

Trong phần này, chỳng ta sẽ xem xột cụ thể cấu trỳc dữ liệu của chương trỡnh. Phim left chỉ sử dụng một loại cast đú là internal cast (cast bờn trong)

Internal Cast

Cast này dựng để lưu trữ cỏc thủ tục của phim, cỏc dữ liệu dạng field (một dạng dữ liệu dựng trong Director – chứa văn bản). Cỏc field này sẽ chứa cỏc tờn trong menu và được hiển thị.

Score

Trong cửa sổ score, ta dựng cỏc kờnh palette để đặt bảng màu, cũn kờnh script ta đặt ba thủ tục dạng frame script điều khiển hoạt động của phim.

Từ kờnh 14 đến kờnh 63, ta đặt sẵn cỏc field trờn đú. Tạm thời ta chưa sử dụng hết tất cả cỏc field này vào việc hiển thị menu. Chỳng được dựng khi mở rộng chương trỡnh, thờm vào nhiều menu item nữa. Cỏc field sẽ được đặt thuộc tớnh là hiển thị hay ẩn bằng lệnh Lingo thớch hợp, field nào chưa sử dụng sẽ được ẩn đi.

Cỏc kờnh cũn lại chưa được sử dụng.

Biến toàn cục

Chương trỡnh sử dụng cỏc biến toàn cục cho cỏc dữ liệu dựng chung trong toàn bộ phim

global readok : biến kiểm tra hoạt động network

global gNetID : gỏn cho một hoạt động network (net operation) global gbfirstsprite : sprite đầu tiờn gỏn cho cỏc mục trong menu global gblocv : vị trớ

global gbloch (adsbygoogle = window.adsbygoogle || []).push({});

global gbSubjectList : danh sỏch chứa cỏc đối tượng global gbMenuFileName: tờn file chứa menu

global FileContent : nội dung file download được

Cấu trúc file menu

File menu chứa cỏc dũng thể hiện theo một cấu trỳc xỏc định. Mỗi dũng cú dạng như sau:

[#Name, #URL,#menuLevel,#BrowseNewWindow] trong đú:

#URL : đường dẫn đến trang web #menuLevel : nếu =1 là menu cha

#BrowseNewWindow : thuộc tớnh này để kiểm tra xem là hiển thị nội dung trang web ở frame bờn phải (right) hay hiển thị ở một cửa sổ mới .

Cỏc mức menu con nằm ngay sau menu cha. Vớ dụ, ta cú một cấu trỳc menu sau: 89 Ngoại ngữ Tiếng Anh Tiếng Pháp Bài 2 Streamline Headway Bài 1 Đại số Toán học Hình học Hình giải tích Hình không gian Vật lý

Với cấu trỳc như trờn, ta sẽ ghi vào file menu như sau:

Ngoại ngữ,ngoaingu.htm,1 Tiếng Anh,tienganh,2

Headway, headway.htm,3 Headway, headway.htm,3

Bài 1,bai1.htm,4 Bài 1,bai1.htm,4 Bài 2,bai2.htm,4 Bài 2,bai2.htm,4 Streamline,streamline.htm,3,1 Streamline,streamline.htm,3,1 Tiếng Phỏp,tiengphap,2 Toỏn học,toanhoc.htm,1 Hỡnh học,hinhhoc.htm,2 Hỡnh khụng gian,khonggian.htm,3 Hỡnh giải tớch,hinhgiaitich.htm,3 Đại số,daiso.htm,2 Vật lý,vatly.htm,1 Hoỏ học,hoahoc.htm,1 Danh sỏch

Chương trỡnh sử dụng một danh sỏch cú tờn là gbSubjectList để lưu cỏc đối tượng thuộc lớp menuitemobject.

Tạo cỏc đối tượng menuItemObject

Ta tạo ra một lớp cú tờn là menuItemObject, mỗi một mục trong menu là một đối tượng con (hay là một thực thể ) của lớp này. Cỏc thuộc tớnh của lớp gồm cú:

PsubjectName : một xõu để hiển thị tờn của menuitem

PURL : đường dẫn đến trang web khi người dựng nhấn chuột vào menuitem tương ứng

pLevel : mức của menu plocv,pLoch : vị trớ của menuitem

pVisible : dựa vào thuộc tớnh này để hiển thị hay ẩn đối tượng.

PNewWindow : dựa vào thuộc tớnh này để xột xem cú mở một trang Web trong

một cửa sổ mới hay khụng. Cỏc phương thức của lớp (class method) 1. Hàm tạo

on new me return me end

2. Hàm khởi tạo

Nhận cỏc tham số đọc được từ file menu để gỏn cho cỏc thuộc tớnh trong đối tượng. Mỗi khi đọc được một dũng từ menu file, ta sẽ tạo ra một đối tượng và khởi tạo cho nó.

on Initialize me,mySpriteNumber, mySubjectName, myURL, myPapaOk,myVisible, myNewWindow

pSpriteNumber = mySpriteNumber pSubjectName = mySubjectName

pURL = myURL pIsPapa = myPapaOK pVisible = myVisible pNewWindow = myNewWindow end 3. Hàm hiển thị

Hàm này kiểm tra thuộc tớnh hiển thị của menuitem, đồng thời xem nú là menu con hay cha để cú thuộc tớnh hiển thị thớch hợp như là màu chữ, cỡ chữ...

on CheckVisible me if me.pVisible=true then (adsbygoogle = window.adsbygoogle || []).push({});

sprite(pSpriteNumber).visible=true sprite(pSpriteNumber).locV=gblocv

--if me.FirstLevel=false then -- la menu con thi thut vao sprite(pSpriteNumber).loch=gbloch+10*(pLevel-1) --member(sprite(pSpriteNumber).MemberNum).forecolor = 65 --member(sprite(pSpriteNumber).MemberNum).fontSize = 13 --else member(sprite(pSpriteNumber).MemberNum).forecolor =220-(pLevel- 1)*7 member(sprite(pSpriteNumber).MemberNum).fontSize = 16-(pLevel-1)

--end if gblocv=gblocv+30 end if end 4. Cỏc hàm xử lý sự kiện chuột

Cỏc hàm này xử lý cỏc sự kiện như mousedown, mouseEnter,…

on MouseDown me

--if me.FirstLevel=false then -- la menu con thi thut vao

--member(sprite(pSpriteNumber).MemberNum).forecolor = 70 --else member(sprite(pSpriteNumber).MemberNum).forecolor = 100-(pLevel- 1)*7 --end if end

Hoạt động của chương trỡnh

Cỏc thủ tục chớnh

Thủ tục này được gọi mỗi khi phim bắt đầu chạy. Nú thực hiện cỏc nhiệm vụ dưới đõy:

1. Khai bỏo cỏc biến toàn cục 2. Khai bỏo danh sỏch toàn cục 3. Khởi tạo dữ liệu

4. Đọc menu từ Webserver 5. Nhảy tới khung hỡnh đầu tiờn on startMovie gblocv=72 gbloch=28 clearCache gNetID = void readok=false gbfirstsprite=14 gbMenuFileName = "menu"

gbSubjectList=[]-- Subject ban dau rong -- day la linearlist hideAll

ReadMenufromServer end

Thủ tục này gọi thủ tục ReadMenufromServer để đọc file menu từ Webserver về.

on ReadMenufromServer if not readok then

clearCache

gNetID = getNetText(the moviePath&"menu") end if

end end

Lingo cung cấp một hàm quan trọng để download một file, đú là hàm

getNetText(). Sau khi gọi hàm này nú sẽ được gỏn một Network ID (ở đõy là gNetID – biến toàn cục).

Thủ tục framescript 21:

Sau khi bắt đầu phim bằng thủ tục onStartMovie, trong đú ta đó gọi hàm để download file menu về, phim sẽ nhảy đến khung hỡnh đầu tiờn và script này sẽ được gọi. Thủ tục này cú nhiệm vụ chớnh là chờ cho hàm getNetText()

kết thỳc và cất dữ liệu tuỳ theo cú lỗi trả về hay khụng.

on exitFrame me

-- gNetID is set to void unless there is an active net operation, so we only check for results when needed.

if not(voidP(gNetID)) then

if (netDone(gNetID) = TRUE) then

if (netError(gNetID) = "OK") then – neu khong co loi member("netresult").text=netTextResult()

readok=true else (adsbygoogle = window.adsbygoogle || []).push({});

-- FileContent="loi roi" end if FileContent=member("netresult").text gNetID = void end if --netDone go the frame end if end Thủ tục AddStringtoList:

Thủ tục này thực hiện cỏc bước:

1. Phõn tớch một dũng trong file menu

2. Khởi tạo một đối tượng menuitemobject (ta sẽ núi đến lớp menuitemobject sau) và gỏn cỏc thuộc tớnh của đối tượng đú tuỳ theo dũng menu phõn tớch được.

3. Thờm đối tượng vào danh sỏch

on AddStringtoList thelist,str, spriteNumber trimleft(str)

set aSubjectname=trimleft(item 1 of str) -- alert aSubjectname

set aURL=item 2 of str set item3=item 3 of str

aLevel= value(item3) if item3 contains "1" then aPapaOk=true aVisible=true else aPapaOk=false aVisible=false end if item4=item 4 of str

if item4 contains "1" then aNewWindow=true else

aNewWindow=false end if

--tao moi mot doi tuong -- khoi tao doi tuong

newMenuItemObject = new(script"menuitemobject")

newMenuItemObject.Initialize(spriteNumber,aSubjectname,aURL,aPapaO K,aVisible, aNewWindow,aLevel)

--set temp=[#subjectname:aSubjectname,#URL:aURL] theList.add(newMenuItemObject)

--append theList,temp end

Script hành vi “Click”:

Đõy là một behavior script quan trọng, xử lý cỏc sự kiện chuột và đặc biệt là khi nhấn chuột.

Khi một sự kiện chuột xảy ra, nú sẽ lấy được số hiệu của sprite nhận được sự kiện. Từ đú sẽ xỏc định được đối tượng menu gỏn với sprite đú trong danh sỏch gbSubjectList. Ta truyền sự kiện tương ứng cho đối tượng đú xử lý. property channel property mbNum property button_active property clickedObject --==================--- on beginSprite me channel= me.spriteNum mbNum=sprite(channel).memberNum set the Button_Active of me = false --puppet  dieu khien bang lenh Lingo puppetSprite the spriteNum of me, TRUE

end

on endSprite me -- khong puppet nua

puppetSprite the spriteNum of me, FALSE end

on mouseDown me

pos=channel-gbFirstSprite+1 clickedObject=gbSubjectList[pos] clickedObject.MouseDown()

set the Button_Active of me = TRUE end

on mouseUp me

pos=channel-gbFirstSprite+1 clickedObject=gbSubjectList[pos] clickedObject.MouseUp()

-- cho nay dat hanh dong cua nut khi bi nhan if the button_active of me then

ClickItem end if

-- kep hanh dong trong doan nay set the Button_Active of me = FALSE end (adsbygoogle = window.adsbygoogle || []).push({});

on mouseUpOutside me

set the button_active of me=FALSE end on mouseLeave me pos=channel-gbFirstSprite+1 clickedObject=gbSubjectList[pos] clickedObject.MouseLeave() end on mouseEnter me pos=channel-gbFirstSprite+1 clickedObject=gbSubjectList[pos] clickedObject.MouseEnter() end

Khi nhấn chuột và thuộc tớnh button_active = true thỡ hàm on clickItem

được gọi. Hàm này cú nhiệm vụ:

1. Kiểm tra trong gbSubjectList để đặt lại cỏc thuộc tớnh hiển thị cho thớch hơp.

2. Gọi cỏc hàm hiển thị của từng đối tượng trong gbSubjectList

3. Nếu ở mức menu con thỡ dựng lệnh Lingo gotoNetPage để hiển thị trang Web theo URL được lưu trong đối tượng.

on ClickItem openapage=false

reshow=false--khong can hien thi lai menu --trong cac truong hop: 1.menucon

--2. khong co con

--hideAll

-- dat lai cac pVisible nhu ban dau pos = channel-gbFirstSprite + 1 --clickedpos=pos --URL=getAProp(gbSubjectList[pos],#URL) clickedObject=gbSubjectList[pos] if clickedObject.pBeingOpen=false then p=SeekEqualBeingOpen(clickedObject.pLevel) if p<>0 then CloseAllChildren(p) --ShowCurrentItem reshow=true end if end if

if (pos < count(gbSubjectList)) then -- chua cuoi cung --> kiem tra con cai

if ClickedObject.pHasChild then--neu co con moi kiem tra ClickedObject.pBeingOpen=true

reshow=true thoat=false

tempObject=gbSubjectList[pos+1]--kiem tra xem co con khong

repeat while (tempObject.pLevel > clickedObject.pLevel) and (thoat=false)

reshow=true

if tempObject.pLevel=clickedObject.pLevel+1 then -- sau mot muc tempObject.pVisible=true--sua thanh true de thu tuc CheckVisible dat lai

end if -- sau mot muc pos=pos+1

if (pos < count(gbSubjectList)) then tempObject=gbSubjectList[pos+1] else -- den cuoi cung-->thoat

thoat=true end if end repeat

else -- khong co con openapage=true

end if--neu co con moi kiem tra else --cuoi cung

openapage=true -- ta se mo trang web end if -- chua cuoi cung

if reshow then hideall

gblocv=72 gbloch=28

--repeat with menuItemObject in gbSubjectList --menuItemObject.Checkvisible()

-- end repeat showCurrentItem end if

(adsbygoogle = window.adsbygoogle || []).push({});

if openapage then -- clickedObject.pHasChild=false URL=clickedObject.pURL -- alert "go to " if clickedObject.pNewWindow then gotoNetPage URL,"newwindow" else gotoNetPage URL,"right" end if end if end ClickItem

II. Phim suamenu.dir:

Ta tạo phim suamenu.dir trong Director rồi dịch thành file chạy

suamenu.exe. Chương trỡnh này dựng để đọc và sửa file menu. Giao diện chương trỡnh như hỡnh dưới:

Hoạt động của chương trỡnh

Cỏc thủ tục chớnh:

Chương trỡnh cú hai thủ tục chớnh để đọc và ghi file. Việc thao tỏc trờn file trong Director được hỗ trợ thụng qua một Xtra tờn là fileIOXtra .

Thủ tục readfile:

Thủ tục này được gỏn cho button doc menu . Nó thực hiện cỏc bước: 1. Tạo mới một đối tượng của fileIOXtra

2. Sử dụng đối tượng vừa tạo ra để mở file

3. Đọc nội dung file ra một trường field tờn là user message

on readFile

-- the file path needs to be the same one you wrote to filePath = the moviePath & "menu"

--Tao mot thuc the cua fileIO Xtra fileIOInstance = xtra("FileIO").new()

-- Bay loi neu khong ton tai file Xtra if not fileIOInstance.objectP then alert "File IO Xtra missing" exit end if -- mo file de doc fileIOInstance.openFile(filePath, 0)

--kiem tra trang thai tra ve

if fileIOInstance.status() = 0 then

--neu mo thanh cong  doc file va sau do dong lai fileText = fileIOInstance.readFile()

fileIOInstance.closeFile() -- display the text on stage.

member("user message").text = fileText else

-- if there was an error display the error message on stage.

member("file contents").text = "Error: " & fileIOInstance.error(fileIOInstance.status())

end if end

Thủ tục writefile:

Thủ tục này được gỏn cho button ghi menu , nú thực hiện tương tự như thủ tục readfile, mở một file và ghi từ field user message vào file.

on writeFile

--tao dung dan den file

filePath = the moviePath & "menu" -- set the text

fileText = member("user message").text -- check for empty text

if fileText = "" then (adsbygoogle = window.adsbygoogle || []).push({});

alert "Please enter a text message to save" exit

end if

-- tao thuc the fileIO Xtra

fileIOInstance = xtra("FileIO").new() -- bat loi file Xtra

if not fileIOInstance.objectP then alert "File IO Xtra missing" exit

end if --tao file

fileIOInstance.createFile(filePath)

-- status is a value returned by the fileIO Xtra reporting the status of the last FileIO command executed.

-- in this case it's the result of executing "createFile(fileIOInstance, filePath)"

case fileIOInstance.status() of 0: -- tao file moi

nothing

-122: -- file da ton tai, xoa di roi tao lai fileIOInstance.openFile(filePath, 0)

delete(fileIOInstance)

fileIOInstance.createFile(filePath) otherwise

alert "Error: " & fileIOInstance.error(fileIOInstance.status()) exit

end case

-- mo file, ghi vao

fileIOInstance.openFile(filePath, 0) fileIOInstance.writeString(fileText) -- dong file lai

end

Chương 8: Đỏnh giỏ và hướng phỏt triển I. Cỏc kết quả đạt được

Đó xõy dựng được một bộ khung cho website.Ta cú thể sử dụng khung này để đưa vào đú một website cụ thể, cú nội dung tuỳ ý. Người phỏt triển chỉ việc tạo cỏc trang web và dựng chương trỡnh để liờn kết chỳng lại với nhau.

II. Hướng phỏt triển

+ Hoàn thiện chương trỡnh suamenu.exe theo hướng dễ sử dụng hơn và cú nhiều tuỳ chọn cho người dựng.

+ Phỏt triển chương trỡnh left.dir để cú tớnh thẩm mỹ cao.

III. Tham khảo

1. http://www.Macromedia.com

Một phần của tài liệu đồ án công nghệ thông tin Chương trình Macromedia Director (Trang 85)