出于某些原因该游戏已经从 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