Cocos2d-x移植的Tween算法

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

时间:3/14/2012

平台:xcode 4.2 + cocos2d-x  *.11.0 

首先说明,cocos2d-x已经有实现这些算法了,本人只是出于兴趣动手实现下

不知道tween算法的朋友看看这个:

原文链接:http://www.cnblogs.com/cloudgamer/archive/2009/01/06/Tween.html

Tween又称为补间动画或中间动画;

上图:



//
//  CCTween.h
//  cocos2dUI_b
//
//  Created by rorger on 12-3-12.
//  Copyright 2012年 __MyCompanyName__. All rights reserved.
//

/*
 find more information here:http://www.robertpenner.com/easing/
 http://www.cnblogs.com/cloudgamer/archive/2009/01/06/Tween.html
 */
#ifndef cocos2dUI_b_CCTween_h
#define cocos2dUI_b_CCTween_h
#include "cocos2d.h"
#include "platform.h"
USING_NS_CC;
typedef enum {
    CCTweenLinear,
    CCTweenQuadratic,
    CCTweenCubic,
    CCTweenQuartic,
    CCTweenQuintic,
    CCTweenSinusoidal,
    CCTweenExponential,
    CCTweenCircular,
    CCTweenElastic,
    CCTweenBack,
    CCTweenBounce
}CCTweenType;

typedef enum{
    CCTweenEaseIn,
    CCTweenEaseOut,
    CCTweenEaseInOut
}CCTweenEaseType;
 
//Linear,Quadratic,Cubic,Quartic,Quintic,Sinusoidal,Exponential,Circular,Elastic,Back,Bounce
class CCTween {
public:
    CCTween(CCTweenType type,CCTweenEaseType easeType);
    virtual bool init();
    virtual ~CCTween();

    static CCTween* tweenWithTypeEaseType(CCTweenType type,CCTweenEaseType easeType);
    CGFloat Tween(CGFloat time, CGFloat beginValue, CGFloat changeValue, CGFloat duration, CGFloat a=0, CGFloat p=0, CGFloat s=0);
    CGFloat Linear(CGFloat time, CGFloat beginValue, CGFloat changeValue, CGFloat duration);
    
    CGFloat Quadratic(CGFloat time, CGFloat beginValue, CGFloat changeValue, CGFloat duration);
    CGFloat QuadraticIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat QuadraticOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat QuadraticInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    
    CGFloat Cubic(CGFloat time, CGFloat beginValue, CGFloat changeValue, CGFloat duration);
    CGFloat CubicIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat CubicOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat CubicInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    
    CGFloat Quartic(CGFloat time, CGFloat beginValue, CGFloat changeValue, CGFloat duration);
    CGFloat QuarticIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat QuarticOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat QuarticInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    
    CGFloat Quintic(CGFloat time, CGFloat beginValue, CGFloat changeValue, CGFloat duration);
    CGFloat QuinticIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat QuinticOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat QuinticInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    
    CGFloat Sinusoidal(CGFloat time, CGFloat beginValue, CGFloat changeValue, CGFloat duration);
    CGFloat SinusoidalIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat SinusoidalOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat SinusoidalInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    
    CGFloat Exponential(CGFloat time, CGFloat beginValue, CGFloat changeValue, CGFloat duration);
    CGFloat ExponentialIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat ExponentialOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat ExponentialInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    
    CGFloat Circular(CGFloat time, CGFloat beginValue, CGFloat changeValue, CGFloat duration);
    CGFloat CircularIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat CircularOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat CircularInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    
    CGFloat Elastic(CGFloat time, CGFloat beginValue, CGFloat changeValue, CGFloat duration, CGFloat a, CGFloat p);
    CGFloat ElasticIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat a, CGFloat p);
    CGFloat ElasticOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat a, CGFloat p);
    CGFloat ElasticInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat a, CGFloat p);
    
    CGFloat Back(CGFloat time, CGFloat beginValue, CGFloat changeValue, CGFloat duration, CGFloat s);
    CGFloat BackIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat s);
    CGFloat BackOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat s);
    CGFloat BackInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat s);
    
    CGFloat Bounce(CGFloat time, CGFloat beginValue, CGFloat changeValue, CGFloat duration);
    CGFloat BounceIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat BounceOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
    CGFloat BounceInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d);
     
public:
    CC_SYNTHESIZE(CCTweenEaseType, tweenEaseType, TweenEaseType);
    CC_SYNTHESIZE(CCTweenType, tweenType, TweenType);
};
#endif
//
//  CCTween.cpp
//  cocos2dUI_b
//
//  Created by rorger on 12-3-12.
//  Copyright 2012年 __MyCompanyName__. All rights reserved.
//

#include "CCTween.h"
#include "math.h"

#define pi acos(-1.0)

CCTween::CCTween(CCTweenType type,CCTweenEaseType easeType){
    this->tweenType = type;
    this->tweenEaseType = easeType;
}

bool CCTween::init(){
    return true;
}

CCTween* CCTween::tweenWithTypeEaseType(CCTweenType type,CCTweenEaseType easeType){
    CCTween * pRet = new CCTween(type,easeType);
    if (pRet && pRet->init()) {
        return pRet;
    }
    return NULL;
}

CCTween::~CCTween(){
    
}

CGFloat CCTween::Linear(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return c * (t / d) + b; 
    
}

CGFloat CCTween::Quadratic(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    CGFloat result=0;
    switch (tweenEaseType) {
        case CCTweenEaseIn:
            result = QuadraticIn(t, b, c, d);
            break;
        case CCTweenEaseOut:
            result = QuadraticOut(t, b, c, d);
            break;
        case CCTweenEaseInOut:
            result = QuadraticInOut(t, b, c, d);
            break;
        default:
            CCLog("Error Happen! CCTweenEaseType not set yet\n");
            break;
    }
    return result;
}

CGFloat CCTween::QuadraticIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return c * (t /= d) * t + b;
}
CGFloat CCTween::QuadraticOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return -c * (t /= d) * (t - 2) + b;
}
CGFloat CCTween::QuadraticInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    if ((t /= (d/2)) < 1) 
        return c / 2 * t * t + b;
    else
        return -c / 2 * ((--t) * (t - 2) -1) + b;
}

CGFloat CCTween::Cubic(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    CGFloat result = 0;
    switch (tweenEaseType) {
        case CCTweenEaseIn:
            result = CubicIn(t, b, c, d);
            break;
        case CCTweenEaseOut:
            result = CubicOut(t, b, c, d);
            break;
        case CCTweenEaseInOut:
            result = CubicInOut(t, b, c, d); 
            break;
        default:
            CCLog("Error Happen! CCTweenEaseType not set yet\n");
            break;
    }
    return result;
}
CGFloat CCTween::CubicIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return c * (t /= d) * t * t + b;
}

CGFloat CCTween::CubicOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
      return c*((t=t/d-1)*t*t + 1) + b;
}

CGFloat CCTween::CubicInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    if ((t/=d/2) < 1) return -c/2 * ( sqrt(1 - t*t) - 1) + b;
    return c/2 * ( sqrt(1 - (t-=2)*t) + 1) + b;
}


CGFloat CCTween::Quartic(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    CGFloat result = 0;
    switch (tweenEaseType) {
        case CCTweenEaseIn:
            result = QuarticIn(t, b, c, d); 
            break;
        case CCTweenEaseOut:
            result = QuarticOut(t, b, c, d); 
            break;
        case CCTweenEaseInOut:
            result = QuarticInOut(t, b, c, d); 
            break;
        default:
            CCLog("Error Happen! CCTweenEaseType not set yet\n");
            break;
    }
    return result;
}
CGFloat CCTween::QuarticIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return c * (t /= d) * t * t * t + b;
}

CGFloat CCTween::QuarticOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return -c * ((t=t/d-1)*t*t*t - 1) + b;
}

CGFloat CCTween::QuarticInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    if ((t /= (d/2)) < 1) 
        return c / 2 * t * t * t *t + b;
    else
        return -c / 2 * ((t -= 2) * t * t *t - 2)+ b;
}



CGFloat CCTween::Quintic(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    CGFloat result = 0;
    switch (tweenEaseType) {
        case CCTweenEaseIn:
            result = QuinticIn(t, b, c, d);
            break;
        case CCTweenEaseOut:
            result = QuinticOut(t, b, c, d);
            break;
        case CCTweenEaseInOut:
            result = QuinticInOut(t, b, c, d);
            break;
        default:
            CCLog("Error Happen! CCTweenEaseType not set yet\n");
            break;
    }
    return result;
}
CGFloat CCTween::QuinticIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return c * (t /= d) * t * t * t * t + b;
}

CGFloat CCTween::QuinticOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return c * ((t= t/d-1) * t * t *t * t + 1)+ b;
}

CGFloat CCTween::QuinticInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    if ((t /= (d/2)) < 1) 
        return c / 2 * t * t * t *t * t + b;
    else
        return c / 2 * ((t -= 2) * t * t *t * t+ 2)+ b;
}



CGFloat CCTween::Sinusoidal(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    CGFloat result = 0;
    switch (tweenEaseType) {
        case CCTweenEaseIn:
            result = SinusoidalIn(t, b, c, d);
            break;
        case CCTweenEaseOut:
            result = SinusoidalOut(t, b, c, d);
            break;
        case CCTweenEaseInOut:
            result = SinusoidalInOut(t, b, c, d);
            break;
        default:
            CCLog("Error Happen! CCTweenEaseType not set yet\n");
            break;
    }
    return result;
}
CGFloat CCTween::SinusoidalIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return -c * cos(t/d * (pi/2)) + c + b;
}

CGFloat CCTween::SinusoidalOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return c * sin(t/d * (pi/2)) + b;
}

CGFloat CCTween::SinusoidalInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return -c/2 * (cos(pi*t/d) - 1) + b;
}


CGFloat CCTween::Exponential(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    CGFloat result = 0;
    switch (tweenEaseType) {
        case CCTweenEaseIn:
            result = ExponentialIn(t, b, c, d);
            break;
        case CCTweenEaseOut:
            result = ExponentialOut(t, b, c, d);
            break;
        case CCTweenEaseInOut:
            result = ExponentialInOut(t, b, c, d);
            break;
        default:
            CCLog("Error Happen! CCTweenEaseType not set yet\n");
            break;
    }
    return result;
}
CGFloat CCTween::ExponentialIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return (t==0) ? b : c * pow(2, 10 * (t/d - 1)) + b;
}

CGFloat CCTween::ExponentialOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return (t==d) ? b+c : c * (-pow(2, -10 * t/d) + 1) + b;
}

CGFloat CCTween::ExponentialInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    if (t==0) return b;
	if (t==d) return b+c;
	if ((t/=d/2) < 1) return c/2 * pow(2, 10 * (t - 1)) + b;
    return c/2 * (- pow(2, -10 * --t) + 2) + b;
}

CGFloat CCTween::Circular(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    CGFloat result = 0;
    switch (tweenEaseType) {
        case CCTweenEaseIn:
            result = CircularIn(t, b, c, d);
            break;
        case CCTweenEaseOut:
            result = CircularOut(t, b, c, d);
            break;
        case CCTweenEaseInOut:
            result = CircularInOut(t, b, c, d);
			break;
        default:
            CCLog("Error Happen! CCTweenEaseType not set yet\n");
            break;
    }
    return result;
}
CGFloat CCTween::CircularIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return -c * (sqrt(1 - (t/=d)*t) - 1) + b;
}

CGFloat CCTween::CircularOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return c * sqrt(1 - (t=t/d-1)*t) + b;
}

CGFloat CCTween::CircularInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    if ((t /= (d/2)) < 1) 
		return -c/2 * (sqrt(1 - t*t) - 1) + b;
    else
        return c/2 * (sqrt(1 - (t-=2)*t) + 1) + b;
}



CGFloat CCTween::Elastic(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat a, CGFloat p){
    CGFloat result = 0;
    switch (tweenEaseType) {
        case CCTweenEaseIn: 
            result = ElasticIn(t, b, c, d, a, p); 
            break;
        case CCTweenEaseOut: 
            result = ElasticOut(t, b, c, d, a, p); 
            break;
        case CCTweenEaseInOut: 
            result = ElasticInOut(t, b, c, d, a, p); 
            break;
        default:
            CCLog("Error Happen! CCTweenEaseType not set yet\n");
            break;
    }
    return result;
}
CGFloat CCTween::ElasticIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat a, CGFloat p){
    if (t==0) return b;  
    if ((t/=d)==1) return b+c; 
    if (!p) p=d*.3;
    CGFloat s;
	if (!a || a < fabs(c)) {
		a=c;   s=p/4; 
	}
	else 
        s = p/(2*pi) * asin(c/a);
	return -(a*pow(2,10*(t-=1)) * sin( (t*d-s)*(2*pi)/p)) + b;
}

CGFloat CCTween::ElasticOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat a, CGFloat p){
    if (t==0) return b;  
    if ((t/=d)==1) return b+c;
    if (!p) p=d*.3;
    CGFloat s;
	if (!a || a < fabs(c)){
        a=c;   s=p/4;
    }
	else   s = p/(2* pi) * asin (c/a);
	return  (a*pow(2,-10*t) * sin( (t*d-s)*(2*pi)/p ) + c + b);
}

CGFloat CCTween::ElasticInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat a, CGFloat p){
    if (t==0) return b;
    if ((t/=d/2)==2) return b+c;
    if (!p) p=d*(.3*1.5);
    CGFloat s;
	if (!a || a < fabs(c)) {
        a=c;   s=p/4;
    }
	else   s = p/(2*pi) * asin (c/a);
	if (t < 1) 
		return -.5*(a*pow(2,10*(t-=1)) * sin( (t*d-s)*(2*pi)/p )) + b;
	else 
		return a*pow(2,-10*(t-=1)) * sin( (t*d-s)*(2*pi)/p )*.5 + c + b;
}


CGFloat CCTween::Back(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat s){//s==-1 as undefined.
    CGFloat result = 0;
    switch (tweenEaseType) {
        case CCTweenEaseIn: 
            result = BackIn(t, b, c, d, s); 
            break;
        case CCTweenEaseOut: 
            result = BackOut(t, b, c, d, s); 
            break;
        case CCTweenEaseInOut: 
            result = BackInOut(t, b, c, d, s); 
            break;
        default:
            CCLog("Error Happen! CCTweenEaseType not set yet\n");
            break;
    }
    return result;
}
CGFloat CCTween::BackIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat s){
	if (s == 0) s = 1.70158; // if s undefined
    return  c*(t/=d)*t*((s+1)*t - s) + b;
}

CGFloat CCTween::BackOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat s){
    if (s == 0) s = 1.70158; // if s undefined
	return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
}

CGFloat CCTween::BackInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat s){
    if (s == 0) s = 1.70158; // if s undefined
	if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
	return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
}


CGFloat CCTween::Bounce(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    CGFloat result = 0;
    switch (tweenEaseType) {
        case CCTweenEaseIn:
            result = BounceIn(t, b, c, d);
            break;
        case CCTweenEaseOut:
            result = BounceOut(t, b, c, d);
            break;
        case CCTweenEaseInOut: 
            result = BounceInOut(t, b, c, d);
            break;
        default:
            break;
    }
    return result;
}
CGFloat CCTween::BounceIn(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    return c- BounceOut(d-t, 0, c, d) + b;
}

CGFloat CCTween::BounceOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    if ((t/=d) < (1/2.75)) {
        return c*(7.5625*t*t) + b;
    } else if (t < (2/2.75)) {
        return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
    } else if (t < (2.5/2.75)) {
        return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
    } else {
        return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
    }
}

CGFloat CCTween::BounceInOut(CGFloat t, CGFloat b, CGFloat c, CGFloat d){
    if (t < d/2) return BounceIn(t*2, 0, c, d) * .5 + b;
    else return BounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b;
}

CGFloat CCTween::Tween(CGFloat t, CGFloat b, CGFloat c, CGFloat d, CGFloat a, CGFloat p , CGFloat s ){
    CGFloat result = 0 ;
    switch (tweenType) {
        case CCTweenLinear:
            result = Linear(t, b, c, d);
            break;
        case CCTweenQuadratic:
            result = Quadratic(t, b, c, d);
            break;
        case CCTweenCubic:
            result = Cubic(t, b, c, d);
            break;
        case CCTweenQuartic:
            result = Quartic(t, b, c, d);
            break;
        case CCTweenQuintic:
            result = Quintic(t, b, c, d);
            break;
        case CCTweenSinusoidal:
            result = Sinusoidal(t, b, c, d);
            break;
        case CCTweenExponential:
            result = Exponential(t, b, c, d);
            break;
        case CCTweenCircular:
            result = Circular(t, b, c, d);
            break;
        case CCTweenElastic:
            result = Elastic(t, b, c, d, a, p);
            break;
        case CCTweenBack:
            result = Back(t, b, c, d, s);
            break;
        case CCTweenBounce:
            result = Bounce(t,b,c,d);
            break;
            
        default:
            CCLog("Error! CCTweenType not set! In CCTween::Tween\n");
            break;
    }
    return result;
}



算法翻译完毕,写个test程序测试:

//
//  CCTweenTest.h
//  cocos2dUI_b
//
//  Created by rorger on 12-3-13.
//  Copyright 2012年 __MyCompanyName__. All rights reserved.
//

#ifndef cocos2dUI_b_CCTweenTest_h
#define cocos2dUI_b_CCTweenTest_h
#include "cocos2d.h"
#include "CCTween.h"
USING_NS_CC;
 
class CCTweenTest:public CCLayerColor{
public:
    CCTweenTest();
    virtual bool init();
    virtual void draw();
    virtual void visit();
    virtual void customVisit();
    virtual void menuEaseChoice(CCObject *pSender);
    virtual void menuTweenChoice(CCObject *pSender);
    virtual void menuCallBack(CCObject* pSender);
    virtual void beginRun();
    virtual void run(ccTime dt);
    CC_SYNTHESIZE(CCLayerColor*, fooLayer, FooLayer)
    CC_SYNTHESIZE(CCLayerColor*, barLayer, BarLayer)
    CC_SYNTHESIZE(CCLayerColor*, fooUnitLayer, FooUnitLayer)
    CC_SYNTHESIZE(CCLayerColor*, barLineLayer, BarLineLayer)
    CC_SYNTHESIZE(CCTween*, tween, Tween)
    
private:
    CGFloat t;
    CGFloat duration;
    bool isInitDone;
    CCMenuItemFont *menuItemRun;
};


#endif

//
//  CCTweenTest.cpp
//  cocos2dUI_b
//
//  Created by rorger on 12-3-13.
//  Copyright 2012年 __MyCompanyName__. All rights reserved.
//
#include "cocos2d.h"
#include "CCTweenTest.h"
#include "CCTween.h"
 
#define kSelectedColor  ccc3((GLubyte)(120),(GLubyte)(20),(GLubyte)(20))
#define kDisSelectedColor  ccc3((GLubyte)255, (GLubyte)255, (GLubyte)255) 
#define kSoftGreenColor ccc4(120, 150, 20,120)
#define kBarLayerHeight 140
#define kBarLayerBaseX 20
#define kBarLayerBaseY 30
#define kFooLayerBaseX 20
#define kFooLayerBaseY 260
#define kSlower 100
#define kFaster 50
USING_NS_CC;

CCTweenTest:: CCTweenTest(){
    isInitDone = false;
    tween = CCTween::tweenWithTypeEaseType(CCTweenLinear , CCTweenEaseIn);
}

bool CCTweenTest::init(){    
    fooLayer = CCLayerColor::layerWithColorWidthHeight(ccc4(120, 120, 120, 255), 400, 40);
    fooUnitLayer = CCLayerColor::layerWithColorWidthHeight(kSoftGreenColor, 40, 40);
    barLayer = CCLayerColor::layerWithColorWidthHeight(ccc4(120, 120,  120, 255), 300, kBarLayerHeight);
    barLineLayer = CCLayerColor::layerWithColorWidthHeight(kSoftGreenColor, 1, kBarLayerHeight);
    
    fooLayer->setAnchorPoint(ccp(0,0));
    fooUnitLayer->setAnchorPoint(ccp(0 ,0));
    barLayer->setAnchorPoint(ccp(0,0));
    barLineLayer->setAnchorPoint(ccp(0,0));
    
    fooLayer->setPosition(ccp(kFooLayerBaseX,kFooLayerBaseY));
    fooUnitLayer->setPosition(ccp(kFooLayerBaseX,260));
    barLayer->setPosition(ccp(kBarLayerBaseX,kBarLayerBaseY));
    barLineLayer->setPosition(ccp(kBarLayerBaseX,kBarLayerBaseY));
    this->addChild(fooLayer);
    this->addChild(fooUnitLayer);
    this->addChild(barLayer);
    this->addChild(barLineLayer);
    CCLayerColor *menuLayer1 = layerWithColorWidthHeight(ccc4(120, 120, 120, 120), 100, 60);
    CCLayerColor *menuLayer2 = layerWithColorWidthHeight(ccc4(120, 120, 120, 120), 100, 210);
    CCLayerColor *menuLayer3 = layerWithColorWidthHeight(ccc4(120, 120, 120, 120), 160,20);
    
    menuLayer1->setAnchorPoint(ccp(0,0));
    menuLayer2->setAnchorPoint(ccp(0,0));
    menuLayer1->setPosition(ccp(220,180));
    menuLayer2->setPosition(ccp(340,30));
    menuLayer3->setPosition(ccp(20,200));
    this->addChild(menuLayer1);
    this->addChild(menuLayer2);
    this->addChild(menuLayer3);
    
    CCMenuItemFont::setFontSize(16);
    char menuArray1[3][100]={"EaseIn", "EaseOut", "EaseInOut"};
    CCMenu * menu1 = CCMenu::menuWithItems(NULL);
    menu1->setPosition(CCPointZero);
    menuLayer1->addChild(menu1);
    for (int i=2; i>=0; i--) {
        CCMenuItemFont *menuEaseItem = CCMenuItemFont::itemFromString(menuArray1[2-i], this,
                                                                      menu_selector(CCTweenTest::menuEaseChoice));
        menuEaseItem->setTag(2-i);
        menuEaseItem->setAnchorPoint(ccp(0,0));
        menuEaseItem->setPosition(ccp(10,i*(int)(menuLayer1->getContentSize().height/3)));
        menu1->addChild(menuEaseItem, 0);
        if (i==2) {
            menuEaseItem->setColor(kSelectedColor);
        }
    }
     
    char menuArray2[11][100]={"Linear",   "Quadratic",  "Cubic",       "Quartic",
                              "Quintic",  "Sinusoidal", "Exponential", "Circular",
                              "Elastic",  "Back",       "Bounce"};
    CCMenuItemFont::setFontSize(16);
    CCMenu * menu2 = CCMenu::menuWithItems(NULL);
    menu2->setPosition(CCPointZero);
    menuLayer2->addChild(menu2);
    for (int i=10; i>=0; i--) {
        CCMenuItemFont *menuItem = CCMenuItemFont::itemFromString(menuArray2[10-i], this,
                                                                  menu_selector(CCTweenTest::menuTweenChoice));
        menuItem->setAnchorPoint(ccp(0,0));
        menuItem->setTag(10-i);
        menuItem->setPosition(ccp(10, i*(int)(menuLayer2->getContentSize().height/11)));
        menu2->addChild(menuItem,0);
        if (i==10) {
            menuItem->setColor(kSelectedColor);
        }
    }
    
    char menuArray3[3][100]={"Faster","Slower","Run"};
    CCMenuItemFont::setFontSize(16);
    CCMenu * menu3 = CCMenu::menuWithItems(NULL);
    menu3->setPosition(CCPointZero);
    menuLayer3->addChild(menu3);
    this->duration = kSlower;
    for (int i=0; i<=2; i++) {
        CCMenuItemFont *menuItem = CCMenuItemFont::itemFromString(menuArray3[i], this,
                                                                  menu_selector(CCTweenTest::menuCallBack));
        menuItem->setAnchorPoint(ccp(0,0));
        menuItem->setTag(i);
        menuItem->setPosition(ccp(i*(int)(menuLayer3->getContentSize().width/3)+10,0));
        menu3->addChild(menuItem,0);
        if (i==1) {
            menuItem->setColor(kSelectedColor);
        }
        if (i==2) {
            this->menuItemRun = menuItem;
        }
    }
    isInitDone = true;
    return isInitDone;
}

void CCTweenTest::menuEaseChoice(CCObject *pSender){
   
    CCMenuItemFont* menuItem = (CCMenuItemFont*)pSender;
    CCLog("Previous EaseType:%d \n", this->tween->getTweenEaseType());
    switch (menuItem->getTag()) {
        case 0:
            this->tween->setTweenEaseType(CCTweenEaseIn);
            break;
        case 1:
            this->tween->setTweenEaseType(CCTweenEaseOut);
            break;
        case 2:
            this->tween->setTweenEaseType(CCTweenEaseInOut);
            break;
        default:
            break;
    }
    printf("Current EaseType :%d\n",menuItem->getTag());
    //set the color of selected menu
    for (int i=0; i<3; i++) {
        CCMenuItemFont *item = (CCMenuItemFont*)menuItem->getParent()->getChildByTag(i);
        item->setColor(kDisSelectedColor);
    }
    menuItem->setColor(kSelectedColor);
}

void CCTweenTest::menuTweenChoice(CCObject *pSender){
 
    CCMenuItemFont* menuItem = (CCMenuItemFont*)pSender;
    printf("Previous TweenType:%d \n", this->tween->getTweenType());
    
    this->tween->setTweenType((CCTweenType)menuItem->getTag());
    printf("Current TweenType :%d\n",menuItem->getTag());
    //set the color of selected menu
    for (int i=0; i<11; i++) {
        CCMenuItemFont *item = (CCMenuItemFont*)menuItem->getParent()->getChildByTag(i);
        item->setColor(kDisSelectedColor);
    }
    menuItem->setColor(kSelectedColor);
}

void CCTweenTest::menuCallBack(CCObject* pSender){
 
    CCMenuItemFont* menuItem = (CCMenuItemFont*)pSender;
    switch (menuItem->getTag()) {
        case 0:{
            CCMenuItemFont* menuItemD =(CCMenuItemFont*)menuItem->getParent()->getChildByTag(1);
            menuItem->setColor(kSelectedColor);
            menuItemD->setColor(kDisSelectedColor);
            this->duration = kFaster;
        }
            break;
        case 1:{
            CCMenuItemFont* menuItemD =(CCMenuItemFont*)menuItem->getParent()->getChildByTag(0);
            menuItem->setColor(kSelectedColor);
            menuItemD->setColor(kDisSelectedColor);
            this->duration = kSlower;
        }
            break;
        case 2:{
            printf("Running....\n");
            this->beginRun();
        }
            break;
        default:
            break;
    }
}


void CCTweenTest::customVisit(){
    if (!isInitDone) {
        CCLog("Not init  yet!\n");
        return;
    }
    
    CGFloat x=0,y=0;
    for (x=0; x<300; x++) {
        y = tween->Tween(x, 0, kBarLayerHeight, 300);
        ccDrawPoint(ccp(x + kBarLayerBaseX, y + kBarLayerBaseY)); 
    }

}

void CCTweenTest::visit(){
    CCLayerColor::visit();
    customVisit();
}

void CCTweenTest::draw(){
    CCLayerColor::draw();
}

void CCTweenTest::beginRun(){
    this->t=0;
    this->menuItemRun->setIsEnabled(false);
    this->schedule(schedule_selector(CCTweenTest::run), 0.01);
}

void CCTweenTest::run(ccTime dt){
    CGFloat  x=0;
    if (this->t <= this->duration) {
        x = tween->Tween(this->t, kFooLayerBaseX, 360, this->duration);
        this->fooUnitLayer->setPosition(ccp(x,kFooLayerBaseY));
        this->barLineLayer->setPosition(ccp(300 * (t/duration) + kBarLayerBaseX, kBarLayerBaseY));
        this->t++;
    }
    else{
        this->unschedule(schedule_selector(CCTweenTest::run));
        this->t=0;
        this->menuItemRun->setIsEnabled(true);
    }
}










说一下注意点:不要随便用autorelease, 如果使用了,则必须retain一次,不管在哪个函数中,必须调用一次。

ps:3.17发现一个bug,在Quintic算法中,switch语句少了一个break语句,已经纠正,另外,在win32平台下,不知道为什么,开始run之后,visit方法中的绘图颜色开始变得暗淡。后来直接在 customvisit方法中加入 glColor4ub (255,255,255,255); 搞定。

Cocos Creator v2.0安卓真机部署实战指南 Cocos Creator 是一款面向2D游戏开发的跨平台引擎,其v2.0版本因轻量、稳定和成熟安卓构建链路,仍被大量中小团队用于维护与交付。理解v2.0在Android平台的底层构建原理——包括Gradle配置约束、AndroidManifest.xml关键字段、AssetManager资源生命周期、AudioTrack音频缓冲调控及SurfaceFlinger帧级调试——是突破‘编辑器能跑、真机崩溃’交付断层的核心能力。本文聚焦v2.0.10稳定子版本,系统拆解从JS逻辑到APK安装包的全链路技术细节, 阅读详情

相关推荐

【ERROR】ERROR1: PROJ: proj_create_from_database: Cannot find proj.db - 环境变量配置与路径修复指南

本文详细解析了地理空间数据处理中常见的【ERROR】ERROR1: PROJ: proj_create_from_database: Cannot find proj.db 错误。该错误的根源是PROJ库无法定位其核心数据文件proj.db。文章提供了从问题诊断到修复的完整指南,包括如何在不同系统(Windows/macOS/Linux)和安装方式(Conda/pip/源码编译)下找到正确的proj.db文件路径,并通过设置PROJ_LIB环境变量(临时、代码内或永久)彻底解决问题,同时给出了进阶排查技巧和

m2n3o4p5的博客 557

cocos2d-x 取得资源的路径的函数

2012.4.10 平台:vs2010, cocos2d-x, win7 32   CCLog("%s",CCFileUtils::getWriteablePath().c_str()); CCLog("%s", CCFileUtils::fullPathFromRelativePath("")); CCLog("%s",CCFileUtils::fullPathFromRelative

9404

SPSS(二)SPSS实现多因素方差分析模型(图文教程+数据集)

SPSS(二)SPSS实现多因素方差分析模型 单因素方差分析上一篇博客https://blog.youkuaiyun.com/LuYi_WeiLin/article/details/89917656已经介绍完毕 这篇博客我们主要来学习多因素方差分析 多因素方差分析,就是同时考虑若干个控制因素的情况下,分别分析它们的改变是否造成观察变量的显著变动 (多个自变量,一个因变量)自变量类型以分类变量为主也可以...

可乐联盟 6万+

一步教你在 cocos2d-x 中使用 tinyxml读取Resource中xml文件的信息

时间: 2012.4.10 平台: vs2010, cocos2d-x *.12.* , tinyxml:2.6.2 其中:tinyxml 下载:http://sourceforge.net/projects/tinyxml/files/ tinyxml相关网页: www.sourceforge.net/projects/tinyxml Original code by Lee Thom

6561

ubuntu22.04 安装部署 openclaw

ubuntu22.04 安装部署 openclaw

nalanxiaoxiao2011的博客 973

R语言实战:非正态数据下的Scheirer–Ray–Hare检验全流程解析

本文详细解析了在R语言中执行Scheirer–Ray–Hare检验的全流程。当数据不满足正态分布假设时,该非参数检验是传统双因素方差分析的有效替代方案。文章从原理、R环境配置、数据准备、代码实现、结果解读到事后比较与可视化,提供了完整的实战指南,帮助研究者稳健地分析多因素实验设计中的主效应和交互效应。

cc789的博客 406

教你在vs2010下输出cocos2d-x的调试信息

上次在xcode下,使用printf直接在调试窗口可以看到输出的信息,在vs2010中没有看到,于是查看了源代码,找到函数CCLog void CCLog(const char * pszFormat, ...) { char szBuf[MAX_LEN]; va_list ap; va_start(ap, pszFormat); vsnprintf_s(szB

6336

高通8155车机系统里,安卓和QNX是怎么‘打电话’的?聊聊HAB通信框架那些事

本文深入解析了高通8155车机系统中HAB通信框架如何实现安卓与QNX的高效协同。作为异构系统的通信桥梁,HAB通过共享内存和中断信号机制,在多媒体数据传输中展现出零拷贝、硬件加速等优势,成为智能座舱实现实时性与生态丰富性平衡的关键技术。

weixin_42715608的博客 381

cocos2d-x 如何自定义简单的scrollView/scrollLayer

时间:3-9 平台:xcode4.2 cocos2d-x *.11.* 说明:简单的实现scrollView,没有加速减速功能,没有进度条。 上图: // // CCUIScrollView.h // cocos2dUI // // Created by rorger on 12-3-7. contact me:jhcyd112@163.com // Cop

5386

【TensorRT】TensorRT C# API 项目介绍:基于C#与TensorRT部署深度学习模型(上篇)

开发了TensorRT C# API 2.0版本,该版本在开发时充分考虑了上一版本应用时出现的问题,并进行了改进。同时在本版本中,我们对接口进行了优化,使用起来更加简单,并同时提供了相关的应用案例,方便开发者进行使用。

grape_yan的博客 3038

手把手教你用Ubuntu Desktop搭建个人L2TP服务器,手机电脑都能连(Network Manager配置详解)

本文详细介绍了在Ubuntu Desktop上使用Network Manager图形化配置L2TP服务器的方法,实现手机、电脑等多设备安全连接。从环境准备、图形界面设置到各平台客户端配置,提供一站式解决方案,并包含常见问题排查与安全增强措施,帮助用户快速搭建个人远程访问网络。

weixin_30555125的博客 119

cocos2d-x中CCLayer捕捉触摸消息和坐标转换以及窗口剪裁

时间:2012.3.5 平台:xcode4.0,cocos2d-x 测试坐标和触摸消息 先了解下基本概念(不足请指正): 坐标转换主要就4个函数:         CCPointconvertToNodeSpace(const CCPoint& worldPoint);         CCPointconvertToWorldSpace(const CCPoint& nodePo

4645

DP83869HM的LWIP性能测试

E:/Xilinx/Vitis/2021.1/data/embeddedsw/ThirdParty/sw_services/lwip211_v2_0/src/contrib/ports/xilinx/netif/xemacpsif_physpeed.c文件中的。然后phy_setup_emacps中调用get_IEEE_phy_speed函数,根据PHY的ID判断出Marvell或TI或Realtek的PHY,调用对应的网速自动协商函数get_TI_phy_speed,该函数中的部分配置需要注释。

FPGA艺术家的博客 355

Tween算法的深入分析

Tween算法:http://www.robertpenner.com/easing/ 这里有文档。 我们来深入解析下Tween算法公式吧,庖丁解牛 开始之前,必须了解下一些知识: 函数关于点或者直线对称方法 来自百度百科。 http://zhidao.baidu.com/question/114652008.html http://zhidao.baidu.com/question/

4074

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

vs2010+win7+cocos2d-1.0.1-x-0.12.0配置 *三步骤*

时间:3/11/2012 平台:vs2010+win7+cocos2d-1.0.1-x-0.12.0 第一步:下载 下载cocos2d-x:        http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download        我放在e盘根目录,解压,解压后目录是:E:\cocos2d-1.0.1-x-0.12.0 第二步:

1925

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 189

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 287

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 559

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 19

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 645

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 367

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 170

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 81

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 177

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 318
上一篇: 教你在vs2010下输出cocos2d-x的调试信息
下一篇: Tween算法的深入分析
rorger
博客等级 码龄16年 62粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值