2012-04-19 14:35:52 +08:00
/****************************************************************************
2012-06-14 15:13:16 +08:00
Copyright ( c ) 2010 - 2012 cocos2d - x . org
2012-04-19 14:35:52 +08:00
Copyright ( c ) 2008 - 2010 Ricardo Quesada
Copyright ( c ) 2011 Zynga Inc .
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 __ACTIONS_CCACTION_H__
# define __ACTIONS_CCACTION_H__
2012-06-19 13:50:11 +08:00
# include "cocoa/CCObject.h"
# include "cocoa/CCGeometry.h"
# include "platform/CCPlatformMacros.h"
2012-04-19 14:35:52 +08:00
NS_CC_BEGIN
2010-07-20 14:42:56 +08:00
enum {
2012-04-19 14:35:52 +08:00
//! Default tag
2013-06-20 14:13:12 +08:00
kActionTagInvalid = - 1 ,
2012-04-19 14:35:52 +08:00
} ;
2012-06-20 18:07:27 +08:00
/**
* @ addtogroup actions
* @ {
*/
2010-09-28 18:27:33 +08:00
/**
2013-06-20 14:13:12 +08:00
@ brief Base class for Action objects .
2010-07-20 14:42:56 +08:00
*/
2013-06-21 11:19:17 +08:00
class CC_DLL Action : public Object //, public Clonable // XXX: Why not to make it be inherited from Clonable, please refer to https://groups.google.com/forum/?hl=en#!topic/cocos2d-js-devel/dGJYz9wIb4Q , but we need to find out the real reason why VS compiler generate linking errors.
2010-07-20 14:42:56 +08:00
{
public :
2013-06-20 14:13:12 +08:00
Action ( void ) ;
2013-06-14 08:25:14 +08:00
2013-06-20 14:13:12 +08:00
virtual ~ Action ( void ) ;
2010-07-20 14:42:56 +08:00
2012-04-19 14:35:52 +08:00
const char * description ( ) ;
2010-07-20 14:42:56 +08:00
2013-06-14 08:25:14 +08:00
/** returns a clone of action */
2013-06-20 14:13:12 +08:00
virtual Action * clone ( ) const = 0 ;
2010-07-20 14:42:56 +08:00
2012-04-19 14:35:52 +08:00
//! return true if the action has finished
virtual bool isDone ( void ) ;
2010-07-20 14:42:56 +08:00
2012-04-19 14:35:52 +08:00
//! called before the action start. It will also set the target.
2013-06-20 14:13:12 +08:00
virtual void startWithTarget ( Node * pTarget ) ;
2010-07-20 14:42:56 +08:00
2012-04-19 14:35:52 +08:00
/**
called after the action has finished . It will set the ' target ' to nil .
2010-09-29 17:39:45 +08:00
IMPORTANT : You should never call " [action stop] " manually . Instead , use : " target->stopAction(action); "
2012-04-19 14:35:52 +08:00
*/
2010-08-05 14:32:04 +08:00
virtual void stop ( void ) ;
2010-07-20 14:42:56 +08:00
2012-04-19 14:35:52 +08:00
//! called every frame with it's delta time. DON'T override unless you know what you are doing.
2012-06-08 13:55:28 +08:00
virtual void step ( float dt ) ;
2012-04-19 14:35:52 +08:00
/**
called once per frame . time a value between 0 and 1
For example :
- 0 means that the action just started
- 0.5 means that the action is in the middle
- 1 means that the action is over
*/
2012-06-08 13:55:28 +08:00
virtual void update ( float time ) ;
2012-04-19 14:35:52 +08:00
2013-06-20 14:13:12 +08:00
inline Node * getTarget ( void ) { return _target ; }
2012-04-19 14:35:52 +08:00
/** The action will modify the target properties. */
2013-06-20 14:13:12 +08:00
inline void setTarget ( Node * pTarget ) { _target = pTarget ; }
2012-04-19 14:35:52 +08:00
2013-06-20 14:13:12 +08:00
inline Node * getOriginalTarget ( void ) { return _originalTarget ; }
2012-04-19 14:35:52 +08:00
/** Set the original target, since target can be nil.
2013-06-20 14:13:12 +08:00
Is the target that were used to run the action . Unless you are doing something complex , like ActionManager , you should NOT call this method .
2012-04-19 14:35:52 +08:00
The target is ' assigned ' , it is not ' retained ' .
@ since v0 .8 .2
*/
2013-06-20 14:13:12 +08:00
inline void setOriginalTarget ( Node * pOriginalTarget ) { _originalTarget = pOriginalTarget ; }
2012-04-19 14:35:52 +08:00
2013-06-15 14:03:30 +08:00
inline int getTag ( void ) { return _tag ; }
inline void setTag ( int nTag ) { _tag = nTag ; }
2010-07-20 14:42:56 +08:00
public :
2013-06-16 03:38:32 +08:00
2010-07-20 14:42:56 +08:00
protected :
2013-06-20 14:13:12 +08:00
Node * _originalTarget ;
2012-04-19 14:35:52 +08:00
/** The "target".
The target will be set with the ' startWithTarget ' method .
When the ' stop ' method is called , target will be set to nil .
The target is ' assigned ' , it is not ' retained ' .
*/
2013-06-20 14:13:12 +08:00
Node * _target ;
2012-04-19 14:35:52 +08:00
/** The action tag. An identifier of the action */
2013-06-15 14:03:30 +08:00
int _tag ;
2012-04-19 14:35:52 +08:00
} ;
2010-09-28 18:27:33 +08:00
/**
@ brief
Base class actions that do have a finite time duration .
2010-07-20 14:42:56 +08:00
Possible actions :
- An action with a duration of 0 seconds
- An action with a duration of 35.5 seconds
2010-09-28 18:27:33 +08:00
Infinite time actions are valid
2012-04-19 14:35:52 +08:00
*/
2013-06-20 14:13:12 +08:00
class CC_DLL FiniteTimeAction : public Action
2012-04-19 14:35:52 +08:00
{
public :
2013-06-20 14:13:12 +08:00
FiniteTimeAction ( )
2013-06-15 14:03:30 +08:00
: _duration ( 0 )
2012-04-19 14:35:52 +08:00
{ }
2013-06-20 14:13:12 +08:00
virtual ~ FiniteTimeAction ( ) { }
2012-04-19 14:35:52 +08:00
//! get duration in seconds of the action
2013-06-15 14:03:30 +08:00
inline float getDuration ( void ) { return _duration ; }
2012-04-19 14:35:52 +08:00
//! set duration in seconds of the action
2013-06-15 14:03:30 +08:00
inline void setDuration ( float duration ) { _duration = duration ; }
2012-04-19 14:35:52 +08:00
2013-06-16 03:38:32 +08:00
/** returns a new reversed action */
2013-06-20 14:13:12 +08:00
virtual FiniteTimeAction * reverse ( ) const = 0 ;
2013-06-14 08:25:14 +08:00
/** returns a clone of action */
2013-06-20 14:13:12 +08:00
virtual FiniteTimeAction * clone ( ) const = 0 ;
2013-06-14 08:25:14 +08:00
2012-04-19 14:35:52 +08:00
protected :
//! duration in seconds
2013-06-15 14:03:30 +08:00
float _duration ;
2012-04-19 14:35:52 +08:00
} ;
2013-06-20 14:13:12 +08:00
class ActionInterval ;
class RepeatForever ;
2012-04-19 14:35:52 +08:00
2010-09-28 18:27:33 +08:00
/**
@ brief Changes the speed of an action , making it take longer ( speed > 1 )
2010-07-20 14:42:56 +08:00
or less ( speed < 1 ) time .
Useful to simulate ' slow motion ' or ' fast forward ' effect .
2013-06-20 14:13:12 +08:00
@ warning This action can ' t be Sequenceable because it is not an IntervalAction
2012-04-19 14:35:52 +08:00
*/
2013-06-20 14:13:12 +08:00
class CC_DLL Speed : public Action
2012-04-19 14:35:52 +08:00
{
public :
2013-06-20 14:13:12 +08:00
Speed ( ) ;
virtual ~ Speed ( void ) ;
2012-04-19 14:35:52 +08:00
2013-06-15 14:03:30 +08:00
inline float getSpeed ( void ) { return _speed ; }
2012-04-19 14:35:52 +08:00
/** alter the speed of the inner function in runtime */
2013-06-15 14:03:30 +08:00
inline void setSpeed ( float fSpeed ) { _speed = fSpeed ; }
2012-04-19 14:35:52 +08:00
/** initializes the action */
2013-06-20 14:13:12 +08:00
bool initWithAction ( ActionInterval * pAction , float fSpeed ) ;
2012-04-19 14:35:52 +08:00
2013-06-20 14:13:12 +08:00
virtual Object * copyWithZone ( Zone * pZone ) ;
2013-06-14 08:25:14 +08:00
2013-06-16 03:38:32 +08:00
/** returns a new clone of the action */
2013-06-20 14:13:12 +08:00
virtual Speed * clone ( ) const ;
2013-06-16 03:38:32 +08:00
/** returns a new reversed action */
2013-06-20 14:13:12 +08:00
virtual Speed * reverse ( void ) const ;
2013-06-16 03:38:32 +08:00
2013-06-20 14:13:12 +08:00
virtual void startWithTarget ( Node * pTarget ) ;
2012-04-19 14:35:52 +08:00
virtual void stop ( ) ;
2012-06-08 13:55:28 +08:00
virtual void step ( float dt ) ;
2012-04-19 14:35:52 +08:00
virtual bool isDone ( void ) ;
2013-06-20 14:13:12 +08:00
void setInnerAction ( ActionInterval * pAction ) ;
2012-04-19 14:35:52 +08:00
2013-06-20 14:13:12 +08:00
inline ActionInterval * getInnerAction ( )
2012-04-19 14:35:52 +08:00
{
2013-06-15 14:03:30 +08:00
return _innerAction ;
2012-04-19 14:35:52 +08:00
}
public :
2012-06-14 15:13:16 +08:00
/** create the action */
2013-06-20 14:13:12 +08:00
static Speed * create ( ActionInterval * pAction , float fSpeed ) ;
2012-04-19 14:35:52 +08:00
protected :
2013-06-15 14:03:30 +08:00
float _speed ;
2013-06-20 14:13:12 +08:00
ActionInterval * _innerAction ;
2012-04-19 14:35:52 +08:00
} ;
2010-09-28 18:27:33 +08:00
/**
2013-06-20 14:13:12 +08:00
@ brief Follow is an action that " follows " a node .
2010-09-28 18:27:33 +08:00
Eg :
2013-06-20 14:13:12 +08:00
layer - > runAction ( Follow : : actionWithTarget ( hero ) ) ;
2010-09-28 18:27:33 +08:00
2013-06-20 14:13:12 +08:00
Instead of using Camera as a " follower " , use this action instead .
2010-09-28 18:27:33 +08:00
@ since v0 .99 .2
2012-04-19 14:35:52 +08:00
*/
2013-06-20 14:13:12 +08:00
class CC_DLL Follow : public Action
2012-04-19 14:35:52 +08:00
{
public :
2013-06-20 14:13:12 +08:00
Follow ( )
2013-06-15 14:03:30 +08:00
: _followedNode ( NULL )
, _boundarySet ( false )
, _boundaryFullyCovered ( false )
, _leftBoundary ( 0.0 )
, _rightBoundary ( 0.0 )
, _topBoundary ( 0.0 )
, _bottomBoundary ( 0.0 )
2013-06-20 14:13:12 +08:00
, _worldRect ( RectZero )
2012-04-19 14:35:52 +08:00
{ }
2013-06-20 14:13:12 +08:00
virtual ~ Follow ( void ) ;
2012-04-19 14:35:52 +08:00
2013-06-15 14:03:30 +08:00
inline bool isBoundarySet ( void ) { return _boundarySet ; }
2012-04-19 14:35:52 +08:00
/** alter behavior - turn on/off boundary */
2013-06-15 14:03:30 +08:00
inline void setBoudarySet ( bool bValue ) { _boundarySet = bValue ; }
2012-04-19 14:35:52 +08:00
/** initializes the action with a set boundary */
2013-06-20 14:13:12 +08:00
bool initWithTarget ( Node * pFollowedNode , const Rect & rect = RectZero ) ;
2012-04-19 14:35:52 +08:00
2013-06-20 14:13:12 +08:00
virtual Object * copyWithZone ( Zone * pZone ) ;
2013-06-14 08:25:14 +08:00
/** returns a clone of action */
2013-06-20 14:13:12 +08:00
virtual Follow * clone ( ) const ;
2012-06-08 13:55:28 +08:00
virtual void step ( float dt ) ;
2012-04-19 14:35:52 +08:00
virtual bool isDone ( void ) ;
virtual void stop ( void ) ;
public :
2012-06-14 15:13:16 +08:00
/** creates the action with a set boundary,
2013-06-20 14:13:12 +08:00
It will work with no boundary if @ param rect is equal to RectZero .
2012-06-14 15:13:16 +08:00
*/
2013-06-20 14:13:12 +08:00
static Follow * create ( Node * pFollowedNode , const Rect & rect = RectZero ) ;
2012-04-19 14:35:52 +08:00
protected :
// node to follow
2013-06-20 14:13:12 +08:00
Node * _followedNode ;
2012-04-19 14:35:52 +08:00
// whether camera should be limited to certain area
2013-06-15 14:03:30 +08:00
bool _boundarySet ;
2012-04-19 14:35:52 +08:00
// if screen size is bigger than the boundary - update not needed
2013-06-15 14:03:30 +08:00
bool _boundaryFullyCovered ;
2012-04-19 14:35:52 +08:00
// fast access to the screen dimensions
2013-06-20 14:13:12 +08:00
Point _halfScreenSize ;
Point _fullScreenSize ;
2012-04-19 14:35:52 +08:00
// world boundaries
2013-06-15 14:03:30 +08:00
float _leftBoundary ;
float _rightBoundary ;
float _topBoundary ;
float _bottomBoundary ;
2013-06-20 14:13:12 +08:00
Rect _worldRect ;
2013-06-14 08:25:14 +08:00
2012-04-19 14:35:52 +08:00
} ;
2012-06-20 18:07:27 +08:00
// end of actions group
/// @}
2012-04-19 14:35:52 +08:00
NS_CC_END
# endif // __ACTIONS_CCACTION_H__