Dùng externalEvent từ trong một phim để điều khiển các đối tợng ngoài trong trình duyệt, bao gồm các phim Shockwave khác. Lệnh này có dạng
ExternalEvent “string”
Trong đó string thể hiện một lệnh của trình duyệt mà phim Shockwave gửi đi.“ ”
Hàm này không trả về một giá trị.
Cách môi trờng dịch xâu dùng trong externalEvent phụ thuộc vào môi trờng script.
Phần III: xây dựng Chơng trình
Chơng 6: Phân tích chơng trình I. Nội dung chơng trình:
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:
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> 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 web trên menu Hiển thị nội dung trang web
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 để lu 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 cha 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 cha sử dụng sẽ đợc ẩn đi.
Các kênh còn lại cha đợ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 đó:
#Name: tên của menuItem #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: 62 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 Bài 1,bai1.htm,4 Bài 2,bai2.htm,4 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 để lu 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ó: PspriteNumber : chỉ số của sprite đợc gán cho đối tợng này
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
--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 start :
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
alert "khong doc duoc file menu" -- 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:
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 ,aPapaOK,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.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 lu 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
-- 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 --alert "has children"
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
-- 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
fileIOInstance.closeFile() 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