Grouping Sprites

Often, it is helpful to have sprites group themselves together. A common example of this is using 'radio buttons' - if one button in the group is selected, then the others should be de-selected.

Consider the following example in which there are two groups of 3 radio buttons:

Each of the radio button sprites has the same behaviour attached. This behaviour has two parameters which can be assigned: (1) What group the button belongs to, and (2) whether or not the button should default to a selected state.

When the behaviour is instantiated and receives the 'beginSprite' message, it sends out a ''CollectRadioGroup' message, passing as a parameter the groupID of that button and an empty list. All the radioButtons, including the one that sent the message, respond to that message by checking whether they belong to that group. If they do belong to that group, they do two things: (1) they add themselves to the list of group members, and (2) they keep a reference to that list. This way, all the members of the group have access to a shared list of group members. This list is used to send messages to the group using Lingo's "Call" function.

property myGroupID

property myGroupList

property myState

on beginsprite me


  -- make sure the hilite is correctly set

  sprite(me.spriteNum).member.hilite = myState


  -- now collect other members of the group

  sendAllSprites(#CollectRadioGroup, [], myGroupID)


  -- if this button is selected, make sure the others are not

  if myState then call(#GroupSelect, myGroupList, me)



on endSprite (me)


  -- Delete the reference to this object from the groupList




on CollectRadioGroup (me, groupList, groupID)


  -- Create a references to the groupList, and add self to it

  if myGroupID = groupID then

    myGroupList = groupList


  end if



on mouseUp (me)


  -- inform the group that this button is clicked

  call(#GroupSelect, myGroupList, me)



on GroupSelect (me, whoIsSelected)


  -- a member of the group has been selected. If the selected

  -- object is this object, then hilight the button. Otherwise,

  -- turn the hilight off.

  if whoIsSelected = me then myState = 1

  else myState = 0

  sprite(me.spriteNum).member.hilite = myState



on GetPropertyDescriptionList (me)


  pdList = [:]

  pdList[#myGroupID] = [#Comment: "GroupID", #default: #RadioGroup, \

#Format: #symbol]

  pdList[#myState] = [#Comment: "Default State", #default: 1, \

#Format: #boolean]

  return pdList



Source Movie is here

First published 07/06/2005