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
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
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
-- 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
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
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
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