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安装包的全链路技术细节, 阅读详情

相关推荐

FeynRules的上手使用3--运行

FeynRules的运行 接上两篇,在我们正确的设定模型参数和拉氏量之后,就可以运行FeynRules来推导费曼规则。 装载文件 首先需要设定FeynRules文件所在位置,并装载FeynRules模块: $FeynRulesPath = SetDirectory[ ] << FeynRules` 接下来是装载写好的模型文件: LoadModel[ < file.fr >, < file2.fr >, … ] 模型文件后缀为".fr",可以分几块构成。模型描述可以写在

cool_bot的博客 1074

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

UniTouch:多模态触觉对齐技术如何重塑零样本跨模态应用

UniTouch模型通过创新的多模态触觉对齐技术,成功将触觉数据映射到通用的视觉-语言嵌入空间,解决了触觉模态的“孤岛困境”。该技术利用对比学习和传感器特定标记,实现了高质量的零样本学习能力,使模型无需额外训练即可完成触觉分类、描述等任务,并能驱动跨模态生成,为机器人、VR和智能制造等领域提供了强大的触觉理解新范式。

weixin_29044713的博客 409

一步教你在 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

西门子S7-200 SMART 实战解析:滑动平均值滤波算法在模拟量信号处理中的应用

本文详细解析了在西门子S7-200 SMART PLC中实现滑动平均值滤波算法的实战应用。通过处理模拟量信号如温度、压力等,该算法有效抑制信号干扰,提升系统稳定性。文章涵盖算法原理、程序框架、信号采集及调试优化,为工业自动化工程师提供实用指南。

gitlab7runner的博客 1152

【eNSP 华为模拟器】小型校园网模拟环境的设计与配置(附eNSP源文件)

【eNSP 华为模拟器】小型校园网模拟环境的设计与配置 一、实验概述 二、交换机的配置 2.1 二层交换机的配置 2.2 三层交换机的配置 三、路由器的配置 四、实验结果 五、实验总结 一、实验概述 按照以下的拓扑连接,自行设计VLAN和IP地址等网络参数,实现PC1到PC2的IP通信。其中,R1,R2为路由器;LSW1,LSW4为3层交换机;LSW2,LSW3 ,LSW6, LSW7为2层交换机;CLIENT1-CLIENT12为PC机。 拓扑图 课程设计要求:(1)IP地址自行规划设计,应该清晰地

qq_43757282的博客 4万+

教你在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

微信小程序URL Link全解析:从生成原理到实战应用(附Java代码)

本文深入解析微信小程序URL Link的生成原理与实战应用。URL Link是微信官方提供的智能路由协议,通过中间页实现外部链接安全跳转至小程序指定页面。文章详细阐述了其权限模型、环境版本差异及跳转机制,并提供了包含令牌管理、异常处理和性能优化的健壮Java实现方案,助力开发者构建高可用的链接生成服务。

weixin_29327525的博客 1216

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

大模型训练(1):流水线并行

Gpipe的方法是,在训练时计算和运用的是micro-batch里的均值和方差,但同时持续追踪全部mini-batch的移动平均和方差,以便在测试阶段进行使用。流水线并行的核心思想是:在模型并行的基础上,进一步引入数据并行的办法,即把原先的数据再划分成若干个更小的batch,分批送入GPU进行训练,算一部分就让下一个GPU动起来。从实验结果可知,在关掉NVlinks的情况下,Gpipe一样也能实现随着GPU数量的增加,训练速度也增加的效果。前文说过,随着模型的增加,每块GPU中存储的中间结果也会越大。

呆呆象呆呆的博客 1968

小龙虾们的好伙伴专栏导航

本文系统解析了OpenClaw技术架构,包括Channel层和网关层的设计实现,并与AgentSkills等技术方案进行对比。同时提供了OpenClaw的系列实用指南,涵盖小龙虾培养、客户资源管理、系统自动化巡检以及技术趋势助手构建等应用场景,帮助用户从零成本入门到高效落地应用,实现业务全流程自动化管理。

wend的博客 211

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

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

4645

人工智能---什么是Transformer?

Transformer是一种强大的神经网络架构,最初由Google的研究人员在论文《Attention is All You Need》中提出,用于自然语言处理任务,特别是在机器翻译方面取得了巨大成功。Transformer的核心思想是完全基于自注意力机制(self-attention mechanism)来实现序列到序列(sequence-to-sequence)的学习。它在自然语言处理(NLP)和其他序列到序列任务中表现出色,逐渐成为该领域的主流模型。近些年也逐渐在自动驾驶领域有所应用。

智能汽车人的博客 3955

Tween算法的深入分析

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

4074

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

Mysssone的博客 189

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【算法拾光】链表 哈希表|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

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 194

算法日常・每日刷题--<动态规划>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
上一篇: 教你在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、付费专栏及课程。

余额充值