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-06-11 11:10:07 +08:00
|
|
|
#include "renderer/CCRenderer.h"
|
|
|
|
|
2014-06-13 18:51:32 +08:00
|
|
|
NS_TIMELINE_BEGIN
|
2014-06-11 11:10:07 +08:00
|
|
|
|
2014-06-13 18:51:32 +08:00
|
|
|
class 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; }
|
2014-06-13 13:36:01 +08:00
|
|
|
protected:
|
2014-06-13 16:03:03 +08:00
|
|
|
ActionTimelineData();
|
2014-06-13 13:36:01 +08:00
|
|
|
virtual bool init(int actionTag);
|
|
|
|
|
|
|
|
int _actionTag;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2014-06-13 18:51:32 +08:00
|
|
|
class 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
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
/** 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
|
|
|
|
|
|
|
/** 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. */
|
|
|
|
virtual void setEndFrame(int endFrame) { _endFrame = endFrame; }
|
2014-06-13 16:03:03 +08:00
|
|
|
virtual int getEndFrame() const { return _endFrame; }
|
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);
|
|
|
|
|
2014-06-13 18:51:32 +08:00
|
|
|
virtual const cocos2d::Vector<Timeline*>& getTimelines() const { return _timelineList; }
|
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-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-06-13 18:51:32 +08:00
|
|
|
NS_TIMELINE_END
|
2014-06-11 11:10:07 +08:00
|
|
|
|
|
|
|
|
|
|
|
#endif /*__CCTIMELINE_ACTION_H__*/
|