2019-11-23 20:27:39 +08:00
|
|
|
/****************************************************************************
|
|
|
|
Copyright (c) 2010-2012 cocos2d-x.org
|
|
|
|
Copyright (c) 2013-2016 Chukong Technologies Inc.
|
|
|
|
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
http://www.cocos2d-x.org
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
THE SOFTWARE.
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef __SCRIPT_SUPPORT_H__
|
|
|
|
#define __SCRIPT_SUPPORT_H__
|
|
|
|
|
|
|
|
#include "base/ccConfig.h"
|
|
|
|
#include "platform/CCCommon.h"
|
|
|
|
#include "base/CCTouch.h"
|
|
|
|
#include "base/CCEventTouch.h"
|
|
|
|
#include "base/CCEventKeyboard.h"
|
|
|
|
#include <map>
|
|
|
|
#include <string>
|
|
|
|
#include <list>
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @addtogroup base
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
|
|
|
#if CC_ENABLE_SCRIPT_BINDING
|
|
|
|
|
|
|
|
typedef struct lua_State lua_State;
|
|
|
|
|
|
|
|
NS_CC_BEGIN
|
|
|
|
|
|
|
|
class TimerScriptHandler;
|
|
|
|
class Layer;
|
|
|
|
class MenuItem;
|
|
|
|
class CallFunc;
|
|
|
|
class Acceleration;
|
|
|
|
class Action;
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
enum ccScriptType
|
|
|
|
{
|
2019-11-23 20:27:39 +08:00
|
|
|
kScriptTypeNone = 0,
|
|
|
|
kScriptTypeLua,
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2021-12-25 10:04:45 +08:00
|
|
|
* This classes is wrapped to store the handler corresponding to the Lua function pointer and assign the handler a
|
|
|
|
* unique id
|
2019-11-23 20:27:39 +08:00
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
class ScriptHandlerEntry : public Ref
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* create a ScriptHandlerEntry instance by the handler.
|
|
|
|
*
|
|
|
|
* @param handler corresponding to the Lua function pointer.
|
|
|
|
* @return ScriptHandlerEntry instance.
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
static ScriptHandlerEntry* create(int handler);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Destructor of ScriptHandlerEntry.
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
virtual ~ScriptHandlerEntry();
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Get the handler corresponding to the Lua function pointer.
|
|
|
|
*
|
|
|
|
* @return the handler corresponding to the Lua function pointer.
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
int getHandler() { return _handler; }
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Get the unique id corresponding to the handler.
|
|
|
|
*
|
|
|
|
* @return the unique id corresponding to the handler.
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
int getEntryId() { return _entryId; }
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
protected:
|
2021-12-25 10:04:45 +08:00
|
|
|
ScriptHandlerEntry(int handler) : _handler(handler)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
static int newEntryId = 0;
|
|
|
|
newEntryId++;
|
|
|
|
_entryId = newEntryId;
|
|
|
|
}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
int _handler;
|
|
|
|
int _entryId;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2021-12-25 10:04:45 +08:00
|
|
|
* The SchedulerScriptHandlerEntry is used to store the handler corresponding to the Lua function pointer and assign the
|
|
|
|
* handler a unique id like ScriptHandlerEntry. Meanwhile,create a timer that named TimerScriptHandler to execute the
|
|
|
|
* Lua function corresponding to the handler in the interval time if the SchedulerScriptHandlerEntry object isn't
|
|
|
|
* paused.
|
2019-11-23 20:27:39 +08:00
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
class SchedulerScriptHandlerEntry : public ScriptHandlerEntry
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* create a SchedulerScriptHandlerEntry object.
|
2021-12-25 10:04:45 +08:00
|
|
|
*
|
2019-11-23 20:27:39 +08:00
|
|
|
* @param handler the index corresponding to the Lua function pointer.
|
2021-12-25 10:04:45 +08:00
|
|
|
* @param interval the interval to execute the Lua function. If the value is 0, then the lua function will be
|
|
|
|
* scheduled every frame.
|
2019-11-23 20:27:39 +08:00
|
|
|
* @param paused if paused is true, then the timer won't be started until it is resumed.
|
|
|
|
* @return a SchedulerScriptHandlerEntry object.
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
|
|
|
static SchedulerScriptHandlerEntry* create(int handler, float interval, bool paused);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Destructor of SchedulerScriptHandlerEntry.
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
|
|
|
virtual ~SchedulerScriptHandlerEntry();
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Get the pointer of TimerScriptHandler object.
|
|
|
|
*
|
|
|
|
* @return the pointer of TimerScriptHandler object.
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
TimerScriptHandler* getTimer() { return _timer; }
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Get the flag whether paused or not.
|
|
|
|
*
|
|
|
|
* @return the flag whether paused or not.
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
bool isPaused() { return _paused; }
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Set the markedForDeletion flag true.
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
void markedForDeletion() { _markedForDeletion = true; }
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Get the flag whether markedForDeletion or not.
|
|
|
|
*
|
|
|
|
* @return the flag whether markedForDeletion or not.
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
bool isMarkedForDeletion() { return _markedForDeletion; }
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
private:
|
|
|
|
SchedulerScriptHandlerEntry(int handler)
|
2021-12-25 10:04:45 +08:00
|
|
|
: ScriptHandlerEntry(handler), _timer(nullptr), _paused(false), _markedForDeletion(false)
|
|
|
|
{}
|
2019-11-23 20:27:39 +08:00
|
|
|
bool init(float interval, bool paused);
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
TimerScriptHandler* _timer;
|
|
|
|
bool _paused;
|
|
|
|
bool _markedForDeletion;
|
|
|
|
};
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @cond
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
class TouchScriptHandlerEntry : public ScriptHandlerEntry
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
static TouchScriptHandlerEntry* create(int handler, bool isMultiTouches, int priority, bool swallowsTouches);
|
|
|
|
|
|
|
|
virtual ~TouchScriptHandlerEntry();
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
bool isMultiTouches() { return _isMultiTouches; }
|
2019-11-23 20:27:39 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
int getPriority() { return _priority; }
|
|
|
|
|
|
|
|
bool getSwallowsTouches() { return _swallowsTouches; }
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
private:
|
|
|
|
TouchScriptHandlerEntry(int handler)
|
2021-12-25 10:04:45 +08:00
|
|
|
: ScriptHandlerEntry(handler), _isMultiTouches(false), _priority(0), _swallowsTouches(false)
|
|
|
|
{}
|
2019-11-23 20:27:39 +08:00
|
|
|
bool init(bool isMultiTouches, int priority, bool swallowsTouches);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
|
|
|
bool _isMultiTouches;
|
|
|
|
int _priority;
|
|
|
|
bool _swallowsTouches;
|
2019-11-23 20:27:39 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @endcond
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** ScriptEventType enum*/
|
|
|
|
enum ScriptEventType
|
|
|
|
{
|
|
|
|
kNodeEvent = 0,
|
|
|
|
kMenuClickedEvent,
|
|
|
|
kCallFuncEvent,
|
|
|
|
kScheduleEvent,
|
|
|
|
kTouchEvent,
|
|
|
|
kTouchesEvent,
|
|
|
|
kKeypadEvent,
|
|
|
|
kAccelerometerEvent,
|
|
|
|
kControlEvent,
|
|
|
|
kCommonEvent,
|
|
|
|
kComponentEvent,
|
|
|
|
kRestartGame,
|
|
|
|
kScriptActionEvent
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2021-12-25 10:04:45 +08:00
|
|
|
* For Lua, Wrapper the script data that should be used to find the handler corresponding to the Lua function by the
|
|
|
|
* nativeobject pointer and store the value pointer which would be converted concretely by the different events,then the
|
|
|
|
* converted data would be passed into the Lua stack.
|
2019-11-23 20:27:39 +08:00
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
struct BasicScriptData
|
|
|
|
{
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* For Lua, nativeobject is used to get handler corresponding to the Lua function.
|
|
|
|
*
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
|
|
|
void* nativeObject;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* A pointer point to the value data which would be converted by different events.
|
|
|
|
*
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
|
|
|
void* value;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Constructor of BasicScriptData.
|
|
|
|
*
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
BasicScriptData(void* inObject, void* inValue = nullptr) : nativeObject(inObject), value(inValue) {}
|
2019-11-23 20:27:39 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2021-12-25 10:04:45 +08:00
|
|
|
* For Lua, Wrapper the script data that should be used to find the handler corresponding to the Lua function by the
|
|
|
|
* nativeobject pointer and store the value pointer which would be converted concretely by the different events,then the
|
|
|
|
* converted data would be passed into the Lua stack.
|
2019-11-23 20:27:39 +08:00
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
struct ActionObjectScriptData
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* For Lua, nativeobject is used to get handler corresponding to the Lua function.
|
|
|
|
*
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
|
|
|
void* nativeObject;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* A pointer point to the value data which event action
|
|
|
|
*
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
|
|
|
int* eventType;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* A pointer point to the value data which would be converted by different events.
|
|
|
|
*
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
|
|
|
void* param;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Constructor of BasicScriptData.
|
|
|
|
*
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
ActionObjectScriptData(void* inObject, int* inValue = nullptr, void* inParam = nullptr)
|
|
|
|
: nativeObject(inObject), eventType(inValue), param(inParam)
|
|
|
|
{}
|
2019-11-23 20:27:39 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2021-12-25 10:04:45 +08:00
|
|
|
* For Lua, the SchedulerScriptData is used to find the Lua function pointer by the handler, then call the Lua function
|
|
|
|
* by push the elapse into the Lua stack as a parameter when scheduler update event is triggered.
|
2019-11-23 20:27:39 +08:00
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
struct SchedulerScriptData
|
|
|
|
{
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* the handler corresponding to the Lua function pointer, only use in the Lua.
|
|
|
|
*
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
|
|
|
int handler;
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* the parameter would be passed in to the Lua function, only use in the Lua.
|
|
|
|
*
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
|
|
|
float elapse;
|
|
|
|
// js use
|
|
|
|
void* node;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Constructor of SchedulerScriptData.
|
|
|
|
*
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
SchedulerScriptData(int inHandler, float inElapse, void* inNode = nullptr)
|
|
|
|
: handler(inHandler), elapse(inElapse), node(inNode)
|
|
|
|
{}
|
2019-11-23 20:27:39 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2021-12-25 10:04:45 +08:00
|
|
|
* For Lua, the TouchesScriptData is used to find the Lua function pointer by the nativeObject, then call the Lua
|
|
|
|
* function by push touches data and actionType into the Lua stack as the parameters when the touches event is
|
|
|
|
* triggered.
|
2019-11-23 20:27:39 +08:00
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
struct TouchesScriptData
|
|
|
|
{
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
|
|
|
* The EventTouch::EventCode type.
|
2019-11-23 20:27:39 +08:00
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
EventTouch::EventCode actionType;
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* For Lua, it Used to find the Lua function pointer by the ScriptHandlerMgr.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
void* nativeObject;
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
|
|
|
* The vector of Touch.For Lua, it would be convert to the Lua table form to be pushed into the Lua stack.
|
2019-11-23 20:27:39 +08:00
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
const std::vector<Touch*>& touches;
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* event information, it is useless for Lua.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
Event* event;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Constructor of TouchesScriptData.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
TouchesScriptData(EventTouch::EventCode inActionType,
|
|
|
|
void* inNativeObject,
|
|
|
|
const std::vector<Touch*>& inTouches,
|
|
|
|
Event* evt)
|
|
|
|
: actionType(inActionType), nativeObject(inNativeObject), touches(inTouches), event(evt)
|
|
|
|
{}
|
2019-11-23 20:27:39 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2021-12-25 10:04:45 +08:00
|
|
|
* For Lua, the TouchScriptData is used to find the Lua function pointer by the nativeObject, then call the Lua function
|
|
|
|
* by push touch data and actionType converted to string type into the Lua stack as the parameters when the touch event
|
|
|
|
* is triggered.
|
2019-11-23 20:27:39 +08:00
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
struct TouchScriptData
|
|
|
|
{
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* The EventTouch::EventCode type.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
EventTouch::EventCode actionType;
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* For Lua, it Used to find the Lua function pointer by the ScriptHandlerMgr.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
void* nativeObject;
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* touch information. it would be in x,y form to push into the Lua stack.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
Touch* touch;
|
|
|
|
/**
|
|
|
|
* event information,it is useless for Lua.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
Event* event;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Constructor of TouchScriptData.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
TouchScriptData(EventTouch::EventCode inActionType, void* inNativeObject, Touch* inTouch, Event* evt)
|
2021-12-25 10:04:45 +08:00
|
|
|
: actionType(inActionType), nativeObject(inNativeObject), touch(inTouch), event(evt)
|
|
|
|
{}
|
2019-11-23 20:27:39 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2021-12-25 10:04:45 +08:00
|
|
|
* For Lua, the KeypadScriptData is used to find the Lua function pointer by the nativeObject, then call the Lua
|
|
|
|
* function by push the actionType converted to string type into the Lua stack as the parameters when the Keypad event
|
|
|
|
* is triggered.
|
2019-11-23 20:27:39 +08:00
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
struct KeypadScriptData
|
|
|
|
{
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* The specific type of EventKeyboard::KeyCode
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
EventKeyboard::KeyCode actionType;
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* For Lua, it Used to find the Lua function pointer by the ScriptHandlerMgr.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
void* nativeObject;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Constructor of KeypadScriptData.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
KeypadScriptData(EventKeyboard::KeyCode inActionType, void* inNativeObject)
|
|
|
|
: actionType(inActionType), nativeObject(inNativeObject)
|
|
|
|
{}
|
2019-11-23 20:27:39 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2021-12-25 10:04:45 +08:00
|
|
|
* For Lua, the CommonScriptData is used to find the Lua function pointer by the handler, then call the Lua function by
|
|
|
|
* push the eventName, eventSource(if it not nullptr), eventSourceClassName(if it is nullptr or "", and the eventSource
|
|
|
|
* is not nullptr,would give the default string "cc.Ref") into the Lua stack as the parameter when the common event such
|
|
|
|
* as is triggered.
|
2019-11-23 20:27:39 +08:00
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
struct CommonScriptData
|
|
|
|
{
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* The index to find the corresponding to the Lua function pointer.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
int handler;
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* The string value to be pushed into the Lua stack.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
char eventName[64];
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* The source object trigger the event,could be nullptr.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
Ref* eventSource;
|
|
|
|
/**
|
|
|
|
* The class name of source object trigger the event, could be nullptr.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
char eventSourceClassName[64];
|
2021-12-25 10:04:45 +08:00
|
|
|
|
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Constructor of CommonScriptData.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
CommonScriptData(int inHandler, const char* inName, Ref* inSource = nullptr, const char* inClassName = nullptr)
|
|
|
|
: handler(inHandler), eventSource(inSource)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
if (nullptr == inName)
|
|
|
|
{
|
|
|
|
memset(eventName, 0, sizeof(eventName));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
strncpy(eventName, inName, sizeof(eventName));
|
|
|
|
}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (nullptr == inClassName)
|
|
|
|
{
|
|
|
|
memset(eventSourceClassName, 0, sizeof(eventSourceClassName));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
strncpy(eventSourceClassName, inClassName, 64);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The ScriptEvent wrapper the different script data corresponding to the ScriptEventType in to the unified struct.
|
|
|
|
* when the corresponding event is triggered, we could call the `sendEvent` of ScriptEngineProtocol to handle the event.
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
struct ScriptEvent
|
|
|
|
{
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* The specific type of ScriptEventType.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
ScriptEventType type;
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Pointer point to the different data.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
void* data;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Constructor of ScriptEvent.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
ScriptEvent(ScriptEventType inType, void* inData) : type(inType), data(inData) {}
|
2019-11-23 20:27:39 +08:00
|
|
|
};
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Don't make ScriptEngineProtocol inherits from Object since setScriptEngine is invoked only once in AppDelegate.cpp,
|
2021-12-25 10:04:45 +08:00
|
|
|
* It will affect the lifecycle of ScriptEngine instance, the autorelease pool will be destroyed before destructing
|
|
|
|
* ScriptEngine. So a crash will appear on Win32 if you click the close button.
|
2019-11-23 20:27:39 +08:00
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
class CC_DLL ScriptEngineProtocol
|
|
|
|
{
|
|
|
|
public:
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Constructor of ScriptEngineProtocol.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
ScriptEngineProtocol() {}
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Destructor of ScriptEngineProtocol.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
virtual ~ScriptEngineProtocol() {}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Get the specific script type.
|
|
|
|
*
|
|
|
|
* @return the specific script type.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
virtual ccScriptType getScriptType() { return kScriptTypeNone; }
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Reflect the retain relationship to script scope
|
|
|
|
*/
|
|
|
|
virtual void retainScriptObject(Ref* /*owner*/, Ref* /*target*/) {}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Add the script object to root object
|
|
|
|
*/
|
|
|
|
virtual void rootScriptObject(Ref* /*target*/) {}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Reflect the release relationship to script scope
|
|
|
|
*/
|
|
|
|
virtual void releaseScriptObject(Ref* /*owner*/, Ref* /*target*/) {}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Remove the script object from root object
|
|
|
|
*/
|
|
|
|
virtual void unrootScriptObject(Ref* /*target*/) {}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Release all children native refs for the given node in script scope
|
|
|
|
*/
|
|
|
|
virtual void releaseAllChildrenRecursive(Node* /*node*/) {}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Release all native refs for the given owner in script scope
|
|
|
|
*/
|
|
|
|
virtual void releaseAllNativeRefs(cocos2d::Ref* /*owner*/) {}
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Remove script object,The specific meaning should refer to the ScriptType.
|
|
|
|
* For Lua, @see removeScriptObjectByObject of LuaEngine.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
virtual void removeScriptObjectByObject(Ref* /*obj*/) {}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Remove script function handler, only LuaEngine class need to implement this function.
|
|
|
|
* @see removeScriptHandler of LuaEngine.
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
virtual void removeScriptHandler(int /*handler*/) {}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Reallocate script function handler, only LuaEngine class need to implement this function.
|
|
|
|
* @see reallocateScriptHandler of LuaEngine.
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
virtual int reallocateScriptHandler(int /*handler*/) { return 0; }
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Execute script code contained in the given string.
|
|
|
|
*
|
|
|
|
* @param codes holding the valid script code that should be executed.
|
|
|
|
* @return 0 if the string is executed correctly.
|
|
|
|
* @return other if the string is executed wrongly.
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
virtual int executeString(const char* codes) = 0;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Execute a script file.
|
2021-12-25 10:04:45 +08:00
|
|
|
*
|
2019-11-23 20:27:39 +08:00
|
|
|
* @param filename String object holding the filename of the script file that is to be executed.
|
2021-12-25 10:04:45 +08:00
|
|
|
* @return 0 if it happen the error or it hasn't return value, otherwise it return the value by calling the lua
|
|
|
|
* function.
|
2019-11-23 20:27:39 +08:00
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
virtual int executeScriptFile(const char* filename) = 0;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Execute a scripted global function.
|
|
|
|
* The function should not take any parameters and should return an integer.
|
|
|
|
*
|
2021-12-25 10:04:45 +08:00
|
|
|
* @param functionName String object holding the name of the function, in the global script environment, that is to
|
|
|
|
* be executed.
|
2019-11-23 20:27:39 +08:00
|
|
|
* @return The integer value returned from the script function.
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
virtual int executeGlobalFunction(const char* functionName) = 0;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
2021-12-25 10:04:45 +08:00
|
|
|
* When trigger a script event ,call this func,add params needed into ScriptEvent object.nativeObject is object
|
|
|
|
* triggering the event, can be nullptr in Lua.
|
2019-11-23 20:27:39 +08:00
|
|
|
*
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2020-02-24 23:08:47 +08:00
|
|
|
virtual int sendEvent(const ScriptEvent& evt) = 0;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Handle the assert message.
|
|
|
|
*
|
|
|
|
* @return true if the assert was handled by the script engine, false otherwise.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
virtual bool handleAssert(const char* msg) = 0;
|
|
|
|
|
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Useless for Lua.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
virtual void setCalledFromScript(bool /*callFromScript*/) {}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Useless for Lua.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
virtual bool isCalledFromScript() { return false; };
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** ConfigType enum. */
|
|
|
|
enum class ConfigType
|
|
|
|
{
|
|
|
|
NONE,
|
|
|
|
COCOSTUDIO
|
|
|
|
};
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Parse configuration file.
|
2021-12-25 10:04:45 +08:00
|
|
|
*
|
2019-11-23 20:27:39 +08:00
|
|
|
* @param type the specific type value.
|
|
|
|
* @param str the information data.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2021-12-26 23:26:34 +08:00
|
|
|
virtual bool parseConfig(ConfigType type, std::string_view str) = 0;
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
/** Root a Reference.
|
|
|
|
It tells the Garbage Collector that the associated Scripting object should not be collected
|
|
|
|
*/
|
|
|
|
virtual void rootObject(Ref* /*obj*/) {}
|
|
|
|
|
|
|
|
/** Unroot a Reference.
|
|
|
|
It tells the Garbage Collector that the associated Scripting object can be collected
|
|
|
|
*/
|
|
|
|
virtual void unrootObject(Ref* /*obj*/) {}
|
|
|
|
|
|
|
|
/** Remove proxy for a native object
|
|
|
|
*/
|
|
|
|
virtual void removeObjectProxy(Ref* obj) {}
|
|
|
|
|
|
|
|
/** Triggers the garbage collector */
|
|
|
|
virtual void garbageCollect() {}
|
|
|
|
};
|
|
|
|
|
|
|
|
class Node;
|
|
|
|
/**
|
|
|
|
* ScriptEngineManager is a singleton which manager an object instance of ScriptEngineProtocol, such as LuaEngine.
|
|
|
|
*
|
|
|
|
* @since v0.99.5-x-0.8.5
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
class CC_DLL ScriptEngineManager
|
|
|
|
{
|
|
|
|
public:
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Constructor of ScriptEngineManager.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
~ScriptEngineManager();
|
2021-12-25 10:04:45 +08:00
|
|
|
/**
|
2019-11-23 20:27:39 +08:00
|
|
|
* Get the ScriptEngineProtocol object.
|
|
|
|
*
|
|
|
|
* @return the ScriptEngineProtocol object.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
ScriptEngineProtocol* getScriptEngine() { return _scriptEngine; }
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Set the ScriptEngineProtocol object should be managed.
|
|
|
|
*
|
|
|
|
* @param scriptEngine should be managed.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
void setScriptEngine(ScriptEngineProtocol* scriptEngine);
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Remove the ScriptEngineProtocol object managed.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
void removeScriptEngine();
|
|
|
|
/**
|
|
|
|
* Get the instance of ScriptEngineManager object.
|
|
|
|
*
|
|
|
|
* @return the instance of ScriptEngineManager object.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
static ScriptEngineManager* getInstance();
|
|
|
|
/**
|
|
|
|
* Destroy the singleton about ScriptEngineManager.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
static void destroyInstance();
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/**
|
|
|
|
* Call the Lua function when the event of node is triggered.
|
2021-12-25 10:04:45 +08:00
|
|
|
*
|
2019-11-23 20:27:39 +08:00
|
|
|
* @param node the nativeobject triggers the event.
|
|
|
|
* @param action the specific type.
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
|
|
|
static void sendNodeEventToLua(Node* node, int action);
|
2020-02-24 23:08:47 +08:00
|
|
|
|
|
|
|
/**
|
2021-12-25 10:04:45 +08:00
|
|
|
* Send a event to lua script
|
|
|
|
*
|
|
|
|
* @param event: the script event
|
|
|
|
*
|
|
|
|
* @lua NA
|
|
|
|
* @js NA
|
|
|
|
*/
|
2020-02-24 23:08:47 +08:00
|
|
|
static int sendEventToLua(const ScriptEvent& event);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
private:
|
2021-12-25 10:04:45 +08:00
|
|
|
ScriptEngineManager() : _scriptEngine(nullptr) {}
|
|
|
|
|
|
|
|
ScriptEngineProtocol* _scriptEngine;
|
2019-11-23 20:27:39 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
NS_CC_END
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
#endif // #if CC_ENABLE_SCRIPT_BINDING
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
// end group
|
|
|
|
/// @}
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
#endif // __SCRIPT_SUPPORT_H__
|