出于某些原因该游戏已经从 AppStore 下架了,
不过 91手机助手上面依然是可以下载到1.1内购版本的,
有设备的童鞋可以下载来玩一玩~
1.0 版本的视频链接(本文所介绍的是 1.1 版本的切割动画实现):
http://v.youku.com/v_show/id_XNDMyMTA4NzU2.html
使用很简单,通过 ccTouchesBegan 和 ccTouchesEnd 收集起始点和结束点,
作为两个参数初始化 CutLineLayer。。。
我的设计是这样的:当玩家的手指离开触摸屏的时候调用该效果,
CutLineLayer 初始化以后会启动一个定时器,
整个割痕效果的持续时间 = 每帧耗费的时间 * (duration + delay)。
duration 的涵义是割痕动画效果在多少帧后完成,
delay 的涵义是割痕动画定格到最后一个形态后保持再多少帧。
当割痕效果的持续时间超过限定时间以后,CutLineLayer 这个割痕效果所在的层将会自销毁掉,完成内存的自动回收。
最后提一下,不要忘记将 CutLineLayer 添加到游戏场景的父层了,很简单, addChild 加一下就行了~
期待是什么样的效果?自己动手写个小小的 demo 试一下吧,有什么不明白的地方欢迎向我留言~
所用到的图片(下面带 -hd 后缀的是 iphone-retina 所使用的素材,iphone 3gs 缩放为其 1/2 并去掉 -hd 后缀):
cutLine-hd.png
下面是相关的代码:
CutLineLayer.h
// // CutLineLayer.h // Oh my fish! // // Created by Bruce Yang on 12-10-9. // Copyright (c) 2012年 iyodoo. All rights reserved. // #import "cocos2d.h" @interface CutLineLayer : CCLayer { CCSprite* _spCut; CGPoint _start; CGPoint _end; int _duration; int _index; CGPoint _unit; int _delay; } +(CutLineLayer*) layerWithStart:(CGPoint)start end:(CGPoint)end duration:(int)duration valid:(bool)valid; -(id) initWithStart:(CGPoint)start end:(CGPoint)end duration:(int)duration valid:(bool)valid; @end
CutLineLayer.mm
// // CutLineLayer.mm // Oh my fish! // // Created by Bruce Yang on 12-10-9. // Copyright (c) 2012年 iyodoo. All rights reserved. // #import "CutLineLayer.h" @implementation CutLineLayer +(CutLineLayer*) layerWithStart:(CGPoint)start end:(CGPoint)end duration:(int)duration valid:(bool)valid { return [[[self alloc] initWithStart:start end:end duration:duration valid:valid] autorelease]; } -(id) initWithStart:(CGPoint)start end:(CGPoint)end duration:(int)duration valid:(bool)valid { if ((self = [super init])) { _start = start; _end = end; _duration = duration; _unit = ccpMult(ccp(_end.x - _start.x, _end.y - _start.y), 1.0f / duration); _index = 1; _spCut = [CCSprite spriteWithFile:@"cutLine.png"]; float fRotation = -1 * CC_RADIANS_TO_DEGREES(ccpToAngle(ccpSub(end, start))); [_spCut setRotation:fRotation]; if(!valid) { [_spCut setColor:(ccColor3B){255, 0, 0}]; } [self addChild:_spCut]; // 延长到达最大长度以后的停留时间~ _delay = 3; [self schedule:@selector(tick:)]; } return self; } -(void) tick:(id)sender { if (_index > _duration) { _delay --; if(_delay <= 0) { [self removeFromParentAndCleanup:YES]; } return; } CGPoint offset = ccp(_unit.x * _index, _unit.y * _index); [_spCut setPosition:ccpAdd(_start, ccpMult(offset, 0.5f))]; float fDistance = ccpDistance(CGPointZero, offset); float fScale = fDistance / _spCut.contentSize.width; [_spCut setScaleX:fScale]; _index ++; } -(void) dealloc { [super dealloc]; } @end