Modelul bazat pe eveniment oferă o interfață universală pentru a descrie schimbarea stării scenei 3D. Ea simplifică procesarea evenimentelor fizice și a acțiunilor utilizatorilor.
Unitatea de bază a modelului bazat pe eveniment este senzorul. Un senzor este o entitate de programare și poate fi activă (1, unu) sau inactivă (0, zero). Unii senzori pot purta o sarcină utilă care poate fi recepționată în funcția de apel invers al colectorului cu ajutorul API-ului corespunzător. De exemplu, senzorul de radiație (Ray Sensor) oferă lungimea relativă a razei de intersecție.
Utilizatorii nu pot controla direct senzorii prin API extern. În schimb, toți senzorii trebuie să fie prezenți într-una sau mai multe colecții - așa numitele colectori de senzori (sensor manifolds). Un colector este un container logic asociat unui obiect din scenă. Acesta generează un răspuns la un set de evenimente definite de senzori prin executarea unei funcții de apel invers. Pentru a defini colectorul trebuie să aveți următoarele informații (a se vedea și documentația API pentru descrierea funcției controls.create_sensor_manifold):
Puteți citi mai multe despre motorul API în documentația despre modulul controls.
Să luăm în considerare sarcina de a emite un sunet la impactul unei pietre aruncate. La impactul cu medii diferite, ar trebui să fie produs sunete distincte (de exemplu, teren și perete). În scena Blender avem rețele (mesh) de coliziune cu materiale fizice, ID-urile materialelor fiind "TERRAIN" și "WALL". Avem și un obiect fizic aruncat în scenă, numit "Stone".
Să definim un senzor de coliziune pentru fiecare mediu, după tipul de sunet produs.
// import the modulesvar m_scenes = b4w.require("scenes");var m_controls = b4w.require("controls");// get the object being thrownvar stone = m_scenes.get_object_by_name("Stone");// create the sensorsvar sensor_impact_terrain = m_controls.create_collision_sensor(stone, "TERRAIN");var sensor_impact_wall = m_controls.create_collision_sensor(stone, "WALL");Adăugați senzorii într-o matrice (array). Utilizați logica OR în funcția logică. Plasați codul de procesare al sunetului în funcția de apel invers (callback). Creați galeria de senzori cu ID-ul "IMPACT" și tipul CT_SHOT.
// array of the sensorsvar impact_sens_array = [sensor_impact_terrain, sensor_impact_wall];// manifold logic functionvar impact_sens_logic = function(s) {return (s[0] || s[1])};// callbackvar impact_cb = function(obj, manifold_id, pulse) {// NOTE: it's possible to play both sounds simultaneouslyif (m_controls.get_sensor_value(obj, manifold_id, 0) == 1) {// ...console.log("play the terrain impact sound");}if (m_controls.get_sensor_value(obj, manifold_id, 1) == 1) {// ...console.log("play the wall impact sound");}}// create the manifoldm_controls.create_sensor_manifold(stone, "IMPACT", m_controls.CT_SHOT,impact_sens_array, impact_sens_logic, impact_cb);Atunci când obiectul "Stone" se ciocnește cu orice material fizic al "TERRAIN" sau "WALL", se execută funcția de apel invers. În cadrul acestei funcții obținem valorile ambilor senzori prin indicii lor în matricea senzorilor (0 - "TERRAIN", 1 - "WALL"). Valoarea senzorului = 1 (activă) înseamnă că coliziunea a avut loc cu materialul fizic corespunzător. Ca urmare, se produce sunetul corespunzător (codul nu este afișat).