2011-05-11 7 views
5

İlk not: matematiksel olarak, hiç de yetenekli değilim.AS3'te bir parabol formülü, her zaman belirli bir noktayı kesecek bir ok atmak için nasıl kullanılır

iPhone'u bir noktaya bastığınız bir yere geri döndüm ve kalenizin her zaman bastığınız noktayı kesişen bir ok fırlatır. Benzer bir oyun yapmak istedim, bunun kolay bir çabuk olacağını düşünüyorum; sonra bunun için matematikin aslında beceri düzeyimin ötesinde olduğunu fark ettim.

Parabol formülünü veya ok için ok tıklandığında gereken hızı ve açıyı her zaman tıklatılan noktayı kesiştirmek için kullanacaklarını varsayıyorum.

Sadece parabollerin okuldan nasıl çalıştığını ve hiçbir formül üzerinde çalışma şansı olmadığını hatırlıyorum.

Uygulanması daha kolay olabilecek herhangi bir matematiksel yardım veya fikir harika olacaktır.

ben şöyle kalemde bir fonksiyonu ile bitirmek istiyorum:

package 
{ 
    import avian.framework.objects.AvElement; 

    public class Castle extends AvElement 
    { 
     /** 
     * Fires an arrow from this 
     * @param ix The x intersection point 
     * @param iy The y intersection point 
     */ 
     public function fire(ix:Number, iy:Number):void 
     { 
      var ar:Arrow = new Arrow(); 

      ar.x = x; 
      ar.y = y; 

      // define angle and velocity based on ix, iy 
      // ar.fireAngle = ?? 
      // ar.fireVelocity = ?? 

      parent.addChild(ar); 
     } 
    } 
} 

Güncelleme sorulara göre yorumlarında:

olacak hiçbir kuvvet rüzgar gibi ok uygulanan , sürtünme, vb. Ayrıca, okun başlangıç ​​noktası oyun boyunca sabitlenir (kale). Burada

biraz daha açık olması için bir örnek görüntü: Arrow path

mümkün olduğu kadar net olmak gerekirse: (: 40, 120 diyelim)

  1. Ok her zaman sabit bir noktadan yolculuğuna başlar.
  2. Ok, her zaman belirli bir koordinatı yakalamalıdır.
  3. Mümkün olduğu kadar gerçekçi bir yol, başarmak istediğim bir şeydir (açıkçası, herhangi bir noktayı kesiştirmek için sadece bir ok ateşleyebilirim, ancak hedefi, okun ilk yükselişine, sonra inmeye, istenen yolculuğunun en gerçekçi noktasında koordine etmek).

Not: orada olmak sonsuz olası parabolas sorunu önlemek için - sadece ok at bırakabilir açısını tanımlayan bakmak - sabitlenebilir okun hızını.

+1

Sadece hızlı bir not: Ayrıca bir başlangıç ​​noktasına (hedefin yanı sıra) da ihtiyacınız olacak. – Cameron

+0

Böylece okun bitmesini istediğiniz yere tıklıyorsunuz? Köken koordinatlarına da ihtiyacınız olacak. Biri sabit olmadıkça, açı ve hız, eşleştirilmiş bir değerler aralığı olacaktır. Açıktır ki, hız en uygun açıdaki mesafeyi elde etmek için en azından minimum olmalıdır. Ancak açı çok ise, o zaman hız da olabilir. Hava direnci yok, rüzgar yok mu? Dünya standart yerçekimi? – Orbling

+1

Bu [grafik ve altındaki denklemler] (http://www.physics.brocku.ca/~aknigavk/1P21/Kinematics/projectile-motion-1.jpg) yararlıdır. – Orbling

cevap

8

bir çekim alanı ile bir merminin uçuş yolu I kullanır denklemler

1. v = u + at 
2. s = ut + (at^2)/2 

olan equations of motion

uygulanarak tanımlanabilir burada

s = başlangıç ​​arasındaki mesafe ve son konumlar
u = başlangıç ​​hızı
v = son hız
bir = sabit hızlanma
t =

Tamam son durum başlangıç ​​durumuna geçmek için geçen zaman. Bu oku hareketlendirmek için, önceki hızına, konumuna ve hızlanmasına bağlı olarak yeni hızını ve konumunu düzenli aralıklarla (her çerçeve) hesaplayacağız. Bu durumda hızlanma tamamen yer çekiminden kaynaklanmaktadır.

Saniye cinsinden değil, çerçevelerdeki zaman aralıklarını basitleştirir ve ölçer. Bu t bize, x yönünde Şimdi

1. v = u + a*1   => v = u + a 
2. s = u*1 + (a*1^2)/2 => s = u + a/2 

olarak a = 0 ( dikkate biz almıyorsun sürükle) hızlanma onları yeniden yazmak için izin yukarıdaki denklemler için 1 = vermesidir. Y yönünde a = g, yer çekimine bağlı hızlanma. Her eksen için çözülmesi için biz bu denklemler rewite Eğer biz x için

olsun:

1. vx = ux + 0  => vx = ux (no change so we'll ignore this) 
2. sx = ux + 0/2  => sx = ux (convenient eh?) 

y:

1. vy = uy + g 
2. sy = uy + g/2 

Yani bir örnek komut dosyası

public class Arrow extends Sprite 
{ 
    //g is constant 
    //it's actually closer to 10 but this is our world 
    public static const g:Number = 2; 

    //our arrow 
    private var arrow:Shape; 

    //start velocities 
    private var ux:Number; 
    private var uy:Number; 

    public function Arrow() 
    { 
     arrow = new Shape(); 
     arrow.graphics.lineStyle(1, 0); 
     arrow.graphics.lineTo(30, 0); 
    } 

    public function fire(vx:Number, vy:Number):void 
    { 
     ux = vx; 
     uy = vy; 
     addChild(arrow); 
     addEventListener(Event.ENTER_FRAME, fly); 
    } 

    private function fly(e:Event):void 
    { 
     //lets use our equations 
     var sx:Number = ux;  //distance moved in x dir 

     var vy:Number = uy + g //new velocity in y dir 
     var sy:Number = uy + g/2 //distance moved in y dir 

     //apply to arrow 
     arrow.x += sx; 
     arrow.y += sy; 

     //save new y velocity 
     uy = vy; 

     //extra bonus rotation of arrow to point in the right direction 
     arrow.rotation = Math.atan2(uy, ux) * 180/Math.PI; 

    } 

} 
içine takmanıza olanak
+0

Gerçekten ikna edici bir arkadaş görünüyor, bir an olsun diye denemek zorundayım. Her iki efor için +1 :) – Marty

+0

@Marty Wallace Sorun değil, yazmaktan keyif aldım, umarım yardımcı olur – meouw

0

Temelde matematik içermez:

import flash.display.Shape; 
import flash.events.Event; 

public class Arrow extends Shape 
{ 
    private var xVelocity:Number; 
    private var yVelocity:Number; 

    public function Arrow(fireAngle:Number, fireVelocity:Number) 
    { 
     xVelocity = Math.cos(fireAngle) * fireVelocity; 
     yVelocity = Math.sin(fireAngle) * fireVelocity; 

     graphics.beginFill(0); 
     graphics.drawCircle(0, 0, 5); 
     graphics.endFill(); 

     addEventListener(Event.ENTER_FRAME, enterFrameHandler); 
    } 
    private function enterFrameHandler(ev:Event):void 
    { 
     x += xVelocity; 
     y += yVelocity; 
     yVelocity += 1; 
    } 
} 
+0

Çalıştırmak ve görmek zor mu? –

+0

Üzgünüz, bu benim istediğim şeyin etkisini verecek, ancak amaç okun bir noktaya kesişmesidir. Ok manevrasının gerçekçi olması endişe verici değildir. – Marty

İlgili konular