|   Site Nav
css drop down menu by Css3Menu.com | Script Writer wfsWriteMultiSpriteFamily 
          Handler   wfsWriteMultiSpriteFamily (managerNameOrSpriteNumToCopy, 
          doNotCreateNewMembers) Function
 wfsWriteMultiSpriteFamily generates and returns handlers that 
          you use to create a dynamic copy of a static family of multi-sprites. 
          You call wfsWriteMultiSpriteFamily from the Director Message Window 
          while the movie is running and the target family is instantiated like 
          so: put wfsWriteMultiSpriteFamily(managerNameOrSpriteNumToCopy, doNotCreateNewMembers) Lingo code is then output to the Message Window which you copy and 
          paste into a movie script. wfsWriteMultiSpriteFamily will only write code for elements that are 
          currently instantiated in the static model family you aim it 
          at.  The wfsWriteMultiSpriteFamily handler is in the "Script 
          Writer" movie script.  Parameters
 managerNameOrSpriteNumToCopy 
          is an integer or string. If it is an integer, it is the spriteNum 
          of the Manager of the multi-sprite you want to start the family copy 
          at. If it is a string, it must be the name of the multi-sprite you want 
          to start the family copy at. doNotCreateNewMembers 
          determines whether, when the family is created, new members are created 
          or whether members used by the static version are used. If you specify 
          any integer value at all for this parameter, new members will not be 
          created. If you omit this parameter altogether, or specify 0 or VOID, 
          new members will be created.   Return Value
 Code is returned by wfsWriteMultiSpriteFamily wfsWriteMultiSpriteFamily returns the handlers necessary to create 
          and initialize a family of multi-sprites.  If the family you aim wfsWriteMultiSpriteFamily at has n multi-sprites 
          in it, then n+1 handlers are generated. The first one that appears in 
          the message window is the handler you call to generate the family. It 
          takes no parameters. It contains calls to the other n handlers generated 
          by wfsWriteMultiSpriteFamily. The latter n handlers have been produced 
          by wfsWriteMultiSpriteFamily making calls to wfsWriteMultiSprite, ie, 
          one for each multi-sprite in the family. The form of the name of the first handler output by wfsWriteMultiSpriteFamily 
          is as follows. It starts with "wfsCreate". Then it contains 
          the name of the multi-sprite you aimed wfsWriteMultiSpriteFamily at. 
          Characters that are illegal in handler names are stripped out. Then 
          it contains the symbol "E". Then the sprite channel in which 
          the manager was located. Then the frame number in which wfsWriteMultiSpriteFamily 
          was executed. Finally, it contains the string "Family". So, 
          for example, if wfsWriteMultiSpriteFamily was aimed at a manager named 
          "main window" that was in sprite channel 10 and frame 572, 
          then the first handler would be named wfsCreatemainwindowE10F572Family. 
         The other n handlers are named according to the naming conventions 
          of wfsWriteMultiSprite, 
          which are the same as the above except "Family" is not appended 
          at the end. A property list is returned by code generated by wfsWriteMultiSpriteFamily Now let's discuss what is returned when you run the first handler generated 
          by a call to wfsWriteMultiSpriteFamily. A dynamic multi-sprite family is created and a property list is returned. 
          Or it returns 0 if there weren't enough available dynamic channels to 
          create the full family and, in that case, it does not create anything. 
          Each property name in the returned property list is the spriteNum of 
          a manager in the newly created family; each property value in the returned 
          property list is the name of a newly created manager. So, for instance, 
          if the created family consisted of just one multi-sprite, and the dynamic 
          multi-sprite was managed by sprite 345 and the name of the newly created 
          dynamic multi-sprite was "A", then the returned property list 
          would be [345:"A"]. The order in which the property list lists 
          the dynamic multi-sprites reflects a depth-first traversal of the family 
          tree. Recall that the names of simultaneously instantiated multi-sprites 
          must all be different. So when you create dynamic multi-sprites, their 
          names will not be the same as the names of their corresponding static 
          models. wfsWriteMultiSpriteFamily returns code that names dynamic multi-sprites 
          according to the following rules. Multi-sprites generated by code returned by wfsWriteMultiSpriteFamily 
          have names that have three components separated by the "+" 
          symbol. So these names are not really appropriate for display to the 
          user. The first component is the name of the static model multi-sprite. 
          The second component is the name of the multi-sprite at which you aimed 
          wfsWriteMultiSpriteFamily. The third component is a number indicating 
          the number of dynamic copies of this family. 
  In the above graphic, the lines joining multi-sprites
          indicate parent-child relationships: r and s are the names of two multi-sprites,
          and q is
          the name of the
          multi-sprite that is the parent of r and s.  If we were to point wfsWriteMultiSpriteFamily at q, it
          would generate code to reproduce the family. When we ran that code,
          we would get a dynamic family named as in the first copy of the family.
          If we ran the generated code again, while the first copy was still
          instantiated, we'd get a second family named like the multi-sprites
          in the second copy of the family.  Suppose q has the "Open a Window" behavior attached to
          it, and that behavior opens window r. The wfsWriteMultiSpriteFamily
          handler is smart enough to write code so that q+q+1 will open r+q+1.
          WFS adjusts links within the family.  It does not adjust links outside
            the family, though. For instance, if an "Open a Window" behavior
          was attached to q and the behavior was supposed to open x, some multi-sprite
            not in the family, then q+q+1 would open x also.  Example
 You can see an example of the use of wfsWriteMultiSpriteFamily in the 
          feature demo source code in scene 10. 
          When you click the gray text that says "create multisprite family", 
          a dynamic copy of the family is generated. Let's look step-by-step at 
          how this was done. The steps below follow the same order as the generic 
          steps in using any of the three Script Writer handlers. 
          We make sure the movie has a copy of the "1: 
            prepareMovie", "Dynamism", 
            and "Script Writer" movie 
            scripts in a cast.
 
We edit the value of gWFSLastStaticSpriteChannel in the 'initializeDynamism' 
            handler of the "Dynamism" script, as per instructions, 
            if you haven't already. gWFSLastStaticSpriteChannel determines how 
            many sprite channels in your movie are allocatable for dynamic sprite 
            creation. In the feature demo source code, gWFSLastStaticSpriteChannel=84, 
            ie, the drag and drop sprite with the highest channel number is sprite 
            84 (in scene 10). The feature demo contains 1000 sprite channels. 
            So there are 1000 - 84 = 916 channels that are allocatable for dynamic 
            sprite creation.
 
The static model of the family was created in the Score.This is 
            quite an extensive family. It consists of about 70 sprites and many 
            windows and menus. If you start the movie and then navigate to scene 
            10 
            in the source code, and then stop the movie, you are in the right 
            spot.
 
Start the movie and navigate to a frame where the static model of 
            the target family is instantiated. In the case of this example, we 
            navigate to scene 10 
            in the movie.
 
Now we run wfsWriteMultiSpriteFamily from the Message Window. It 
            takes two parameters. The first parameter is the name of the manager 
            at which we want to start the family copy ("main window") 
            or this manager's spritenum (10). Either will do. The second parameter 
            determines whether the dynamic family's members will be the same as 
            the static model's members, or whether the members will be new copies 
            of the static model's members. If you don't need to create new members, 
            it's best not to because they take up extra resources. We want most 
            of the dynamic sprites to use the same member as the sprites 
            in the static model, so the second parameter will be 1, and we will 
            edit the generated code, later on, concerning the sprites whose members 
            we want to be new copies. So we type
 put wfsWriteMultiSpriteFamily(10, 1)
 
 in the Message Window and, consequently, we see many handlers appearing 
            in the Message Window. It takes a while for all the code for this 
            family to appear in the Message Window. Wait for it.
 
 wfsWriteMultiSpriteFamily will first output a handler named something 
            like "wfsCreatemainwindowE10F570Family". This first handler 
            is the one we will call to produce a dynamic family. Read the Return 
            Value section of this document for the rationale concerning how 
            the handler is named. Other handlers will also be produced: one for 
            each multi-sprite in the family.
 
 
All the generated handlers were copied from the Message Window and 
            pasted into a movie script. In particular, they were pasted into the 
            movie script named "generated1" that is in the WFS 4 cast. 
            I tend to keep the handlers generated by the Script Writer in one 
            movie script, just so that I know where they all are.
 
Now that we have the generated code in a movie 
            script, we may wish to do a bit of customization of the generated 
            code. Why and how? Well, we ran wfsMultiSpriteFamily(10,1). The second 
            parameter means that the members of the dynamic family will be the 
            same ones as the members of the static model family. But there's one 
            sprite which we want to have its own new member. Note that when you 
            click "create multisprite family" to create a new family, 
            the name of a dynamic multi-sprite is displayed at top left of the 
            window. If this text used the same member as the static model used, 
            then the text of the name would have to be the same among sprites 
            that use that member. Because sprites that share the same text/field 
            member necessarily display the same text. But we want different dynamic 
            multi-sprites to display their own name.
 We note that that sprite 13 in scene 10 
            is the sprite that displays the name of the window. We also note that 
            sprite 13 has a member called "main window label".
 
 Now we open up the source code of the 'generated' movie script in 
            the WFS 4 cast. Search for "main window label" in that script. 
            We see that "main window label" occurs in the below code:
 
 
 theNewSpriteNum = wfsCreateSprite(["main 
              window label", "7: 
              Normal Menus", 36, 100, 
              294, 32, 78, 38]) --parameters: [member, cast, ink, blend, 
              width, height, locH, locV, doNotCreateNewMember] --If you don't specify a value for doNotCreateNewMember, 
              then a copy of the member will be created. --If you specify any value for doNotCreateNewMember, 
              then the sprite will be created using the same -- member.
 The thing to note is that no value for doNotCreateNewMember is 
              specified. The comments indicate that the parameter list can take 
              9 things, but there are only 8 things in the line with the call 
              to wfsCreateSprite. Note also that all the other lines that call 
              wfsCreateSprite have 9 things in the parameter list. I edited the 
              above line, deleting the "1" specified elsewhere for the 
              doNotCreateNewMember parameter. Because when the "main window 
              label" sprite is created, I want it to have its own member.
 For more information on editing code produced by the "Script 
              Writer" handlers, read the section entitled "Editing 
              code generated by the Script Writer handlers".
 
We need to write some Lingo that calls the "wfsCreatemainwindowE10F570Family" 
            handler. If you look at the gray text that says "create multisprite 
            family " in scene 10 of the feature demo, you see it has attached 
            to it a behavior called "tester". If you open up that behavior 
            in the script window, you see the below code:
 
 on mouseup me   if 
              the clickon =spritenum then     
              --wfsCreatemainwindowE10F570Family was 
              generated by the     
              --wfsWriteMultiSpriteFamily handler 
              in the Script Writer movie script.     
              --wfsCreatemainwindowE10F570Family creates 
              a dynamic copy of     
              --the family of multi-sprites rooted 
              by the manager named "main window"      
              --located in channel 10, frame 570. 
                   
              --wfsCreatemainwindowE10F570Family was 
              generated via     
              --put wfsWriteMultiSpriteFamily(10, 
              1)     
              --typed in the Message Window while 
              the movie was playing and the     
              --playback head was in a frame where 
              the target (static) family was     
              --instantiated, namely frame 570.     
              theBigList = wfsCreatemainwindowE10F570Family()   end if end When you click the text that says "create multisprite family", 
              the above handler runs, which calls "wfsCreatemainwindowE10F570Family" 
              and a dynamic family is created. 
As you can see if you run the movie and navigate to scene 10, 
            you can click "create multisprite family" repeatedly and, 
            each time, a new family will be created as long as there are enough 
            dynamic sprite channels to create the whole multi-sprite. If there 
            aren't, "wfsCreatemainwindowE10F570Family" will return 0.
 
Note also that if you click the blue button at top right of scene 
            10 
            windows, the family is destroyed. The blue button has a behavior attached 
            to it called "Destroy Family On Mouseup". That behavior 
            contains the below handler:
 
 on mouseup me   if 
              the clickon = spritenum then     
              cursor 0     
              theManager=sprite(spritenum).wfsGetMyManagerSpriteNum()     
              theResult=wfsDestroyMultiSpriteFamily(theManager, 1)   end 
              if end See the documentation on the destructors 
              for more information on using destructors. WFS does garbage collection 
              of all dynamic sprites at the end of the movie, ie, they are all 
              destroyed and garbage collected, but you can use the destructors 
              during the movie to free up dynamic channels. Note that if you change the static model, you need to call wfsWriteMultiSpriteFamily 
          again to regenerate the code. Otherwise, the generated code will produce 
          the old version. You can delete the "Script Writer" handler from the cast 
          when you are finished generating code. That is all it does. You can also delete the static model from the Score when your project 
          is all finished, if you want. The code that wfsWriteMultiSpriteFamily 
          generates does not depend on the static model being present in the Score. 
          But don't delete the cast members of the static model. The code generated 
          by wfsWriteMultiSpriteFamily needs those cast members. But it is a good idea to keep a copy of your project that has the static 
          model in it and the Script Writer in it also, so that you can edit it 
          easily later on, ie, regenerate the code and so on.   |