原文地址:http://blog.csdn.net/toss156/article/details/7439769】
今天给大家带来一个模仿捕鱼达人中,金币的滚动显示。(部分代码参考了cocoachina上一个C++版的)
- //
- // UiNumRoll.h
- // WheelScore
- //
- // Created by 周海锋 on 12-4-8.
- // Copyright 2012年 CJLU. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "cocos2d.h"
- #define NUM_HEIGHT 20
- #define NUM_WIDTH 20
- typedef enum{
- NumStyleNormal,
- NumStyleSameTime,
- }NumStyle;
- @interface UINumber : CCSprite {
- NumStyle m_style; //滚动样式
- int m_num; //显示的数字
- int m_nPosCur; //当前的位置
- int m_nPosEnd; //结束的位置
- int m_nMoveLen; //每次移动的位置
- CCTexture2D *m_texture; //数字的texture
- }
- @property(nonatomic,retain) CCTexture2D *m_texture;
- -(id) initWithStyle:(NumStyle) style;
- -(void) setNumber:(int) num;
- -(void) onRollDown:(ccTime) dt;
- -(void) onRollUP:(ccTime) dt;
- -(void) setup;
- @end
- //
- // UiNumRoll.m
- // WheelScore
- //
- // Created by 周海锋 on 12-4-8.
- // Copyright 2012年 CJLU. All rights reserved.
- //
- #import "UINumber.h"
- @implementation UINumber
- @synthesize m_texture;
- /*
- * init 初始化
- */
- -(id) init
- {
- if( (self=[super init])) {
- m_texture = NULL;
- m_style = NumStyleNormal;
- m_num = 0;
- m_nPosCur = 0;
- m_nPosEnd = 0;
- [self setup];
- }
- return self;
- }
- /*
- * initWithStyle 初始化
- */
- -(id) initWithStyle:(NumStyle) style
- {
- if( (self=[super init]))
- {
- m_texture = NULL;
- m_style = style;
- m_num = 0;
- m_nPosCur = 0;
- m_nPosEnd = 0;
- [self setup];
- }
- return self;
- }
- /*
- * setup 设置texture
- */
- -(void)setup
- {
- UIImage *image = [UIImage imageNamed:@"number.png"];
- m_texture = [[CCTexture2D alloc]initWithImage:image];
- CCSpriteFrame *frame = [CCSpriteFrame frameWithTexture:m_texture rect:CGRectMake(0, 0, NUM_WIDTH, NUM_HEIGHT)];
- [self setDisplayFrame:frame];
- }
- /*
- * setNumber 设置显示的数字
- */
- -(void) setNumber:(int) num
- {
- m_nPosCur = NUM_HEIGHT * m_num;
- m_nPosEnd = NUM_HEIGHT * num;
- if (NumStyleNormal == m_style) {
- m_nMoveLen = 4;
- }
- else if (NumStyleSameTime == m_style) {
- m_nMoveLen = (m_nPosEnd-m_nPosCur)/20;
- }
- if (m_num > num) {
- [self schedule:@selector(onRollUP:) interval:0.03];
- }
- else {
- [self schedule:@selector(onRollDown:) interval:0.03];
- }
- m_num = num;
- }
- /*
- * onRollDown 向下滚动
- */
- -(void) onRollDown:(ccTime) dt
- {
- m_nPosCur += m_nMoveLen;
- if (m_nPosCur >= m_nPosEnd) {
- m_nPosCur = m_nPosEnd;
- [self unschedule:@selector(onRollDown:)];
- }
- CCSpriteFrame *frame = [CCSpriteFrame frameWithTexture:m_texture rect:CGRectMake(0, m_nPosCur, NUM_WIDTH, NUM_HEIGHT)];
- [self setDisplayFrame:frame];
- }
- /*
- * onRollUP 向上滚动
- */
- -(void) onRollUP:(ccTime) dt
- {
- m_nPosCur -= 4;
- if (m_nPosCur <= m_nPosEnd) {
- m_nPosCur = m_nPosEnd;
- [self unschedule:@selector(onRollUP:)];
- }
- CCSpriteFrame *frame = [CCSpriteFrame frameWithTexture:m_texture rect:CGRectMake(0, m_nPosCur, NUM_WIDTH, NUM_HEIGHT)];
- [self setDisplayFrame:frame];
- }
- -(void)dealloc
- {
- [self unscheduleAllSelectors];
- [m_texture release];
- [super dealloc];
- }
- @end
- //
- // UIRollNum.h
- // WheelScore
- //
- // Created by 周海锋 on 12-4-8.
- // Copyright 2012年 CJLU. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "cocos2d.h"
- #import "UINumber.h"
- @interface UIRollNum : CCSprite {
- int m_nNumber; //显示的数字
- int m_maxCol; //最大显示位数
- NSMutableArray *numArray; //存放每个数字的数组
- CGPoint m_point; //坐标
- bool zeroFill; //是否开启0填充
- NumStyle style; //滚动样式
- }
- @property (nonatomic,retain) NSMutableArray *numArray;
- @property (nonatomic) CGPoint m_point;
- @property (nonatomic) NumStyle style;
- -(void) rebuildEffect;
- -(void) clearEffect;
- -(int) getNumber;
- -(void) setNumber:(int)num;
- @end
- //
- // UIRollNum.m
- // WheelScore
- //
- // Created by 周海锋 on 12-4-8.
- // Copyright 2012年 CJLU. All rights reserved.
- //
- #import "UIRollNum.h"
- @implementation UIRollNum
- @synthesize numArray,m_point,style;
- /*
- * init 初始化
- */
- -(id) init
- {
- if (self = [super init]) {
- m_nNumber = 0;
- m_maxCol = 6;
- numArray =[[NSMutableArray alloc] init];
- zeroFill = YES;
- style = NumStyleNormal;
- }
- return self;
- }
- /*
- * getNumber 获取显示的数字
- */
- -(int) getNumber
- {
- return m_nNumber;
- }
- /*
- * setNumber 设置显示的数字
- * num int 设置的数字
- */
- -(void) setNumber:(int)num
- {
- if (m_nNumber != num) {
- m_nNumber = num;
- [self rebuildEffect];
- }
- }
- /*
- * rebuildEffect 重新设置每位数字
- */
- -(void) rebuildEffect
- {
- [self clearEffect];
- int i=0;
- int num = m_nNumber;
- while (1) {
- if (num<=0) {
- if(m_maxCol<=i && zeroFill)
- break;
- }
- int showNum = num%10;
- UINumber* pNumber = [[UINumber alloc]initWithStyle:style];
- [numArray addObject:pNumber];
- [pNumber setNumber:showNum];
- [pNumber setPosition:CGPointMake(m_point.x - i*NUM_WIDTH, m_point.y)];
- [pNumber setAnchorPoint:CGPointMake(1, 0.5)];
- [self addChild:pNumber z:100];
- i++;
- num = num/10;
- }
- }
- /*
- * rebuildEffect 清楚每位数字
- */
- -(void) clearEffect
- {
- for(int i=0;i<[numArray count];i++) {
- UINumber* pNumber = (UINumber *)[numArray objectAtIndex:i];
- [self removeChild:pNumber cleanup:YES];
- }
- [numArray removeAllObjects];
- }
- -(void)dealloc
- {
- [numArray release];
- [super dealloc];
- }
- @end