Avatar billede treypocca Nybegynder
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.
Avatar billede jmc Nybegynder
14. januar 2003 - 18:39 #1
Avatar billede treypocca Nybegynder
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.
Avatar billede jmc Nybegynder
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
Avatar billede treypocca Nybegynder
15. januar 2003 - 13:44 #4
Nu er jeg ikke lige nogen haj til det her lingo. ER det ikke muligt med et mere simplet forslag?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester