2016-06-03 4 views
0

Ich möchte ein Ereignis-Listener nicht nur um eine Kollision zu erkennen, aber wenn ein Sprite-Begrenzungskasten vollständig in Seite zu erkennen Box ein anderes Sprite Begrenzungs ist, habe ich verwendetWie erstelle ich Ereignis-Listener, um zu erkennen, ob eine Sprite-Begrenzungsbox vollständig in einer anderen Sprite-Begrenzungsbox in cocos2dx enthalten ist?

bool GameScene::onContactBegin(cocos2d::PhysicsContact &contact) 

falsche Rückkehr, weil ich nicht will jede Art von Kollisionsphysik wurde aber erst beim ersten Kontakt ausgelöst.

Ich möchte Physik verwenden, weil seine schnelle und präzise für meine Zwecke. irgendwelche Ideen ??

Antwort

0

Eine Möglichkeit, dies zu erreichen, ist durch Ihre kollidierende Sprites in einem Vektor zu speichern:

std::vector<std::pair<coco2d::Sprite*, cocos2d::Sprite*>> collisionVector; 

Sie können die zwei kollidierende Sprite-Objekte aus dem Kontakt auf diese Weise erhalten:

auto spriteA = dynamic_cast<Sprite*>(contact.getShapeA()->getBody()->getNode()); 
auto spriteB = dynamic_cast<Sprite*>(contact.getShapeB()->getBody()->getNode()); 

speichert sie in Kollision Vektor, wenn kein Sprite null ist. Tun Sie dies jedes Mal, wenn Sie einen Physikkontakt bekommen. Jetzt können Sie dies in Ihrer update() - Funktion verwenden, um nach einer Kollision zu suchen. Wenn eine Kollision vorliegt, können Sie ein benutzerdefiniertes Ereignis auslösen. Sie können auch die Aktualisierungsfunktion verwenden, um die Liste zu bereinigen, wenn die Kollision vorüber ist oder Sie ein Sprite gelöscht haben.

Um auf Kollision zu prüfen, müssen Sie die Bounding Box jedes Sprites abrufen und vergleichen. Sie können Begrenzungsrahmen erhalten wie folgt:

cocos2d::Rect boundingBox = sprite->getBoundingBox(); 

Jetzt können Sie beiden boundingBoxes gegeneinander überprüfen verwenden, um zu sehen, ob die Prüfung vier Ecken des Kastens in der anderen Box sind. Sie können hierzu die Funktion containsPoint() von Rect verwenden.

Schließlich, wenn Sie die boundingBoxs sind innerhalb einer der anderen gefunden, feuern ein eigenes Kollisionsereignis:

void onCollisionInside(Sprite* spriteA, Sprite* spriteB) 
{ 
    //do something 
} 
Verwandte Themen