hawley@adobe.COM (Steve Hawley) (08/10/90)
I tried to mail this to the original poster, but it bounced. Larry
Rosenstein covered a pretty good description of the technique. Off the
top of my head, I put together the following piece of code, which should
do exactly what the poster asked for. I can't say if this will work
correctly or not, because I don't have a Mac to try it out on :'(, but
the structure is there, and I have abstracted out the object routines.
Perhaps someone should check to see if this is correct, and bundle it with
Larry's reply for a frequently asked questions posting (or archive).
long bitData;
static BitMap testMap = { /* check this for me - I forget the structure */
{0, 0, 2, 2}, 2, (Ptr)&bitData
};
GrafPort testPort;
Object *
TestPoint(p)
Point p;
{
/*
* Test to see if a point is on or very near an object.
* Returns a pointer to the object hit, or NULL if none
* was hit.
*/
static int notinited = 1;
GrafPtr savePort;
register Object *thingPtr, *FirstObject(), *NextObject();
/* your object handling code */
GetPort(&savePort);
if (notinited) { /* you can have an InitHit() routine, but I
* prefer this structure.
*/
OpenPort(&testPort); /* OpenPort() does a SetPort() */
SetPortBits(&testMap);
notinited = 0;
}
else {
SetPort(&testPort);
}
MovePortTo(p.h, p.v);
bitData = 0;
for (thingPtr=FirstObject(); thingPtr; thingPtr=NextObject(thingPtr)) {
DrawObject(thingPtr);
if (bitData) break;
}
SetPort(savePort);
return(thingPtr);
}
Steve Hawley
hawley@adobe.com
--
"Break out the cameras that reshape my face and get someone to carve up my head"
-Alcatraz, "God Blessed Video"