More work on scripting

This commit is contained in:
Marianne Gagnon 2015-04-30 20:36:54 -04:00
parent 1559d03ea1
commit d98c1044e6
4 changed files with 20 additions and 76 deletions

View File

@ -171,9 +171,11 @@ void Physics::update(float dt)
Scripting::ScriptEngine* script_engine = World::getWorld()->getScriptEngine(); Scripting::ScriptEngine* script_engine = World::getWorld()->getScriptEngine();
int kartid1 = p->getUserPointer(0)->getPointerKart()->getWorldKartId(); int kartid1 = p->getUserPointer(0)->getPointerKart()->getWorldKartId();
int kartid2 = p->getUserPointer(1)->getPointerKart()->getWorldKartId(); int kartid2 = p->getUserPointer(1)->getPointerKart()->getWorldKartId();
// TODO: do not use globals this way, pass directly as function paramters script_engine->runScript("void onKartKartCollision(int, int)",
Scripting::Physics::setCollision(kartid1,kartid2); [=](asIScriptContext* ctx) {
script_engine->runScript("void onKartKartCollision()"); ctx->SetArgDWord(0, kartid1);
ctx->SetArgDWord(1, kartid2);
});
continue; continue;
} // if kart-kart collision } // if kart-kart collision
@ -182,28 +184,27 @@ void Physics::update(float dt)
// Kart hits physical object // Kart hits physical object
// ------------------------- // -------------------------
Scripting::ScriptEngine* script_engine = World::getWorld()->getScriptEngine(); Scripting::ScriptEngine* script_engine = World::getWorld()->getScriptEngine();
Scripting::Physics::setCollision(0, 0); AbstractKart *kart = p->getUserPointer(1)->getPointerKart();
//Scripting::Physics::setCollisionType("KartObject"); //object as in physical object int kartId = kart->getWorldKartId();
Scripting::Physics::setCollision( std::string obj_id = p->getUserPointer(0)->getPointerPhysicalObject()->getID();
p->getUserPointer(0)->getPointerPhysicalObject()->getID(),
"kart" // TODO: pass obj_id as arguent
); script_engine->runScript("void onKartObjectCollision(int)",
script_engine->runScript("void onKartObjectCollision()"); [=](asIScriptContext* ctx) {
ctx->SetArgDWord(0, kartId);
});
PhysicalObject *obj = p->getUserPointer(0) PhysicalObject *obj = p->getUserPointer(0)
->getPointerPhysicalObject(); ->getPointerPhysicalObject();
if (obj->isCrashReset()) if (obj->isCrashReset())
{ {
AbstractKart *kart = p->getUserPointer(1)->getPointerKart();
new RescueAnimation(kart); new RescueAnimation(kart);
} }
else if (obj->isExplodeKartObject()) else if (obj->isExplodeKartObject())
{ {
AbstractKart *kart = p->getUserPointer(1)->getPointerKart();
ExplosionAnimation::create(kart); ExplosionAnimation::create(kart);
} }
else if (obj->isFlattenKartObject()) else if (obj->isFlattenKartObject())
{ {
AbstractKart *kart = p->getUserPointer(1)->getPointerKart();
const KartProperties* kp = kart->getKartProperties(); const KartProperties* kp = kart->getKartProperties();
kart->setSquash(kp->getSquashDuration() * kart->getPlayerDifficulty()->getSquashDuration(), kart->setSquash(kp->getSquashDuration() * kart->getPlayerDifficulty()->getSquashDuration(),
kp->getSquashSlowdown() * kart->getPlayerDifficulty()->getSquashSlowdown()); kp->getSquashSlowdown() * kart->getPlayerDifficulty()->getSquashSlowdown());
@ -211,7 +212,6 @@ void Physics::update(float dt)
else if(obj->isSoccerBall() && else if(obj->isSoccerBall() &&
race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER) race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER)
{ {
int kartId = p->getUserPointer(1)->getPointerKart()->getWorldKartId();
SoccerWorld* soccerWorld = (SoccerWorld*)World::getWorld(); SoccerWorld* soccerWorld = (SoccerWorld*)World::getWorld();
soccerWorld->setLastKartTohitBall(kartId); soccerWorld->setLastKartTohitBall(kartId);
} }
@ -255,12 +255,11 @@ void Physics::update(float dt)
// Projectile hits physical object // Projectile hits physical object
// ------------------------------- // -------------------------------
Scripting::ScriptEngine* script_engine = World::getWorld()->getScriptEngine(); Scripting::ScriptEngine* script_engine = World::getWorld()->getScriptEngine();
Scripting::Physics::setCollision(0,0); //TODO : support item types etc // TODO: pass arguments
//Scripting::Physics::setCollisionType("ItemObject"); //Scripting::Physics::setColl0ision(
Scripting::Physics::setCollision( // p->getUserPointer(1)->getPointerPhysicalObject()->getID(),
p->getUserPointer(1)->getPointerPhysicalObject()->getID(), // "item"
"item" //);
);
script_engine->runScript("void onItemObjectCollision()"); script_engine->runScript("void onItemObjectCollision()");
p->getUserPointer(0)->getPointerFlyable() p->getUserPointer(0)->getPointerFlyable()
->hit(NULL, p->getUserPointer(1)->getPointerPhysicalObject()); ->hit(NULL, p->getUserPointer(1)->getPointerPhysicalObject());

View File

@ -31,8 +31,6 @@ namespace Scripting
namespace Physics namespace Physics
{ {
void registerScriptFunctions(asIScriptEngine *engine); void registerScriptFunctions(asIScriptEngine *engine);
void setCollision(int collider1,int collider2);
void setCollision(std::string collider1, std::string collider2);
} }
namespace Kart namespace Kart

View File

@ -36,40 +36,10 @@ namespace Scripting
HitEffect *he = new Explosion(*explosion_loc, "explosion", "explosion_bomb.xml"); HitEffect *he = new Explosion(*explosion_loc, "explosion", "explosion_bomb.xml");
projectile_manager->addHitEffect(he); projectile_manager->addHitEffect(he);
} }
//Bind getters for colliding karts
void getCollidingKart1(asIScriptGeneric *gen)
{
gen->SetReturnDWord(m_collidingkartid1);
}
void getCollidingKart2(asIScriptGeneric *gen)
{
gen->SetReturnDWord(m_collidingkartid2);
}
//Bind getter for colliding objects
void getCollidingID(asIScriptGeneric *gen)
{
void *pointer = &m_collider1;
gen->SetReturnObject(pointer);
}
//Callbacks from Physics Engine, for collisions
void setCollision(int collider1,int collider2)
{
m_collidingkartid1 = collider1;
m_collidingkartid2 = collider2;
}
void setCollision(std::string collider1, std::string collider2)
{
m_collider1 = collider1;
m_collider2 = collider2;
}
void registerScriptFunctions(asIScriptEngine *engine) void registerScriptFunctions(asIScriptEngine *engine)
{ {
int r; int r;
engine->SetDefaultNamespace("Physics"); engine->SetDefaultNamespace("Physics");
r = engine->RegisterGlobalFunction("uint getCollidingKart1()", asFUNCTION(getCollidingKart1), asCALL_GENERIC); assert( r >= 0 );
r = engine->RegisterGlobalFunction("uint getCollidingKart2()", asFUNCTION(getCollidingKart2), asCALL_GENERIC); assert( r >= 0 );
r = engine->RegisterGlobalFunction("string getCollidingID()", asFUNCTION(getCollidingID), asCALL_GENERIC); assert(r >= 0);
r = engine->RegisterGlobalFunction("string createExplosion(Vec3 &in)", asFUNCTION(createExplosion), asCALL_GENERIC); assert(r >= 0); r = engine->RegisterGlobalFunction("string createExplosion(Vec3 &in)", asFUNCTION(createExplosion), asCALL_GENERIC); assert(r >= 0);
} }
} }

View File

@ -27,34 +27,11 @@ namespace Scripting
namespace Physics namespace Physics
{ {
//IDs of kart collisions
int m_collidingkartid1;
int m_collidingkartid2;
//Details of collision
std::string m_collider1;
std::string m_collider2;
std::string m_collisionType;
//script engine functions //script engine functions
void registerScriptFunctions(asIScriptEngine *engine); void registerScriptFunctions(asIScriptEngine *engine);
asIScriptFunction* asIScriptFunction*
registerScriptCallbacks(asIScriptEngine *engine); registerScriptCallbacks(asIScriptEngine *engine);
//game engine functions
void setCollision(int collider1, int collider2);
void setCollisionType(std::string);
//script-bound functions
void getCollidingKart1(asIScriptGeneric *gen);
void getCollidingKart2(asIScriptGeneric *gen);
void getCollsionType(asIScriptGeneric *gen);
void getCollidingID(asIScriptGeneric *gen);
} }