Cocos2d-x 3 - Nonaktifkan tabrakan antara dua benda dan deteksi ketika keduanya terpisah satu sama lain

Saya sedang mengembangkan game cocos2d-x (versi 3.8). Game saya menggunakan fisika chipmunk dan memiliki badan statis yang berfungsi seperti interupsi. Interuptor ini diaktifkan ketika ada benda lain yang melewatinya. Interuptor dinonaktifkan ketika benda-benda terpisah satu sama lain.

Aku ingin:

  • Tubuh yang bergerak tidak bertabrakan dengan interupsi. Itu harus melintasi interupsi tanpa memantul
  • Saya ingin mendeteksi kapan benda bergerak memisahkan pengganggu

Pendekatan pertama saya adalah menerapkan metode onContactBegin. Saya mengembalikan false ketika kedua tubuh itu berhubungan. Dengan cara ini tubuh melewati interupsi dan tidak terpental.

Masalahnya adalah metode onContactSeparate tidak dipanggil, karena kontak tidak terjadi.

Jika saya mengembalikan nilai true dalam metode onContactBegin, onContactSeparate dipanggil dan saya dapat mendeteksinya. Masalahnya adalah bodinya tidak melewati interuptor, melainkan terpental.

[EDIT] Info lebih lanjut

Ini adalah skenario dimana dua sprite dipisahkan. Bola dapat bergerak dan interupsinya adalah benda statis. Bola bisa saja melewati interuptor.

Interupsi dinonaktifkan

Ini adalah skenario di mana dua sprite bersentuhan dan objek1 (bola) berada di atas interuptor. Saya ingin mendeteksi di mana dua sprite terpisah satu sama lain.

Interupsi diaktifkan

Bantuan apa pun akan dihargai!


person Daniel Albert    schedule 29.09.2015    source sumber


Jawaban (1)


Bagi saya sepertinya Anda menggunakan Box2D dalam cocos, jadi saya akan menjawabnya sebagai asumsi dasar saya.

Inilah yang akan saya lakukan.

  1. Interupsi saya adalah b2Body* tanpa dimensi BodyDef yang ditentukan atau hanya def dimensi 0x0.
  2. Saya akan mengatur data pengguna untuk bodyDef ke persegi panjang yang menggambarkan area interupsi saya. Dengan cara ini Anda selalu dapat mewakili area interupsi Anda, tetapi tidak akan bertabrakan dengan apa pun.
  3. (Opsional) Jika Anda ingin area interupsi berpindah berdasarkan badan palsu yang Anda tetapkan padanya, Anda dapat memperbaruinya tepat setelah fungsi langkah menggunakan sesuatu seperti di bawah ini.

    world->Step(delta, 10, 10);   
    for (auto physicsBody = _world->GetBodyList(); physicsBody; physicsBody = physicsBody->GetNext())
    { 
     auto userData = static_cast<Node*>(physicsBody->GetUserData());
     if(userData != NULL)
     {
       // Set interruptor area rectangle = physicsBody->GetPosition();
     }
    }
    
  4. Untuk memberi tahu seluruh sistem ketika saya telah meninggalkan interupsi, saya akan menyimpan penunjuk fungsi ke fungsi yang ingin saya panggil ketika ini terjadi. Ketika sebuah objek memasuki area interupsi, saya akan menandainya dengan mengatakan "Saya berada di area tersebut " setelah itu, langkah pembaruan pertama yang Anda dapatkan ketika sudah tidak ada lagi di area tersebut, saya akan mengaktifkan panggilan balik dan mengatur ulang tanda yang saya gunakan untuk mencapai titik itu.

Semoga membantu. Anda tidak memberikan banyak konteks tentang apa yang ingin Anda lakukan, sebuah gambar akan sangat membantu. Terutama ketika mencari bantuan dengan kode yang memiliki representasi visual juga.

[EDIT] Berdasarkan perilaku yang Anda inginkan, inilah cara saya melakukannya. Hal pertama yang perlu diketahui adalah Anda tidak memerlukan tabrakan fisika untuk perilaku yang Anda inginkan. Anda dapat melakukan ini dengan menggunakan tes persimpangan kotak pembatas dan menggunakan flag dan callback untuk mengetahui sisanya.

Saya memiliki objek yang mengetahui tentang bola dan node interupsi saya. Dalam loop pembaruan objek ini saya memeriksa apakah keduanya berpotongan. Saya menetapkan bendera yang menunjukkan "Saya berada di dalam interupsi", frame berikutnya bahwa saya tidak berada dalam interupsi dan bendera saya masih benar. Saya memanggil fungsi yang saya tetapkan dengan "logika keluar" saya di itu, dan atur lalu tandai kembali ke false.

person Filled Stacks    schedule 30.09.2015
comment
Terima kasih, tapi saya menggunakan fisika chipmunk. Saya menambahkan beberapa info lebih lanjut dan beberapa gambar yang menunjukkan cara kerjanya. - person Daniel Albert; 30.09.2015
comment
@DanielAlbert Dari hasil edit Anda menulis bahwa Anda ingin mendeteksi di mana dua sprite terpisah satu sama lain? Apakah ini berarti Anda ingin mengetahui kapan sprite berhenti bertabrakan dan menjauh satu sama lain? atau ingin mengetahui titik potong sprite saat bertabrakan? - person Filled Stacks; 01.10.2015
comment
ya, saya hanya memerlukan panggilan balik untuk mendeteksi saat dua sprite terpisah satu sama lain. Sesuatu seperti panggilan balik onContactSeparate ketika tabrakan terjadi. Saya tidak membutuhkan titik persimpangan. - person Daniel Albert; 01.10.2015
comment
@DanielAlbert oke. Di cocos2d-x Anda mendapatkan sesuatu yang disebut EventListenerPhysicsContact, Anda dapat membuatnya menggunakan fungsi pembuatan statis. pada pendengar ini Anda memiliki 4 fungsi terbuka untuk resolusi kontak. onContactBegin, onContactPreSolve dan onContactSeperate. tetapkan panggilan balik ke onContactSeperate dan tempatkan logika Anda untuk pemisahan di sana. Pastikan onContactBegin Anda mengembalikan false sehingga Anda dapat mengabaikan reaksi tabrakan (jika Anda mau) - person Filled Stacks; 02.10.2015
comment
tetapi jika saya mengembalikan false di onContactBegin, panggilan balik onContactSeparate tidak dipanggil. Ini hanya dipanggil jika onContactBegin mengembalikan nilai true. Jika saya mengembalikan nilai true dalam metode onContactBegin, kedua benda bertabrakan dan bola tidak melewati interupsi. - person Daniel Albert; 02.10.2015
comment
@DanielAlbert silakan lihat jawaban yang diedit di atas. Saya menerapkan perilaku yang Anda inginkan dan saya menjelaskan bagaimana saya melakukannya di edit saya. - person Filled Stacks; 02.10.2015