14. januar 2003 - 16:41
Der er
4 kommentarer
Hvordan får man en sprite tll at bevæge sig i en bue?
Jeg er ved at lave et spil, hvor man skal kunne kaste en hammer i en bue, hvorefter den vende tilbage samme sted. (Godt gættet, det er Thor hammer)
Jeg har tænkt mig at bruge: Sprite().LocH og sprite().LocV
Jeg mangler bare en formel for en bue til at beregne X og Y værdierne.
14. januar 2003 - 19:09
#2
Det er en ok link, men den laver en cirkel omkring et centrum. Jeg kan også godt lave ovale cirkler, men stadig omkring et centrum som ikke er udgangspunktet.
Jeg har brug for formel, hvor jeg kan kaste hammeren ud, samtidig med den scalere ned, og vender tilbage, samtidig med den scalere op, til sit udgangspunkt. Ligesom en boomerang.
14. januar 2003 - 19:41
#3
X er vel ikke noget problem
Y beregner du således,
x/2 er halvejs og her skal y være højest.
Du gange med en tilvækst for at få en potentiel vækst og dividere når det er kommet over halvejen.
måske kan du bruge noget af dette:
Here is the code I am using (based on Colin and Danny's suggestions
about separating the speed component from the angle)
property spriteNum, pSpeed, pVector, pOldLoc, pAngle, pRadius, pCentre
property pCollisionLastFrame
on beginsprite me
-- sprite(1) is graphic of constraint circle
pRadius = sprite(1).width / 2 - sprite(spriteNum).width / 2
pCentre = sprite(1).loc
pOldLoc = sprite(spriteNum).loc
pAngle = random(360)
pSpeed = 8 -- pixels /frame
pCollisionLastFrame = 0
end
on prepareframe me
if pCollisionLastFrame = true then
-- give it one frame at this heading to get back inside circle
pCollisionLastFrame = false
exit
end if
newloc = GetNewLoc(me)
newloc = CheckForCollision(me, newloc)
sprite(spriteNum).loc = newloc
pOldLoc = newloc
end
on GetNewLoc me
-- calculate next loc based on angle, and distance travelled(pSpeed)
-- hypoteneuse = pSpeed
-- horiz side length = x, vertical side = y
-- newloc = point(x,y)
x = pSpeed * cos(degtorad(me, pAngle))
y = -pSpeed * sin(degtorad(me, pAngle))
pVector = point(x,y)
newloc = pOldLoc + pVector
return newloc
end
on CheckForCollision me, newloc
-- use pythagoras to check distance from centre
x = newloc[1] - pCentre[1]
y = newloc[2] - pCentre[2]
xx = x * x
yy = y * y
rr = pRadius*pRadius
tot = xx + yy
if tot >= rr - (pSpeed * 2) then
-- pSpeed * 2 for safety factor
newloc = Bounce(me, newloc)
end if
return newloc
end
on Bounce me, newloc
-- "if the point it hits the circle is at angle a clockwise, and the
-- object is currently travelling at an angle b clockwise, then after
the
-- collision it'll be travelling at an angle of 180- 2a + b (in
degrees.)"
x = newloc[1] - pCentre[1]
y = newloc[2] - pCentre[2]
hitAngle = atan(y/x)
hitAngle = radToDeg(hitAngle)
-- had to mess with this a bit... ended up with 180 - a + 2b
pAngle = (180 - hitangle + (2*pAngle)) mod 360
newloc = GetNewLoc(me)
-- tried this but get stuck in infinite recursiuon...
-- CheckForCollision(me, newloc)
pCollisionLastFrame = true
return newloc
end
on radToDeg me, radAngle
return radAngle*180.0/pi()
end
on degToRad me, degAngle
return degAngle*pi()/180.0
end