Cocos2d 利用继承Draw方法制做可显示三维数据(宠物三维等)的三角形显示面板

好久没有写博客了,这段时间比较忙,又是搬家又是作本身的项目,还有太多琐碎的事情缠身,好不容易抽出时间把最近本身作的一些简单例子记录一下。数据库

在个人项目中,我须要一个显示面板来显示游戏中的一个三维数据,例如,力量,速度,耐力,来直观的显示出物体的特征,让玩家可以一眼看出区别ui

首先咱们须要准备一下素材atom

显示面板的背景"Panel.png",好比:尽可能可以以三角形为背景spa

1- 新建一个继承自CCSprite的类,命名为CCPanel代理

2- 在头文件中添加code

@interface ZOPanel : CCSprite
{
    id<ZOPanelDataSource> s_dataSource;
}
- (id)initWithDataSource:(id<ZOPanelDataSource>)dataSource;
+ (id)panelWithDataSource:(id<ZOPanelDataSource>)dataSource;
@end

这里咱们须要利用代理的方式,来传入面板所须要显示的值,这样咱们就能在不一样的类中使用到这个面板,而不须要从新修改代码blog

初始化方法中,须要设置一个代理,这里做为数据库的做用继承

接着咱们须要完成这个代理的协议,在前面添加代码:游戏

@protocol ZOPanelDataSource <NSObject>
@required
@property (nonatomic, readonly) float Power;
@property (nonatomic, readonly) float Speed;
@property (nonatomic, readonly) float Endurance;;
@end
// before @interface

这段代码申明了ZOPanelDataSource须要实现3个属性,分别为Power,Speed,Endurance博客

ZOPanel将会根据ZOPanelDataSource的3个属性,自动更新面板显示的数据

3- 在实现文件中实现初始化方法

@implementation ZOPanel

- (id)initWithDataSource:(id<ZOPanelDataSource>)dataSource;
{
    self = [super initWithSpriteFrameName:@"Panel.png"];
    if (self) {
        s_dataSource = dataSource;
    }
    return self;
}

+ (id)panelWithDataSource:(id<ZOPanelDataSource>)dataSource;
{
    return [[[self alloc] initWithDataSource:dataSource] autorelease];
}

4- 继承Draw方法来绘制三角形,在初始化方法后添加如下代码:

- (void)draw
{
    [super draw];
    //draw 方法是CCNode用来绘制自身显示内容的方法,将会在每一个最小时间间隔dt内不断更新,通常要在CCNode中本身绘制点,线,面,都须要继承原来的draw方法,在以后添加自定义的绘制代码
    if (s_dataSource) {
        float power = s_dataSource.Power;//读取数据库Power属性
        float speed = s_dataSource.Speed;//读取数据库Speed属性
        float endurance = s_dataSource.Endurance;//读取数据库Endurance属性

        ccDrawColor4F(0, 0, 0, 1);//设置OpenGL绘制图像的颜色为R:0,B:0,G:0,A:1
        CGPoint center = ccpAdd(self.anchorPointInPoints, ccp(0,-2));//计算绘制三角形的中心位置,在个人例子中为背景图像的中心向Y轴负方向移动2个像素,根据不一样的背景图像,须要从新计算
        float redRotation = 90;//红色三角形定点的角度
        CGPoint powerDirection = ccpForAngle(CC_DEGREES_TO_RADIANS(redRotation));
        CGPoint speedDirection = ccpForAngle(CC_DEGREES_TO_RADIANS(redRotation + 120));
        CGPoint enduranceDirection = ccpForAngle(CC_DEGREES_TO_RADIANS(redRotation + 240));
        
        CGPoint powerPoint = ccpAdd(center, ccpMult(powerDirection, 1 + power * 15 / 50));//计算出Power顶点
        CGPoint speedPoint = ccpAdd(center, ccpMult(speedDirection, 1 + speed * 15 / 50));//计算出Speed顶点
        CGPoint endurancePoint = ccpAdd(center, ccpMult(enduranceDirection, 1 + endurance * 15 / 50));//计算出Endurance顶点
        CGPoint points[] = {
            powerPoint,
            speedPoint,
            endurancePoint
        };
        ccDrawSolidPoly(points, 3, ccc4FFromccc3B(ccBLACK));//调用Cocos2d的绘制方法,绘制一个黑色实心三角形
}

至此一个简单的三角形显示控件完成

使用起来也很是简单,在任何一个CCNode实现中,添加代码

#import "ZOPanel.h"

{
    ZOPanel *panel = [ZOPanel panelWithDataSource:self];
    [self addchild:panel];
}

//实现数据库代理
- (float)Power
{
    reture 0;
}

- (float)Speed
{
    reture 0;
}

- (float)Endurance
{
    reture 0;
}

最终效果以下,但愿可以对你们有帮助

 

相关文章
相关标签/搜索