Help with image effect

Alex Tweedly alex at tweedly.net
Tue Oct 25 22:07:04 EDT 2005


MisterX wrote:

>Alex
>
>Here's the new script I made - note that now it's TAOO style ;)
>It applies to any control's rect... And it swaps layers at some
>point.
>The third parameter is a bit improved and the layer switch couldn't
>be smarter - no detection needed however it will switch one image's 
>layer above anything else... That can be changed correctly with a 
>bit more scripting...
>
>  
>
I've changed this (hopefully improved it) some more, so here it is back 
to add to your library.

I've made the movement more "natural", and I've added a couple of more 
parameters to support that.

The objects now accelerate from rest up to a "turnover" point, and then 
decelerate to a stop.

on imageSwap pObj1, pObj2, pNumber, pTurnover, pTime

pNumber : number of steps to make the move
pTurnover : number of steps of acceleration (remainder are deceleration)
pTime : number of msec between each step (assuming hw can keep up)

for my jigsaw puzzle game, I'll set the turnover at around 3/4 of the 
total - so the pieces speed up and then screech into place just in time :-)

(note it puts the moving objects on the top layers - up to you whether 
to do that or swap their layers).

>on mouseUp
>  imageswap the long name of img 1, the long name of img 2,fld 1
>end mouseUp
>
>  
>

on imageSwap pObj1, pObj2, pNumber, pTurnover, pTime
    local r1, r2
    local dtlx, dtly, dbrx, dbry
    local tDecc, tRemain
    local tLast
    
    if paramCount() < 3 or pNumber is not a number or pNumber < 3  then
        put 20 into pNumber
    end if
   
    if paramCount() < 4 or pTurnover is not a number or pTurnover > 
pNumber  then
        put pNumber / 2 into pTurnover
    end if
   
    if paramCount() < 5 or pTime is not a number  then
        put 72 into pTime
    end if
   
    set the layer of pObj1 to the number of layers on this card + 1
    set the layer of pObj2 to the number of layers on this card + 1
    
    put the rect of pObj1 into r1
    put the rect of pObj2 into r2
    
    -- Accelerate from rest until pTurnover, then decelerate to stop at 
pNumber
   
   
    -- assume acc = 1, so decc can be calculated
    --   v-turn = acc * turnover =  decc * remaining time
    put (pNumber - pTurnover) into tRemain
    put pTurnover / tRemain into tDecc
   
    -- now calculate distance
    put 0.5  * pTurnover^2 + pTurnover * tRemain  - 0.5 * tDecc * 
tRemain^2 into tDelta
      
    put (item 1 of r2 - item 1 of r1)/tDelta into dtlx
    put (item 2 of r2 - item 2 of r1)/tDelta into dtly
    put (item 3 of r2 - item 3 of r1)/tDelta into dbrx
    put (item 4 of r2 - item 4 of r1)/tDelta into dbry
    
    put 0 into N
    put the millisecs into tLast
    repeat with i = 1 to pNumber
        if i <= pTurnover then
            put 0.5 *  i^2   into N
        else
            put 0.5 *  pTurnover^2 + pTurnover*(i-pTurnover) - ( 0.5 * 
tDecc * (pTurnover-i)^2 )  into N
        end if
        set the rect of pObj1 to trunc(item 1 of r1 + N*dtlx), 
trunc(item 2 of r1 + N*dtly), trunc(item 3 of r1 + N*dbrx), trunc(item 4 
of r1 + N*dbry)
        set the rect of pObj2 to trunc(item 1 of r2 - N*dtlx), 
trunc(item 2 of r2 - N*dtly), trunc(item 3 of r2 - N*dbrx), trunc(item 4 
of r2 - N*dbry)
        if the millisecs < tLast + pTime then
            wait (tLast + pTime - the millisecs) milliseconds with messages
            put the millisecs into tLast
        end if
    end repeat
    
end imageSwap

-- 
Alex Tweedly       http://www.tweedly.net



-- 
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.361 / Virus Database: 267.12.5/148 - Release Date: 25/10/2005




More information about the use-livecode mailing list