00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "scriptingcomponent.h"
00021 #include "scriptingcomponentprivate.h"
00022 #include "scriptingengine.h"
00023
00024 #include "game.h"
00025 #include "gameobject.h"
00026 #include "scene.h"
00027 #include <qscriptclass.h>
00028 #include <qscriptvalueiterator.h>
00029
00030 REGISTER_OBJECTTYPE( GluonEngine, ScriptingComponent )
00031
00032 using namespace GluonEngine;
00033
00034 ScriptingComponent::ScriptingComponent( QObject* parent )
00035 : Component( parent )
00036 , d( new ScriptingComponentPrivate )
00037 {
00038 }
00039
00040 ScriptingComponent::ScriptingComponent( const ScriptingComponent& other )
00041 : d( other.d )
00042 {
00043 }
00044
00045 ScriptingComponent::~ScriptingComponent()
00046 {
00047 }
00048
00049 QString
00050 ScriptingComponent::category() const
00051 {
00052 return QString( "Game Logic" );
00053 }
00054
00055 ScriptingAsset* ScriptingComponent::script() const
00056 {
00057 return d->scriptingAsset;
00058 }
00059
00060 void ScriptingComponent::setScript( GluonEngine::ScriptingAsset* newAsset )
00061 {
00062 d->scriptingAsset = newAsset;
00063 connect( newAsset, SIGNAL( dataChanged() ), this, SLOT( scriptAssetUpdated() ) );
00064 d->scriptObject = ScriptingEngine::instance()->instantiateClass( newAsset );
00065
00066
00067
00068 QScriptEngine::QObjectWrapOptions wrapOptions = QScriptEngine::AutoCreateDynamicProperties | QScriptEngine::ExcludeDeleteLater | QScriptEngine::PreferExistingWrapperObject;
00069 QScriptEngine::ValueOwnership ownership = QScriptEngine::QtOwnership;
00070
00071 QScriptValue component = ScriptingEngine::instance()->scriptEngine()->newQObject( this, ownership, wrapOptions );
00072 d->scriptObject.setProperty( "Component", component );
00073
00074 QScriptValue gameObj = ScriptingEngine::instance()->scriptEngine()->newQObject( gameObject(), ownership, wrapOptions );
00075 d->scriptObject.setProperty( "GameObject", gameObj );
00076
00077 QScriptValue sceneObj = ScriptingEngine::instance()->scriptEngine()->newQObject( gameObject()->scene(), ownership, wrapOptions );
00078 d->scriptObject.setProperty( "Scene", sceneObj );
00079
00080 QScriptValue gameProjectObj = ScriptingEngine::instance()->scriptEngine()->newQObject( GluonEngine::Game::instance()->gameProject(), ownership, wrapOptions );
00081 d->scriptObject.setProperty( "GameProject", gameProjectObj );
00082
00083 QScriptValue game = ScriptingEngine::instance()->scriptEngine()->newQObject( GluonEngine::Game::instance(), ownership, wrapOptions );
00084 d->scriptObject.setProperty( "Game", game );
00085
00086
00087 d->initializeFunction = d->scriptObject.property( "initialize" );
00088 d->startFunction = d->scriptObject.property( "start" );
00089 d->updateFunction = d->scriptObject.property( "update" );
00090 d->drawFunction = d->scriptObject.property( "draw" );
00091 d->stopFunction = d->scriptObject.property( "stop" );
00092 d->cleanupFunction = d->scriptObject.property( "cleanup" );
00093 }
00094
00095 void ScriptingComponent::scriptAssetUpdated()
00096 {
00097 disconnect( this, SLOT( scriptAssetUpdated() ) );
00098 setScript( this->script() );
00099 }
00100
00101 QScriptValue ScriptingComponent::scriptObject()
00102 {
00103 return d->scriptObject;
00104 }
00105
00106 void ScriptingComponent::initialize()
00107 {
00108 if( !d->scriptObject.isValid() )
00109 debug("Warning: No scripting asset has been chosen");
00110
00111 if( d->initializeFunction.isFunction() )
00112 {
00113 d->initializeFunction.call( d->scriptObject );
00114 if( ScriptingEngine::instance()->scriptEngine()->uncaughtException().isValid() )
00115
00116 debug( QString( "%1: %2" )
00117 .arg( ScriptingEngine::instance()->scriptEngine()->uncaughtException().toString() )
00118 .arg( ScriptingEngine::instance()->scriptEngine()->uncaughtExceptionBacktrace().join( " " ) ) );
00119 }
00120 GluonEngine::Component::initialize();
00121 }
00122
00123 void ScriptingComponent::start()
00124 {
00125 if( d->startFunction.isFunction() )
00126 {
00127 d->startFunction.call( d->scriptObject );
00128 if( ScriptingEngine::instance()->scriptEngine()->uncaughtException().isValid() )
00129
00130 debug( QString( "%1: %2" )
00131 .arg( ScriptingEngine::instance()->scriptEngine()->uncaughtException().toString() )
00132 .arg( ScriptingEngine::instance()->scriptEngine()->uncaughtExceptionBacktrace().join( " " ) ) );
00133 }
00134 GluonEngine::Component::start();
00135 }
00136
00137 void ScriptingComponent::update( int elapsedMilliseconds )
00138 {
00139 if( d->updateFunction.isFunction() )
00140 {
00141 d->updateFunction.call( d->scriptObject, QScriptValueList() << elapsedMilliseconds );
00142 if( ScriptingEngine::instance()->scriptEngine()->uncaughtException().isValid() )
00143
00144 debug( QString( "%1: %2" )
00145 .arg( ScriptingEngine::instance()->scriptEngine()->uncaughtException().toString() )
00146 .arg( ScriptingEngine::instance()->scriptEngine()->uncaughtExceptionBacktrace().join( " " ) ) );
00147 }
00148 GluonEngine::Component::update( elapsedMilliseconds );
00149 }
00150
00151 void ScriptingComponent::draw( int timeLapse )
00152 {
00153 if( d->drawFunction.isFunction() )
00154 {
00155 d->drawFunction.call( d->scriptObject, QScriptValueList() << timeLapse );
00156 if( ScriptingEngine::instance()->scriptEngine()->uncaughtException().isValid() )
00157
00158 debug( QString( "%1: %2" )
00159 .arg( ScriptingEngine::instance()->scriptEngine()->uncaughtException().toString() )
00160 .arg( ScriptingEngine::instance()->scriptEngine()->uncaughtExceptionBacktrace().join( " " ) ) );
00161 }
00162 GluonEngine::Component::draw();
00163 }
00164
00165 void ScriptingComponent::stop()
00166 {
00167 if( d->stopFunction.isFunction() )
00168 {
00169 d->stopFunction.call( d->scriptObject );
00170 if( ScriptingEngine::instance()->scriptEngine()->uncaughtException().isValid() )
00171
00172 debug( QString( "%1: %2" )
00173 .arg( ScriptingEngine::instance()->scriptEngine()->uncaughtException().toString() )
00174 .arg( ScriptingEngine::instance()->scriptEngine()->uncaughtExceptionBacktrace().join( " " ) ) );
00175 }
00176 GluonEngine::Component::stop();
00177 }
00178
00179 void ScriptingComponent::cleanup()
00180 {
00181 if( d->cleanupFunction.isFunction() )
00182 {
00183 d->cleanupFunction.call( d->scriptObject );
00184 if( ScriptingEngine::instance()->scriptEngine()->uncaughtException().isValid() )
00185
00186 debug( QString( "%1: %2" )
00187 .arg( ScriptingEngine::instance()->scriptEngine()->uncaughtException().toString() )
00188 .arg( ScriptingEngine::instance()->scriptEngine()->uncaughtExceptionBacktrace().join( " " ) ) );
00189 }
00190 GluonEngine::Component::cleanup();
00191 }
00192
00193 #include "scriptingcomponent.moc"