2014-06-11 11:10:07 +08:00
|
|
|
/****************************************************************************
|
|
|
|
Copyright (c) 2013 cocos2d-x.org
|
|
|
|
|
|
|
|
http://www.cocos2d-x.org
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
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 __CCTIMELINE_ACTION_H__
|
|
|
|
#define __CCTIMELINE_ACTION_H__
|
|
|
|
|
2014-06-13 18:51:32 +08:00
|
|
|
#include "CCTimeLine.h"
|
2014-07-21 17:45:56 +08:00
|
|
|
#include "cocostudio/CocosStudioExport.h"
|
2014-08-29 15:39:52 +08:00
|
|
|
#include "2d/CCAction.h"
|
2014-06-11 11:10:07 +08:00
|
|
|
|
2014-06-13 18:51:32 +08:00
|
|
|
NS_TIMELINE_BEGIN
|
2014-06-11 11:10:07 +08:00
|
|
|
|
2015-01-12 10:55:15 +08:00
|
|
|
struct AnimationInfo
|
2014-12-22 18:57:48 +08:00
|
|
|
{
|
2015-01-28 16:59:27 +08:00
|
|
|
AnimationInfo():startIndex(0),endIndex(0){}
|
|
|
|
AnimationInfo(const std::string& otherName, int otherStartIndex, int otherEndIndex)
|
|
|
|
:name(otherName),
|
|
|
|
startIndex(otherStartIndex),
|
|
|
|
endIndex(otherEndIndex)
|
|
|
|
{
|
|
|
|
}
|
2014-12-22 18:57:48 +08:00
|
|
|
std::string name;
|
|
|
|
int startIndex;
|
|
|
|
int endIndex;
|
|
|
|
};
|
|
|
|
|
2014-07-21 17:45:56 +08:00
|
|
|
class CC_STUDIO_DLL ActionTimelineData : public cocos2d::Ref
|
2014-06-13 13:36:01 +08:00
|
|
|
{
|
|
|
|
public:
|
2014-06-13 16:03:03 +08:00
|
|
|
static ActionTimelineData* create(int actionTag);
|
2014-06-13 13:36:01 +08:00
|
|
|
|
|
|
|
virtual void setActionTag(int actionTag) { _actionTag = actionTag; }
|
2014-06-13 16:03:03 +08:00
|
|
|
virtual int getActionTag() const { return _actionTag; }
|
2015-01-12 11:57:03 +08:00
|
|
|
CC_CONSTRUCTOR_ACCESS:
|
2014-06-13 16:03:03 +08:00
|
|
|
ActionTimelineData();
|
2014-06-13 13:36:01 +08:00
|
|
|
virtual bool init(int actionTag);
|
2015-01-12 11:57:03 +08:00
|
|
|
protected:
|
2014-06-13 13:36:01 +08:00
|
|
|
int _actionTag;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2014-07-21 17:45:56 +08:00
|
|
|
class CC_STUDIO_DLL ActionTimeline : public cocos2d::Action
|
2014-06-11 11:10:07 +08:00
|
|
|
{
|
|
|
|
public:
|
2014-06-13 16:03:03 +08:00
|
|
|
friend class Frame;
|
|
|
|
|
|
|
|
static ActionTimeline* create();
|
2014-06-11 11:10:07 +08:00
|
|
|
|
2014-06-13 16:03:03 +08:00
|
|
|
ActionTimeline();
|
|
|
|
virtual ~ActionTimeline();
|
2014-06-11 11:10:07 +08:00
|
|
|
|
2015-01-12 10:55:15 +08:00
|
|
|
virtual void play(std::string animationName, bool loop);
|
|
|
|
|
2014-06-11 11:10:07 +08:00
|
|
|
virtual bool init();
|
|
|
|
|
|
|
|
/** Goto the specified frame index, and start playing from this index.
|
|
|
|
* @param startIndex The animation will play from this index.
|
|
|
|
*/
|
|
|
|
virtual void gotoFrameAndPlay(int startIndex);
|
|
|
|
|
|
|
|
/** Goto the specified frame index, and start playing from this index.
|
|
|
|
* @param startIndex The animation will play from this index.
|
|
|
|
* @param loop Whether or not the animation need loop.
|
|
|
|
*/
|
|
|
|
virtual void gotoFrameAndPlay(int startIndex, bool loop);
|
|
|
|
|
|
|
|
/** Goto the specified frame index, and start playing from start index, end at end index.
|
|
|
|
* @param startIndex The animation will play from this index.
|
|
|
|
* @param endIndex The animation will end at this index.
|
|
|
|
* @param loop Whether or not the animation need loop.
|
|
|
|
*/
|
|
|
|
virtual void gotoFrameAndPlay(int startIndex, int endIndex, bool loop);
|
|
|
|
|
2014-06-30 15:53:12 +08:00
|
|
|
/** Goto the specified frame index, and start playing from start index, end at end index.
|
|
|
|
* @param startIndex The animation will play from this index.
|
|
|
|
* @param endIndex The animation will end at this index.
|
|
|
|
* @param currentFrameIndex set current frame index.
|
|
|
|
* @param loop Whether or not the animation need loop.
|
|
|
|
*/
|
|
|
|
virtual void gotoFrameAndPlay(int startIndex, int endIndex, int currentFrameIndex, bool loop);
|
|
|
|
|
2014-06-11 11:10:07 +08:00
|
|
|
/** Goto the specified frame index, and pause at this index.
|
|
|
|
* @param startIndex The animation will pause at this index.
|
|
|
|
*/
|
|
|
|
virtual void gotoFrameAndPause(int startIndex);
|
|
|
|
|
|
|
|
/** Pause the animation. */
|
|
|
|
virtual void pause();
|
|
|
|
/** Resume the animation. */
|
|
|
|
virtual void resume();
|
|
|
|
|
|
|
|
/** Whether or not Action is playing. */
|
2014-06-13 16:03:03 +08:00
|
|
|
virtual bool isPlaying() const;
|
2014-06-11 11:10:07 +08:00
|
|
|
|
|
|
|
/** Set the animation speed, this will speed up or slow down the speed. */
|
2014-06-13 16:03:03 +08:00
|
|
|
virtual void setTimeSpeed(float speed) { _timeSpeed = speed; }
|
2014-06-11 11:10:07 +08:00
|
|
|
/** Get current animation speed. */
|
2014-06-13 16:03:03 +08:00
|
|
|
virtual float getTimeSpeed() const { return _timeSpeed; }
|
2014-06-11 11:10:07 +08:00
|
|
|
|
|
|
|
/** duration of the whole action*/
|
|
|
|
virtual void setDuration(int duration) { _duration = duration; }
|
2014-06-13 16:03:03 +08:00
|
|
|
virtual int getDuration() const { return _duration; }
|
2014-06-11 11:10:07 +08:00
|
|
|
|
2014-06-17 15:57:30 +08:00
|
|
|
/** Start frame index of this action*/
|
|
|
|
virtual int getStartFrame() const { return _startFrame; }
|
|
|
|
|
2014-06-11 11:10:07 +08:00
|
|
|
/** End frame of this action.
|
|
|
|
* When action play to this frame, if action is not loop, then it will stop,
|
|
|
|
* or it will play from start frame again. */
|
2014-06-13 16:03:03 +08:00
|
|
|
virtual int getEndFrame() const { return _endFrame; }
|
2014-06-11 11:10:07 +08:00
|
|
|
|
2014-06-30 15:53:12 +08:00
|
|
|
/** Set current frame index, this will cause action plays to this frame. */
|
|
|
|
virtual void setCurrentFrame(int frameIndex);
|
2014-06-11 11:10:07 +08:00
|
|
|
/** Get current frame. */
|
2014-06-13 16:03:03 +08:00
|
|
|
virtual int getCurrentFrame() const { return _currentFrame; }
|
2014-06-11 11:10:07 +08:00
|
|
|
|
2014-06-13 16:03:03 +08:00
|
|
|
/** add Timeline to ActionTimeline */
|
2014-06-11 11:10:07 +08:00
|
|
|
virtual void addTimeline(Timeline* timeline);
|
|
|
|
virtual void removeTimeline(Timeline* timeline);
|
2015-01-12 10:55:15 +08:00
|
|
|
|
2014-06-13 18:51:32 +08:00
|
|
|
virtual const cocos2d::Vector<Timeline*>& getTimelines() const { return _timelineList; }
|
2015-01-12 10:55:15 +08:00
|
|
|
|
2015-01-12 11:09:19 +08:00
|
|
|
/** AnimationInfo*/
|
2015-01-12 10:55:15 +08:00
|
|
|
virtual void addAnimationInfo(const AnimationInfo& animationInfo);
|
|
|
|
virtual void removeAnimationInfo(std::string animationName);
|
|
|
|
virtual bool IsAnimationInfoExists(const std::string& animationName);
|
|
|
|
virtual AnimationInfo getAnimationInfo(const std::string& animationName);
|
2014-06-13 16:03:03 +08:00
|
|
|
|
|
|
|
/** Set ActionTimeline's frame event callback function */
|
2014-06-11 11:10:07 +08:00
|
|
|
void setFrameEventCallFunc(std::function<void(Frame *)> listener);
|
|
|
|
void clearFrameEventCallFunc();
|
|
|
|
|
2014-10-23 17:38:04 +08:00
|
|
|
/** Last frame callback will call when arriving last frame */
|
|
|
|
void setLastFrameCallFunc(std::function<void()> listener);
|
|
|
|
void clearLastFrameCallFunc();
|
|
|
|
|
2014-06-13 13:36:01 +08:00
|
|
|
/** Inherit from Action. */
|
2014-06-11 11:10:07 +08:00
|
|
|
|
2014-06-13 16:03:03 +08:00
|
|
|
/** Returns a clone of ActionTimeline */
|
|
|
|
virtual ActionTimeline* clone() const override;
|
2014-06-11 11:10:07 +08:00
|
|
|
|
2014-06-13 16:03:03 +08:00
|
|
|
/** Returns a reverse of ActionTimeline.
|
2014-06-11 11:10:07 +08:00
|
|
|
* Not implement yet.
|
|
|
|
*/
|
2014-06-13 16:03:03 +08:00
|
|
|
virtual ActionTimeline* reverse() const override { return nullptr; }
|
2014-06-11 11:10:07 +08:00
|
|
|
|
|
|
|
virtual void step(float delta) override;
|
2014-06-13 18:51:32 +08:00
|
|
|
virtual void startWithTarget(cocos2d::Node *target) override;
|
2014-06-11 11:10:07 +08:00
|
|
|
virtual bool isDone() const override { return false; }
|
|
|
|
protected:
|
|
|
|
virtual void gotoFrame(int frameIndex);
|
|
|
|
virtual void stepToFrame(int frameIndex);
|
|
|
|
|
2014-06-13 16:03:03 +08:00
|
|
|
/** emit frame event, call it when enter a frame*/
|
|
|
|
virtual void emitFrameEvent(Frame* frame);
|
|
|
|
|
2014-06-13 18:51:32 +08:00
|
|
|
std::map<int, cocos2d::Vector<Timeline*>> _timelineMap;
|
|
|
|
cocos2d::Vector<Timeline*> _timelineList;
|
2014-06-11 11:10:07 +08:00
|
|
|
|
|
|
|
int _duration;
|
|
|
|
double _time;
|
|
|
|
float _timeSpeed;
|
|
|
|
float _frameInternal;
|
|
|
|
bool _playing;
|
|
|
|
int _currentFrame;
|
2014-06-17 11:45:57 +08:00
|
|
|
int _startFrame;
|
2014-06-11 11:10:07 +08:00
|
|
|
int _endFrame;
|
|
|
|
bool _loop;
|
|
|
|
|
|
|
|
std::function<void(Frame*)> _frameEventListener;
|
2014-10-23 17:38:04 +08:00
|
|
|
std::function<void()> _lastFrameListener;
|
2015-01-12 10:55:15 +08:00
|
|
|
std::map<std::string, AnimationInfo> _animationInfos;
|
2014-06-11 11:10:07 +08:00
|
|
|
};
|
|
|
|
|
2014-06-13 18:51:32 +08:00
|
|
|
NS_TIMELINE_END
|
2014-06-11 11:10:07 +08:00
|
|
|
|
|
|
|
|
|
|
|
#endif /*__CCTIMELINE_ACTION_H__*/
|