第一种方案,不是很满意,因为虚线中的每个小节都是一个精灵,所以效率上有点儿偏低~
另外就是,移动的过程中,小节精灵有跳动,影响整体效果的呈现,抛弃之~
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
转载于:https://www.cnblogs.com/yang3wei/archive/2012/08/27/2739639.html