2016-03-29 21 views
2

Bu yüzden JavaFX'i kullanarak ekran boyunca zıplayan bir topu hareket ettirmek için bir programım vardı, Şimdi Zaman Çizelgesi Animasyonum'unda Duration.millis() altında belirli değerleri yeniden biçimlendirmeyi denedim ve altta top daha hızlı ilerledim ama burada birisi benim topun hareketi için benim kod benim programa eklemek dinamik hız konusunda sormalısınız yerine gitmek için en iyi yol olmadığını bana söyledi:Zıplayan topun nasıl daha hızlı hareket etmesini sağlarım? dinamik hız?

public class BallPane extends Pane { 

public final double radius = 5; 
public double x = radius, y = radius; 
public double dx = 1, dy = 1; 
public Circle circle = new Circle(x, y, radius); 
public Timeline animation; 

public BallPane(){  
circle.setFill(Color.BLACK); // Set ball color 
getChildren().add(circle); // Place ball into Pane 

// Create animation for moving the Ball 
animation = new Timeline(
    new KeyFrame(Duration.millis(10), e -> moveBall())); 
animation.setCycleCount(Timeline.INDEFINITE); 
animation.play(); 
} 

public void moveBall() { 
// Check Boundaries 
if (x < radius || x > getWidth() - radius) { 
    dx *= -1; //change Ball direction 
} 
if (y < radius || y > getHeight() - radius) { 
    dy *= -1; //change Ball direction 
} 
x += dx; 
y += dy; 
circle.setCenterX(x); 
circle.setCenterY(y); 
} } 

Buna karşılık, bir pong oyunu olacak Bu yüzden 5 seviyeye sahip olacağım ve her seviyede, topun daha hızlı hareket etmesini istiyorum bunu Duration.millis() 'i düşürerek yapabilirim ama bunun hız eklemenin en iyi yolu olmadığını söyledim. Zaman çizgisi animasyon parametrelerimde Duration.millis'imi düşürmeden bunu yapmaya devam edersiniz? Eklemem gereken başka bir parametre veya başka bir hız yöntemi var mı?

+2

yapmak Euler integration kontrol etmek isteyebilirsiniz. – Oisin

cevap

2

Başka bir yaklaşım önermek istiyorum: Bir AnimationTimer, Vector calculation ve Forces kullanın.

topları/sprite özelliklere sahiptir:

PVector location; 
PVector velocity; 
PVector acceleration; 

hareket konumuna hız ve hız için ivme, hızlanma için güç uygulanarak yapılır:

public void applyForce(PVector force) { 

    // Making a copy of the PVector before using it! 
    PVector f = PVector.div(force, mass); 
    acceleration.add(f); 
} 

public void move() { 

    // set velocity depending on acceleration 
    velocity.add(acceleration); 

    // limit velocity to max speed 
    velocity.limit(maxSpeed); 

    // change location depending on velocity 
    location.add(velocity); 

    // clear acceleration 
    acceleration.mult(0); 
} 

Ve bu oyunda yapılır Her sprite için döngü:

gameLoop = new AnimationTimer() { 

    @Override 
    public void handle(long now) { 

     // physics: apply forces 
     allSprites.forEach(s -> s.applyForce(Settings.FORCE_GRAVITY)); 
     allSprites.forEach(s -> s.applyForce(Settings.FORCE_WIND)); 

     // move 
     allSprites.forEach(Sprite::move); 

     // check boundaries 
     allSprites.forEach(Sprite::checkBounds); 

     // update in fx scene 
     allSprites.forEach(Sprite::display); 

    } 
}; 

Tam bir örnek bulabilirsiniz o n bu gist. Toplar yerçekimine bağlı olarak zeminde zıplarlar. Rüzgar soldan sağa doğru üfler, böylece toplar oraya hareket eder. Ancak bunu, ayarlar özelliklerinde kolayca değiştirebilirsiniz.

Endişelenme, fazla kod değil, sadece genel amaç Vektör hesaplama sınıfı uzun. Ama sadece birkaç yöntemini bilmek zorundasın.

Örnek, rüzgar ve yer çekimi kuvvetlerini kullanır. Neyi başarmak istiyorsan, onun gücünü uygula. Elbette sorunuz için, bir kuvvet uygulamadan sürati artırabilirsiniz. Her şey senin etrafında oyuncak yapmak istediğine bağlı.

Ekran: nedeniyle sürtünme topları tür sekmeleri değiştirebilir nasıl

enter image description here

Örnek chapter 2.7 içindedir. İşte Daniel Shiffman kitabında kullandığı işleme şifre, ama bunu JavaFX çevirmek çok kolaydır bkz:

for (int i = 0; i < movers.length; i++) { 

    float c = 0.01; 
    PVector friction = movers[i].velocity.get(); 
    friction.mult(-1); 
    friction.normalize(); 
    friction.mult(c); 

    movers[i].applyForce(friction); 
    movers[i].applyForce(wind); 
    movers[i].applyForce(gravity); 

    movers[i].update(); 
    movers[i].display(); 
    movers[i].checkEdges(); 
    } 

sana JavaFX uygulanmasını bırakın.

Ayrıca ilginizi çekebilir a video about how chapter 2.10 (herşeyi çekiyor) gibi görünüyor. Böyle bir şeye ulaşmak istiyorsanız, kod yazmak gerçekten çok fazla değil. Bu code is also available. Bununla daha rahat olursanız Point2D sınıfını kullanır. Bununla birlikte, Point2D'yi kullanmamalısınız çünkü onunla sınırlamalar vardır ve her zaman özel bir Vector sınıf uygulaması tarafından önlenebilecek yeni Point2D nesneleri oluşturmalısınız.

0

ben merkezli bu fizik yapacağını: Eğer böyle dinamikleri yaptığınızda size hız almak ve ivmeler dışına koordinatları olmalıdır.

Her program kene (örneğin, hava, bir ile esneme katsayısı veya sürtünme topu, yerçekimi sabiti, çeşitli katsayıları kütlesini kullanarak) bu varlık vektörlerin her yeni bir ivme hesaplar.

Sonra temelde bu vektörleri entegre olacaktır: ivme -> hız -> koordine eder. Bundan sonra

tek ihtiyacınız, topun/hızlı yavaş hareket yapmak daha yüksek ya da değil, ve bu tür sıçrama, sadece o vektör üzerinde, senin ivme çimdik olduğunu yapılıyor.

Sen hız kat `dx` ve` dy` çarpma olabilir işini

Vector position, velocity, acceleration; 

public void eulerIntegration(double dt){ 
    //TODO create the calculate acceleration method using your ball model 
    acceleration = calculateAcceleration(); 
    velocity = acceleration * dt; 
    position = velocity * dt; 
} 
İlgili konular