Articles Archive
Articles Search
Director Wiki
 

Tracking multiple users

July 20, 1998
by Pat McClellan

Dear Multimedia Handyman,

Ok, what advice you got regarding setting up a movie that can be used by several users, one that tracks where they have been within the movie and allows them to save the place. then come back later...enter their user name and carry on from where they were.

lists, fileIO and read/writing ini files??

Louis Savy
empower new media, london

Dear Louis,

Glad you asked... because this is one I've done many times. And yes, you've hit the nail on the head: lists and fileIO.

In the training CDs I produce, like you, I want to allow the user to save their position in the program -- a bookmark. Along with the bookmark, I save the user's name, employee number, date of participation, and scores on various quizzes. To accomplish this, I create a global property list, which is saved when the user quits the program. Then, next time the user logs into the program, that information is retrieved and the user can pick up where they left off. FileIO takes care of the saving and retrieving of that information.

For starters, you won't find the instructions for FileIO in the manuals. I know that FileIO comes free from Macromedia with Director, but it is an Xtra, so you'll have to treat it like one. Find the FileIO folder and print out the enclosed read me file. Those are the instructions, complete with some examples & definitions of all the commands.

Here's what must be done to save info as a text file:

1) Create a new instance of FileIO. You do this by setting a variable -- I'll use "myFile" -- equal to the instance. If you've never used Xtras or objects, this will seem strange, but it's not hard.

set myFile = new (xtra "fileio")
2) Designate that the file we save will be a text file. Since Windows & Mac differ in this aspect, the code must test to see which platform you're using.

if the platform = 256 then  -- Windows
  setFilterMask (myFile,"Text Files, *.txt")
else
  -- Mac
  setFilterMask (myFile,"Text Files, TEXT")
end if

3) Pick a name & location for the file. You can either designate one, or use a standard Save/Open dialog box and let the user do it.
set fileName = displaySave(myFile)
4) Create an empty file, which we will soon put information into. This does NOT save the file, it just creates it in RAM. (It "names" the file whatever was designated in step 2.)
createfile (myFile, fileName)
5) Now that it has been created, open it. You can open it in read only (1), write only (2), or read/write mode (0).
openFile(myFile, fileName, 2)
6) You're going to be writing information into the file, so we need to tell it WHERE to start (at the top).
setPosition (myFile, 2)
7) Now write the information to the file. Currently, the info is stored in a global variable, in the form of a property list. You need to convert that data to a string so that it can be written to the text file. I also end it with a RETURN.
writeString (myFile, string ¬
  (gThisUsersInfoList)&RETURN)
8) Now that we have written the data to the file, close it.
closeFile (myFile)
9) Last step is to "dispose" of the Xtra. This is important, but easy.
set myFile = 0
Congratulations, you have just saved a file using FileIO. Here's the handler in its entirety. The handler is called when the user presses the Exit button.

on saveUserInfo
  -- initializes fileIO
  
  global gThisUsersInfoList
  set myFile = new (xtra "fileio") 
  
  if the platform = 256 then  -- Windows
    setFilterMask (myFile,"Text Files, *.txt")
  else -- Mac
    setFilterMask (myFile,"Text Files, TEXT")
  end if
  
  -- allows user to designate the pathname & filename
  
  set fileName = displaySave(myFile) 
  createfile (myFile, fileName)
  
  -- this opens the file in write mode 
  
  openFile(myFile, fileName, 2)
  --set position to top of file
    
  setPosition (myFile, 0) 
  
  -- writes data as string ending
  -- in a RETURN into the text file 
  
  writeString (myFile, string¬
    (gThisUsersInfoList)&RETURN) 
  closeFile (myFile)
  set myFile = 0
  
end saveUserInfo

Here's the handler for retrieving that information when the user logs in next time. It gets called from a keyDownScript when the user presses Control-O or Command-O. I've commented the code, so you should be able to figure it out.

on getUserInfo
  global gThisUsersInfoList
  
  -- initializes fileIO
  
  set myFile = new (xtra "fileio") 
  
  if the platform = 256 then 
    -- Windows
    setFilterMask (myFile,"Text Files, *.txt")
  else 
    -- Mac
    setFilterMask (myFile,"Text Files, TEXT")
  end if
  
  -- allows user to designate the pathname & filename
  
  set fileName = displayOpen(myFile) 
  
  -- opens the file in read only mode
  
  openFile(myFile, fileName, 1) 
  
  --set position to top of file
  
  setPosition (myFile, 0) 
  
  -- this reads the file into memory
  -- (as string data, up to the first RETURN)
  
  set theFile = readLine(myFile) 
  
  -- puts the string data into 
  -- a pre-existing field member
  put theFile into field "theData" 
  
  -- closes the file
  
  closeFile(myFile) 
  
  -- disposes of this instance of fileIO XTRA
  
  set myFile = 0 
  
  -- tests to see if the data is a list
  
  if NOT listP(value(theFile)) then  
    alert "The data in this file appears ¬
      to be corrupted."
  else
    -- converts the string data
    --  back into a property list
    set gThisUsersInfoList = value(theFile) 
  end if
  
end getUserInfo

Once you're comfortable with what's going on in these handlers, you should explore the other commands available to you with FileIO. It's amazing just how much functionality you can add to your Director programs with the use of "Save" and "Open".

Note: For similar functionality in Shockwave, take a look at the "setPrefs ()" and "getPrefs ()" commands.

Patrick McClellan is Director Online's co-founder. Pat is Vice President, Managing Director for Jack Morton Worldwide, a global experiential marketing company. He is responsible for the San Francisco office, which helps major technology clients to develop marketing communications programs to reach enterprise and consumer audiences.

Copyright 1997-2017, Director Online. Article content copyright by respective authors.