A true colorwheel for director using imaging lingo. the behaviour can be attached to ANY sprite in the score and automatically creates all needed members, including the color-circle image. simply drop it on a sprite and press play!
--------- True Lingo Color Wheel 1.0 / alterFin 3.2001 / This Side Up / Handle With Care ---------------
on getBehaviorDescription
description =
"Place this behaviour on any sprite in the score, then run the movie. "&return&
"Allow some time to create the members and sprites for the TrueColorWheel. "&return&
"Note: the behaviour contains a GO TO THE FRAME that can be later removed."&return&return&
"TrueColorWheel 1.0 by Yariv Alter Fin / www.alterFin.com / lingo@alterFin.org"
return description
end
on beginSprite me
if pborder>14 then pBorder=14 -- director limit on shape members linesize...?????
spr=sprite(me.spritenum)
if member("TCW bgMember").membernum=-1 then
mem=new(#shape)
mem.shapeType=#oval
mem.filled=1
mem.name="TCW bgMember"
end if
spr.member=member("TCW bgMember")
if member("TCW WheelBitmap "&diameter.string).membernum=-1 then
m=new(#bitmap)
m.image=the stage.image.crop(rect(0,0,diameter,diameter))
createColorWheelBitmap(diameter/2,m)
m.name="TCW WheelBitmap "&diameter.string
end if
repeat with i=me.spritenum+1 to the lastchannel
if sprite(i).membernum=0 then
curspr=i
exit repeat
end if
end repeat
spr=sprite(curspr)
puppetsprite(curspr,true)
rad=diameter/2
if member("TCW borderMember").membernum=-1 then
mem=new(#shape)
mem.shapeType=#oval
mem.filled=0
mem.name="TCW borderMember"
end if
spr.member=member("TCW borderMember")
spr.linesize=pBorder
spr.height=diameter+spr.linesize*2-2
spr.width=diameter+spr.linesize*2-2
spr.loc=circleSpr.loc-[rad+spr.linesize-1,rad+spr.linesize-1]
spr.color=rgb(255,255,255)
borderSpr=spr
-- dotSpr - saturation
repeat with i=me.spritenum+1 to the lastchannel
if sprite(i).membernum=0 then
curspr=i
exit repeat
end if
end repeat
spr=sprite(curspr)
puppetsprite(curspr,true)
dotSpr=spr
if member("TCW handleMember").membernum=-1 then
mem=new(#shape)
mem.shapeType=#oval
mem.filled=0
mem.name="TCW handleMember"
end if
spr.member=member("TCW handleMember")
dotSpr.width=max(pBorder,4)
dotSpr.height=max(pBorder,4)
dotspr.linesize=2
dotSpr.ink=2
dotspr.loc=middlePoint-[dotspr.width/2,dotspr.height/2]
-- briSpr - value
repeat with i=me.spritenum+1 to the lastchannel
if sprite(i).membernum=0 then
curspr=i
exit repeat
end if
end repeat
spr=sprite(curspr)
puppetsprite(curspr,true)
briSpr=spr
spr.member=member("TCW handleMember")
briSpr.width=max(pBorder,4)
briSpr.height=max(pBorder,4)
briSpr.linesize=2
if the mousedown then
if engage=#off then
case the rollover of
(CircleSpr.spritenum),(BorderSpr.spritenum):
dotSpr.loc=constrainCircle(mid,moc,rad)-[dotSpr.width/2,dotSpr.height/2]
engage=#circle
(dotSpr.spritenum):
dif=moc-dotSpr.loc
engage=#dot
(briSpr.spritenum):
dif=moc-briSpr.loc
engage=#brightness
end case
end if
else
engage=#off
end if
case engage of:
#circle:
colorPoint=constrainCircle(mid,moc,rad)
nowrad=distance(colorpoint,mid)
saturation=min([max([(1.0000*nowrad)/rad,0]),1])
dotSpr.loc=colorPoint-[dotSpr.width/2,dotSpr.height/2]
#dot:
newDotLoc=moc-dif
colorPoint=constrainCircle(mid,newDotLoc+[dotSpr.width/2,dotSpr.height/2],rad)
nowrad=distance(colorpoint,mid)
saturation=min([max([(1.0000*nowrad)/rad,0]),1])
dotSpr.loc=colorPoint-[dotSpr.width/2,dotSpr.height/2]
#brightness:
newBriLoc=moc-dif
briPoint=constrainCircleBorder(mid,newBriLoc,rad+borderSpr.linesize/2)
briSpr.loc=briPoint-[briSpr.width/2,briSpr.height/2]
brightness=1.0000*abs(180-angle(briPoint,middlePoint))/180
circleSpr.blend=brightness*100
end case
if engage<>#off then borderSpr.color=newcol
go to the frame
end
----- my pseudo math handlers... --------------------------------
on angle loci,mid
diff=loci-mid
difX=diff[1]
difY=diff[2]
if difX<>0 and difY<>0 then
flag=[abs(difX)/difX,abs(difY)/difY]
else
if difX=0 and difY=0 then
flag=[0,0]
else
if difX=0 then
flag=[0,abs(difY)/difY]
else
flag=[abs(difX)/difX,0]
end if
end if
end if
if float(abs(difX))<>0 then
theAngle= atan(float((difY))/float((difX)))
else
theAngle=1.5708
end if
newDeg=theangle * 57.2957795786
if flag[1]=1 or flag=[0,1] then fix=90
if flag[1]=-1 or flag=[0,-1] then fix=270
theDeg=newDeg+fix
if theDeg>=360 then theDeg=theDeg mod 360
return theDeg
end
on AtoB A,B,part
return (A*(1-part)+B*part)
end
on constrainCircle midpoint,curpoint,radius
newX=curpoint[1]
newY=curpoint[2]
nowrad=distance(curpoint,midpoint)
if nowrad>radius then
difrad=abs((1.0000*radius)/nowrad)
oldX=curpoint[1]-midpoint[1]
oldY=curpoint[2]-midpoint[2]
newX=midpoint[1]+oldX*difrad
newY=midpoint[2]+oldY*difrad
end if
return point(newX,newY)
end
on constrainCircleBorder midpoint,curpoint,radius
nowrad=distance(midpoint,curpoint)
difrad=abs((1.0000*radius)/nowrad)
oldX=curpoint[1]-midpoint[1]
oldY=curpoint[2]-midpoint[2]
newX=midpoint[1]+oldX*difrad
newY=midpoint[2]+oldY*difrad
return point(newX,newY)
end
on distance point1,point2
res=sqrt((point1[1]-point2[1])*(point1[1]-point2[1])+(point1[2]-point2[2])*(point1[2]-point2[2]))
return res
end
on createColorWheelBitmap radius,mem
mid=[radius,radius]
repeat with y=0 to radius*2
repeat with x=0 to radius*2
cp=[x,y]
nowradius=distance(cp,mid)
sat= min([max([(1.0000*nowradius)/radius,0]),1])
deg=angle(cp,mid)
if distance(mid,cp)>radius then col=rgb(255,255,255)
else col=calculateHSV(deg,sat,1)
mem.image.setpixel(x,y,col)
end repeat
end repeat
end
on calculateHSV hue,sat,val --degrees / saturation / value
col=degrees2color(hue)
wcol=rgb(AtoB(255,col.red,sat),AtoB(255,col.green,sat),AtoB(255,col.blue,sat))
return rgb(AtoB(0,wcol.red,val),AtoB(0,wcol.green,val),AtoB(0,wcol.blue,val))
end
on degrees2color deg
mymod=1.0000*((10000*deg) mod (10000*60))/10000 -- special thanx to Roy Crisman for the feedback...
posval=integer(1.0000*(mymod)/60*255)
negval=integer(1.0000*(60-(mymod))/60*255)
if deg<60 then col=rgb(255,posval,0)
if deg>=60 then col=rgb(negval,255,0)
if deg>=120 then col=rgb(0,255,posval)
if deg>=180 then col=rgb(0,negval,255)
if deg>=240 then col=rgb(posval,0,255)
if deg>=300 then col=rgb(255,0,negval)
return col
end
Contact
MMI
36 South Court Sq
Suite 300
Newnan, GA 30263
USA