2016-03-25 48 views
0

LibGDX içinde çok basit bir çarpışmanın uygulanmasında zorluk yaşıyorum. "Player" için güncelleme kodu olarak böyledir: YanilibGDX - Garip Çarpışma Davranışı

private void updatePosition(float _dt) 
{ 
    Vector2 _oldPos = _pos; 

    _pos.add(_mov.scl(_dt*50)); 
    _bounds.setPosition(_pos.x-8, _pos.y-12); 

    if(_game.getMap().checkCollision(_bounds)) 
    { 
     System.out.println("Collision Detected"); 
     _pos = _oldPos; 
     _bounds.setPosition(_pos.x-8, _pos.y-12); 
    } 
} 

, başlangıçta herhangi bir hareketi uygulamadan önce pozisyon vektörü _pos değerleri olarak depolanır _oldPos.

Hareket ardından pozisyon vektörü, oyuncunun sınırlayıcı dörtgen _bounds sonra bu yeni konumuna güncellenir için (delta-time * 50 ile çarpılır) hareketi vektörü _mov eklenerek gerçekleştirilir.

Bundan sonra oyuncunun yeni sınırlayıcı Dikdörtgeni, oyunun "haritasındaki" her kiremitin karşısındaki kavşaklar için kontrol edilir, eğer bir kavşak algılanırsa, oyuncu bu yönde hareket edemez, böylece konumları önceki pozisyona ayarlanır _oldPos ve sınırlayıcı dikdörtgenin konumu da bir önceki konuma ayarlanır.

Maalesef bu işe yaramazsa, oyuncu bu resimde görüldüğü gibi, düz fayans yoluyla hareket edebildiğini: image

Yani burada neler olduğunu? Bu kodun algılanan çarpışmayı çözmesi gerektiğini düşünerek düzeliyorum mu? Garip nedir

olduğunu oyuncusu hala katı bloklar arasında gezinti yapabilir

_pos.sub(_mov.scl(_dt*50)); 

verimler çok farklı sonuçlar, (tam tersinedir yapılan Aynı hareketi yapma) ile

_pos = _oldPos; 

değiştirilmesi ama dirençle karşılaşır.

_oldPos == _pos.sub(_mov.scl(_dt*50)); 

cevap

1

Çarpışma tespiti için daha iyi bir çözüm, bir Vector2 hızına sahip olmak ve her bir çerçeve, hızı konuma eklemek olacaktır. Yukarı ok tuşuna basılırsa sınanacak bir yönteme sahip olabilirsiniz, 1 hızını (veya istediğiniz hızda) ekleyin. Ve eğer basılırsa, 1'i (ya da herhangi bir hız) çıkartın. Daha sonra oyuncuya 4, oyuncu, alt, sol ve sağ üstündeki 4 adet çarpışma dikdörtgeni olabilir. Sen eğer (velocity.y < 0) yerine if (velocity.y> 0) test etmek için emin olun if(top collides with bounds){ if(velocity.y > 0){ set velocity.y = 0. } }

demek Ve alt için ... aşağı, sola ve sağa (örn için aynısını yapabilirsiniz. ..

DÜZENLEME: yeni Vector2 başlatmasını olmadan oldPos = pos ayarlamak çünkü Kodun çalışmıyor Eğer pos üzerine eklediğinizde demektir, aynı zamanda oldPos Yani oldPos = new Vector2 (pos) demek değiştirir;

+0

Sorun buydu! Teşekkürler. Bir diğerine eşit riable, gerçek zamanlı "izler"? –

+0

@W.H Evet, yeni bir nesneyi kullanmadan bir nesneyi eşit olarak ayarladığınızda, onu eşitlediğiniz nesne ile aynı belleğe işaret eder. Bu, her iki nesnenin de aynı verilere işaret ettiği anlamına gelir. – Wyatt

0

deneyin taşınmadan önce gelecekteki konumunu test etmek için: Aşağıdaki ifade doğru olması gerektiği gibi

Bu, çok kafa karıştırıcı. Çarpışırsa, hareket etme.

+0

Tam olarak aynı sonuç ne yazık ki: [image] (http://puu.sh/nTO2Z/70a13ec93e.png) –