切割类游戏中的切割线类Version2

第二种方案,利用 PRKit 这个库来做,这个库是我在论坛上面听说到的

用了下,感觉不是很好,要符合我的需求的话要改蛮多地方,主要是纹理坐标的定位不是很精确

主要优点就是效率还不错,其中那块关于 opengl 的绘制代码比较值得回味。

另外这个库也使用了他人写的复杂多边形三角化算法,

我的需求里面不要求对多么复杂的多边形进行三角化细分,所以用起来感觉也有点儿鸡肋。

在最后一种方案的时候我会提到,其实利用 CCTexture2D 的纹理平铺特性,完全可以满足到我的需求~

BYCutLineEx.h

//
//  BYCutLineEx.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 "PRFilledPolygon.h"
#import "SynthesizeSingleton.h"

@interface BYCutLineEx : NSObject {
    
    // 纹理对象,用于之后的销毁~
    CCTexture2D* _texBar;
    CCTexture2D* _texSegment;
    
    
    // 端点精灵~
    CCSprite* _spBarA;
    CCSprite* _spBarB;
    
    
    // 尝试,尝试,尝试!
    PRFilledPolygon* _polySegment;
}


+(BYCutLineEx*) getInstance;


-(BYCutLineEx*) addToParent:(CCNode*)nodeParent;


-(void) setPointA:(CGPoint)pointA pointB:(CGPoint)pointB;


-(void) disappear;


@end

BYCutLineEx.mm

//
//  BYCutLineEx.mm
//  HungryBear
//
//  Created by Bruce Yang on 12-8-26.
//  Copyright (c) 2012年 EricGameStudio. All rights reserved.
//

#import "BYCutLineEx.h"

@implementation BYCutLineEx

SYNTHESIZE_SINGLETON_FOR_CLASS(BYCutLineEx)

-(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。切割虚线的精灵批节点~
        NSMutableArray* arrPoints = [NSMutableArray arrayWithCapacity:4];
        
        [arrPoints addObject:[NSValue valueWithCGPoint:ccp(-50, -25)]];
        [arrPoints addObject:[NSValue valueWithCGPoint:ccp(50, -25)]];
        [arrPoints addObject:[NSValue valueWithCGPoint:ccp(50, 25)]];
        [arrPoints addObject:[NSValue valueWithCGPoint:ccp(-50, 25)]];
        
        _polySegment = [[PRFilledPolygon alloc] initWithPoints:arrPoints andTexture:_texSegment];
        [_polySegment setVisible:NO];
        
        
        // 3。切割端点的精灵~
        _spBarA = [[CCSprite alloc] initWithTexture:_texBar];
        [_spBarA setVisible:NO];
        
        _spBarB = [[CCSprite alloc] initWithTexture:_texBar];
        [_spBarB setVisible:NO];
    }
    return self;
}


-(void) removeFromParent {
    [_polySegment removeFromParentAndCleanup:NO];
    
    [_spBarA removeFromParentAndCleanup:NO];
    [_spBarB removeFromParentAndCleanup:NO];
}


-(BYCutLineEx*) addToParent:(CCNode*)nodeParent {
    // 首先将单例对象从上一个场景移除~
    [self removeFromParent];
    
    [nodeParent addChild:_spBarA z:10];
    [nodeParent addChild:_spBarB z:10];
    [nodeParent addChild:_polySegment z:10];
    
    return self;
}


-(void) setPointA:(CGPoint)pointA pointB:(CGPoint)pointB {    
    [_polySegment setVisible:YES];
    
    float fScaleFactor = CC_CONTENT_SCALE_FACTOR();
    float fHalfWidth = ccpDistance(pointA, pointB) / 2.0f * fScaleFactor;
    float fHalfHeight = 16.0f / 2.0f * fScaleFactor;
    NSArray* arrPoints = [NSArray arrayWithObjects:
                          [NSValue valueWithCGPoint:ccp(-fHalfWidth, -fHalfHeight)], 
                          [NSValue valueWithCGPoint:ccp(fHalfWidth, -fHalfHeight)], 
                          [NSValue valueWithCGPoint:ccp(fHalfWidth, fHalfHeight)], 
                          [NSValue valueWithCGPoint:ccp(-fHalfWidth, fHalfHeight)], nil];
    
//    float fWidth = ccpDistance(pointA, pointB) * CC_CONTENT_SCALE_FACTOR();
//    float fHeight = 6.0f * CC_CONTENT_SCALE_FACTOR();
//    NSArray* arrPoints = [NSArray arrayWithObjects:
//                          [NSValue valueWithCGPoint:ccp(0, 0)], 
//                          [NSValue valueWithCGPoint:ccp(fWidth, 0)],
//                          [NSValue valueWithCGPoint:ccp(fWidth, fHeight)],
//                          [NSValue valueWithCGPoint:ccp(0, fHeight)], nil];
    
    [_polySegment setPoints:arrPoints];
	[_polySegment setPosition:ccpMidpoint(pointA, pointB)];
    
    CGPoint stickVector = ccpSub(ccp(pointA.x, pointA.y), ccp(pointB.x, pointB.y));
    float stickAngle = ccpToAngle(stickVector);
    [_polySegment setRotation:-1 * CC_RADIANS_TO_DEGREES(stickAngle)];
    
    [_spBarA setVisible:YES];
    [_spBarB setVisible:YES];
    
    [_spBarA setPosition:pointA];
    [_spBarB setPosition:pointB];
}


-(void) disappear {
    [_polySegment setVisible:NO];
    
    [_spBarA setVisible:NO];
    [_spBarB setVisible:NO];
}


-(void) dealloc {
    
    [_polySegment release];
    
    // 移除端点、虚线的精灵~
    [_spBarA release];
    [_spBarB release];
    
    
    // 移除无用的纹理~
    CCTextureCache* texCache = [CCTextureCache sharedTextureCache];
    [texCache removeTexture:_texBar];
    [texCache removeTexture:_texSegment];
    
    [super dealloc];
}


@end


posted on 2012-08-27 11:13  yang3wei  阅读(270)  评论(0编辑  收藏  举报