|
the shape's have a behavior like this:
-- DemoShapeBeh
property ancestor,spritenum
on beginsprite me
ancestor = new (script "aShapeObj")
init me
end
-- EoS
and this is the object which does the real work:
------- parent script aShapeObj
-- (@) Daniel Plaenitz, http://www.lingo.de
-- 11/99
-- regiert ein VectorShape
property ancestor,mySelf
property myMbr
property myVertexList
property myOrgRegpoint
property myhaveFocus
property myLDotSprites
property myLastLoc
property myDirtyF
on new me
return me
end
on init me
-- alle Instanzen teilen sich einen ancestor
dObj = getObjekt(#entityObj)
if dObj.ilk <> #instance then
dObj = new(script "entityObj")
setObjekt #entityObj,dObj
end if
ancestor = dObj
me.addChild(me)
-- sprite Eigenschaften
puppetSprite (me.spriteNum) , TRUE
-- memberEigenschaften
myMbr = sprite(me.spritenum).member
myMbr.originmode = #topleft
myMbr.centerregpoint = FALSE
myOrgRegpoint = myMbr.regpoint
-- Liste der handles
myLDotsprites = []
myLastLoc = sprite(me.SpriteNum).Loc
end
on forgetSprite me
-- das ruft ein vectorShapeSprite, wenn er sich abmeldet
puppetsprite (me.spriteNum) , FALSE
me.killChild(me)
end
on mouseUp me
-- eigentlich: sag dem entityObj, dass ich jetzt dran sein will
-- alles weitere passiert dann auf dessen Initiative
if not myHaveFocus then
me.demandFocus()
end if
end
on exitFrame me
if not myHaveFocus then return
me.checkIfMoved()
end
--------------------------------------------
on lostFocus me
--put #lostFocus,me.Spritenum
myHaveFocus = FALSE
me.hideEditDots()
sprite(me.Spritenum).moveableSprite = FALSE
end
on gotFocus me
myHaveFocus = TRUE
sprite(me.Spritenum).locZ = me.getTopSprite()
me.showEditDots()
sprite(me.Spritenum).moveableSprite = TRUE
end
on getSpriteNum me
return me.SpriteNum
end
-------------------------------------------
-- debug
on testDifferenz me, lp1,lp2
cnt = lp1.count
repeat with rum = 1 to cnt
dProp = lp1.getPropat(cnt)
v1 = lp1.getaProp(dProp)
v2 = lp2.getaProp(dProp)
if v1 <> v2 then
put "properties ungleich:" && dProp
put v1
put v2
put
end if
end repeat
return ""
end
on putProps me
dLp = (script "shapePropsObj").suckPropsfromMbr (myMbr)
put #mbrRect, myMbr.rect
put #spriteRect, (sprite(me.SpriteNum).rect)
put #regPoint, dLp.regPoint
put #originPoint,dLp.originPoint
put
end
--------------------------------------------
-- save / restore
on exportProps me
dLp = (script "shapePropsObj").suckPropsfromMbr (myMbr)
dLp.addProp (#orgRegpoint,myOrgRegPoint)
dLp.addProp (#Loc,sprite(me.spriteNum).loc)
return dLp
end
on importProps me,dLp
if myMbr.type = #vectorshape then
(script "shapePropsObj").givePropsToMbr (myMbr,dLp)
end if
myOrgRegPoint = dLp.orgRegPoint
sprite(me.spriteNum).loc = dLp.loc
--demandFocus me
end
--------------------------------------------
on checkIfMoved me
-- muss von jedem sprite ausgefuehrt werden,
-- wenn verschieben direkt moeglich ist (moveable)
myLoc = sprite(me.spriteNum).loc
myVec = myLastLoc - myLoc
if myVec = point(0,0) then return
myLastLoc = myLoc
tellGroupMove me,myVec
myDirtyF = TRUE
end
on tellGroupMove me,dVec
repeat with dSprite in myLDotSprites
sendSprite dsprite,#moveSprite,dVec
end repeat
end
--------------------------------------------
on convScreenKoords2Vertex me,dScreenPoint
dLoc = sprite(me.spritenum).loc
dregP = myOrgRegPoint --myMbr.regPoint
dOrigP = myMbr.originPoint
dScreenVec = dScreenPoint - dLoc
dMemVec = dOrigP - dregP
dvertexP = dScreenVec - dMemVec
return dVertexP
end
on convVertex2ScreenKoords me,dVertexPoint
dLoc = sprite(me.spritenum).loc
dregP = myOrgRegPoint --myMbr.regPoint
dOrigP = myMbr.originPoint
dMemVec = dOrigP - dregP
dScreenVec = dVertexPoint + dMemVec
dScreenPoint = dScreenVec + dLoc
return dScreenPoint
end
on xconvScreenKoords2Vertex me,dScreenPoint
origin = sprite(me.spritenum).loc - myMbr.originPoint
dvertexPoint = (dScreenPoint - origin) * 1.0
return dvertexPoint
end
on xconvVertex2ScreenKoords me,dVertexPoint
origin = sprite(me.spritenum).loc - myMbr.originPoint
dScreenPoint = (dvertexPoint + origin)
dScreenPoint[1] = integer(dScreenPoint[1])
dScreenPoint[2] = integer(dScreenPoint[2])
return dScreenPoint
end
----------------------------------
on moveVertexWithSprite me,dDotSprite,dVec
dPos = myLDotSprites.getPos(dDotSprite)
if not dPos then return
moveVertex ( myMbr, dPos, -dvec[1], -dvec[2] )
myDirtyF = TRUE
end
---------------------------------------------------------------
-- dots verwalten
on dotEvent me,dDotSprite,LParam
if LParam.count > 0 then
dEvent = LParam[1]
if dEvent = #moved then
dVec = LParam[2]
me.moveVertexWithSprite (dDotSprite,dVec)
end if
else
put #dotEvent,dDotSprite,LParam
end if
end
on showEditDots me
dvertexList = myMbr.vertexList
cnt = dVertexList.count
repeat with rum = 1 to cnt
dVertex = dVertexList[rum]
dVertexPoint = dVertex.vertex
dScreenPoint = convVertex2ScreenKoords (me,dVertexPoint)
me.makeAdot(dScreenPoint)
end repeat
end
on hideEditDots me
farOut = point (0,0) - 5000
cnt = myLDotSprites.count
repeat with rum = 1 to cnt
dSprite = sprite(myLDotSprites[rum])
(dSprite).Loc = farOut
(dSprite).puppet = FALSE
end repeat
myLDotSprites = []
end
on MakeADot me,dScreenPoint
dLp = [#member:member "dot_up",#forecolor:255,#loc:dScreenpoint]
addProp dLp,#behavior, "dotBeh"
addProp dLp,#moveableSprite,TRUE
dSprite = getEmptySprite(me,sprite(me.Spritenum).locZ)
me.spriteVoodoo(dSprite,dLp)
sendSprite (dSprite,#setruler,me)
myLDotSprites.append(dSprite)
end
on spriteVoodoo me,dSprite,dLp
if integerP(dSprite) then
puppetSprite dSprite,TRUE
repeat with rum = 1 to dLp.count
dProp = dLp.getPropAt(rum)
case dProp of
#member:
sprite (dSprite).member = dLp.member
#ink:
sprite (dSprite).ink = dLp.ink
#behavior:
-- behaviors an leere sprites zu kleben ist richtig arbeit
sprite (dSprite).scriptInstanceList = [ ( new(script (dLp.behavior)) ) ]
sendSprite (dSprite,#beginSprite)
sendSprite (dSprite,#setMySprite, dSprite)
#rect:
sprite (dSprite).rect = dLp.rect
#loc:
sprite (dSprite).loc = dLp.loc
#moveableSprite:
sprite (dSprite).moveablesprite = dLp.moveablesprite
#trails:
sprite (dSprite).trails = dLp.trails
#backColor:
sprite (dSprite).backcolor = dLp.backcolor
#forecolor:
sprite (dSprite).forecolor = dLp.forecolor
end case
end repeat
end if
end
--------------------------------------------------
|