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)
end
on endSprite (me)
-- Delete the reference to this object from the groupList
myGroupList.deleteOne(me)
end
on CollectRadioGroup (me, groupList, groupID)
-- Create a references to the groupList, and add self to it
if myGroupID = groupID then
myGroupList = groupList
myGroupList.add(me)
end if
end
on mouseUp (me)
-- inform the group that this button is clicked
call(#GroupSelect, myGroupList, me)
end
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
end
on GetPropertyDescriptionList (me)
pdList = [:]
pdList[#myGroupID] = [#Comment: "GroupID", #default: #RadioGroup, \
#Format: #symbol]
pdList[#myState] = [#Comment: "Default State", #default: 1, \
#Format: #boolean]
return pdList
end