Lingo giao tiếp với trình duyệt

Một phần của tài liệu Công nghệ shockwave trên internet (Trang 56)

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. (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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à (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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()) (adsbygoogle = window.adsbygoogle || []).push({});

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. (adsbygoogle = window.adsbygoogle || []).push({});

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 Công nghệ shockwave trên internet (Trang 56)