第一种方案,不是很满意,因为虚线中的每个小节都是一个精灵,所以效率上有点儿偏低~
另外就是,移动的过程中,小节精灵有跳动,影响整体效果的呈现,抛弃之~
BYCutLine.h
// // BYCutLine.h // HungryBear // // Created by Bruce Yang on 12-8-26. // Copyright (c) 2012年 EricGameStudio. All rights reserved. // #import <Foundation/Foundation.h> #import "cocos2d.h" #import "SynthesizeSingleton.h" #import <vector> using namespace std; /** Added by Bruce Yang on 2012.08.26.12.12~ */ @interface BYCutLine : NSObject { // 纹理对象,用于之后的销毁~ CCTexture2D* _texBar; CCTexture2D* _texSegment; // 端点精灵~ CCSprite* _spBarA; CCSprite* _spBarB; // 虚线批节点~ CCSpriteBatchNode* _batchSegment; } +(BYCutLine*) getInstance; -(BYCutLine*) addToParent:(CCNode*)nodeParent; -(void) setPointA:(CGPoint)pointA pointB:(CGPoint)pointB; -(void) disappear; @end
BYCutLine.mm
// // BYCutLine.m // HungryBear // // Created by Bruce Yang on 12-8-26. // Copyright (c) 2012年 EricGameStudio. All rights reserved. // #import "BYCutLine.h" // increase value to have less segments per rope, decrease to have more segments #define SEGMENT_LENGTH 8 #define SEGMENT_GAP_LENGTH 4 @implementation BYCutLine SYNTHESIZE_SINGLETON_FOR_CLASS(BYCutLine) -(id) init { if((self = [super init])) { // 1。加载纹理~ CCTextureCache* texCache = [CCTextureCache sharedTextureCache]; _texBar = [texCache addImage:@"img_cut_line_bar.png"]; _texSegment = [texCache addImage:@"img_cut_line_segment.png"]; // 2。切割虚线的精灵批节点~ int iArrSize = 32; _batchSegment = [[CCSpriteBatchNode alloc] initWithTexture:_texSegment capacity:iArrSize]; CCSprite* spSegment = nil; for(int i = 0; i < iArrSize; ++ i) { spSegment = [[CCSprite alloc] initWithTexture:_texSegment]; [spSegment setVisible:NO]; [_batchSegment addChild:spSegment]; } // 3。切割端点的精灵~ _spBarA = [[CCSprite alloc] initWithTexture:_texBar]; _spBarB = [[CCSprite alloc] initWithTexture:_texBar]; [_spBarA setVisible:NO]; [_spBarB setVisible:NO]; } return self; } -(void) removeFromParent { [_batchSegment removeFromParentAndCleanup:NO]; [_spBarA removeFromParentAndCleanup:NO]; [_spBarB removeFromParentAndCleanup:NO]; } -(BYCutLine*) addToParent:(CCNode*)nodeParent { // 首先将单例对象从上一个场景移除~ [self removeFromParent]; [nodeParent addChild:_spBarA z:10]; [nodeParent addChild:_spBarB z:10]; [nodeParent addChild:_batchSegment z:10]; return self; } -(void) setPointA:(CGPoint)pointA pointB:(CGPoint)pointB { float fDistance = ccpDistance(pointA, pointB); int iPointCount = (int)(fDistance / (SEGMENT_LENGTH + SEGMENT_GAP_LENGTH) + 0.5f); CGPoint diffVector = ccpSub(pointB, pointA); float fMultiplier = fDistance / iPointCount; for(CCSprite* spSegment in [_batchSegment children]) { [spSegment setVisible:NO]; } // 第一个点和最后一个点不用安上节点精灵,因为会被端点精灵覆盖住,纯粹浪费性能~ for(int i = 1; i < iPointCount - 1; i ++) { CGPoint pntTmp = ccpAdd(pointA, ccpMult(ccpNormalize(diffVector), fMultiplier*i)); CCSprite* spSegment = [[_batchSegment children] objectAtIndex:i]; [spSegment setVisible:YES]; [spSegment setPosition:pntTmp]; } [_spBarA setVisible:YES]; [_spBarB setVisible:YES]; [_spBarA setPosition:pointA]; [_spBarB setPosition:pointB]; } -(void) disappear { for(CCSprite* spSegment in [_batchSegment children]) { [spSegment setVisible:NO]; } [_spBarA setVisible:NO]; [_spBarB setVisible:NO]; } -(void) dealloc { // 移除端点、虚线的精灵~ [_spBarA release]; [_spBarB release]; [_batchSegment removeAllChildrenWithCleanup:YES]; [_batchSegment release]; // 移除无用的纹理~ CCTextureCache* texCache = [CCTextureCache sharedTextureCache]; [texCache removeTexture:_texBar]; [texCache removeTexture:_texSegment]; [super dealloc]; } @end