2016-03-26 35 views
1

OOP'ta bir 2D fizik motoru yazıyorum. Ve uzayda fiziksel nesneler için bir çeşit "onTouchStart" veya "onTouchEnd" olay sistemini nasıl oluşturabilirim diye merak ediyordum.Fizik Motoru için 'AÇIK' Yazma Etkinlikler

Ve evet ben Box2D ve diğerleri olduğunu biliyorum, ama oyunda çok temel çarpışma kontrolü yapacak olan bir şey yapmak istiyorum. Ayrıca bunu yeni bir şey öğrenmenin bir yolu olarak görüyorum.

Neyse, bu kod .... var

void phPhysics::step(float delta) 
{ 
    int objectCount = m_objects.size(); 

    for (int i = 0; i < objectCount; ++i) 
    { 
     phPhysicsObject* obj = m_objects.at(i); 

     /* Update positon of the object. */ 
     obj->update(delta); 

     if(!obj->isSleep()) 
      checkForCollisions(obj); 
    } 
} 

void phPhysics::checkForCollisions(phPhysicsObject* object) 
{ 
    int objectCount = m_objects.size(); 

    for (int i = 0; i < objectCount; ++i) 
    { 
     phPhysicsObject* obj = m_objects.at(i); 

     if(object == obj) 
      continue; 

     if(isColliding(object, obj)) 
      obj->onTouchStart(object); 
    } 
} 

ben onTouchStart olay var, ama tabii bu sürekli "onTouchStart" konulu tetiklemek için gidiyor görebileceğiniz gibi. Buna sadece çarpışmada ve bir kez de temasta 'bir kez' tetikleme yapabilir miyim? Birbirlerine dokunan bir dizi nesne yapmayı düşündüm, ama bunun iyi olup olmadığını bilmiyorum.

+0

Çarpışmalarınızı nasıl çözmeyi planlıyorsunuz? – Zouch

+0

Basit AABB, çok fazla bir şey yok. Bir problem olduğunu görebildiğim tek şey, mermi tespit atmasıdır, ama yine de, giderken öğreniyorum. – ajm113

+0

Çarpışma tespiti hakkında konuşmam, ama koleksiyon çözme. Nesnelerinizi birbirinden nasıl uzaklaştıracaksınız (artık çarpışmaya sahip olmayacaksınız)? Bunu soruyorum çünkü bunu sık sık nesnelerinize impuls uygulayarak yaparsınız (bunu çok kısa bir süre boyunca uygulanan bir kuvvet olarak veya süratli bir değişim olarak görebilirsiniz), ancak bunu yapıyor gibi görünmüyorsunuz. bir tür şeyler (ve bu "onTouchStart" şeyler) ele alabileceğiniz/değiştirecek şekilde değiştirebilir – Zouch

cevap

1

Bence iyi çalışıyor. phPhysicsObject'da bir array nesnesine sahip olabilirsiniz (veya bellekte saklamak için varsa id), sonra her zaman onTouchStart çağrılır, nesnenin içinde olup olmadığını kontrol edebilirsiniz, değilse, yeni bir nesnenin çakışması vardır. . Eğer öyleyse, durursunuz, çünkü işlev zaten bu nesne için çağrılmıştı. Ve sonra onTouchEnd nesneyi diziden kaldırırdı.