Jump Sprite - Move a sprite along a parabolic arc so it
Added on 7/30/2002
Compatibilities:
This item has not yet been rated
Have a sprite appear to "jump" along a parabolic arc. The arc direction can be concave or convex, and the beginning and end points of the arc can be adjusted. Useful for various game applications.
-- Make a sprite "jump" by moving it along a parabolic arc.
-- Behavior by Ken Loge - kenl@ori.org
-- 06-01-02
-- Based on an algorithm by Dan Livingston - dan@wire-man.com
-- A variation of the standard parabola formula of y = x^2
-- Reworked to be more versatile, the formula is:
-- y = h - (2 * sqrt(h) x/d - sqrt(h))^2
-- h = the height of the jump
-- d = distance of the jump
property pJumpLeft -- if true the sprite jumps to the left
property pJumpRight -- if true the sprite jumps to the right
property pJumpDirection -- stores the direction of each jump
property pConvexArc -- sets the parabola type to convex
property pConcaveArc -- sets the parabola type to concave
property pArcDirection -- if 1, the arc is upward, if -1, the arc is downward
property pSqrootHeight -- stores the square root of the height of the parabola
property pWidthFactor
property pXCounter -- keeps track of jump iteration values
property pXHop
property pXIncrement -- the "speed" of horizontal movement during a jump. Too big a number will "overshoot" the span.
property pYInitial -- the original Y position of the sprite
property pYFactor1 -- used to determine the sprite Y position during a jump
property pYFactor2
property pYFactorFinal
property pHeight -- the height of the curve
property pDistance -- the horizontal span of the curve. The smaller this number, the faster the sprite will move.
property pJump -- used to trigger jump movement
on getBehaviorDescription me
return "Moves a sprite on a parabolic curve so it appears to jump in an arc."
end
on beginSprite me
pSqrootHeight = sqrt(pHeight)
pWidthFactor = (2.0 * pSqrootHeight) / pDistance
pYInitial = sprite(me.spriteNum).locV
pXCounter = 0
-- jumps will move to the right
if pJumpLeft = TRUE then pJumpDirection = -1
-- jumps will move to the left
if pJumpRight = TRUE then pJumpDirection = 1
-- set jumps to to the right if user checks both directions
if pJumpLeft AND pJumpRight = TRUE then pJumpDirection = 1
-- parabolic arc will be convex
if pConvexArc = TRUE then pArcDirection = 1
-- parabolic arc will be concave
if pConcaveArc = TRUE then pArcDirection = -1
-- set to convex arc if user checks both
if pConvexArc AND pConcaveArc = TRUE then pArcDirection = 1
end
on getPropertyDescriptionList me
list = [:]
addProp list, #pHeight, [#comment: "Height of jump:", #format: #integer, #default: 100, #range: [#min: 0, #max: 500]]
addProp list, #pDistance, [#comment: "Span of jump:", #format: #integer, #default: 150, #range: [#min: 0, #max: 600]]
addProp list, #pXIncrement, [#comment: "X offset per iteration:", #format: #integer, #default: 5, #range: [#min: 0, #max: 50]]
addProp list, #pJumpRight, [#comment: "Jump to the right:", #format: #boolean, #default: TRUE]
addProp list, #pJumpLeft, [#comment: "Jump to the left:", #format: #boolean, #default: FALSE]
addProp list, #pConvexArc, [#comment: "Convex arc:", #format: #boolean, #default: TRUE]
addProp list, #pConcaveArc, [#comment: "Concave arc:", #format: #boolean, #default: FALSE]
return list
end
on exitFrame me
if (pXCounter <= pDistance) AND pJump = TRUE then
-- set jumping height
pYFactor1 = (pWidthFactor * pXCounter) - pSqrootHeight
pYFactor2 = power(pYFactor1, 2)
pYFactorFinal = (pHeight - pYFactor2) * pArcDirection
-- pJumpDirection determines the direction of the jump
pXHop = pJumpDirection * pXIncrement
-- prepare for next iteration
pXCounter = pXCounter + 5
else
-- move sprite back to original Y position to correct for iteration offset
--sprite(me.spriteNum).locV = pYInitial
-- reset so user can click the sprite again
pJump = FALSE
pXCounter = 0
end if
end
-- as written, each time the mouse is clicked the ball "jumps"
on mouseUp me
-- toggle jump state
if pJump = FALSE then
pJump = TRUE
else
pJump = FALSE
end if
end
Contact
MMI
36 South Court Sq
Suite 300
Newnan, GA 30263
USA