装饰模式--私人定制冬装夏装

这是我参照之前在iOS项目中用过的一个不规则形状按钮的第三方Button,这里用Cocos2d-x实现一个相似功能的按钮。

原文地址:http://blog.csdn.net/qqmcy/article/details/26161339

代码下载:http://download.csdn.net/detail/qqmcy/7365843

使用方法:

.h

//
//  TestScene.h
//  maptest
//
//  Created by 杜甲 on 14-5-18.
//
//

#ifndef __maptest__TestScene__
#define __maptest__TestScene__

#include "cocos2d.h"
#include "ui/CocosGUI.h"
#include "DJShapeButton.h"
USING_NS_CC;

class TestScene :public Layer,public DJShapeButtonDelegate{

public:
    static Scene* createScene();
    virtual bool init();

    CREATE_FUNC(TestScene);
    void buttonCallBack(DJShapeButton* sender);

};

#endif /* defined(__maptest__TestScene__) */
        DJShapeButton* djShapeBtn  = DJShapeButton::create("res/red/1300_r.png");
        djShapeBtn->setDelegate(this);
        //设置tag
        djShapeBtn->setShapeBtnTag(1000);
        djShapeBtn->setPosition(Point(0, 40));
        addChild(djShapeBtn);

回调函数

void TestScene::buttonCallBack(DJShapeButton *sender)
{
    log("%d",sender->getTag());
}

DJShapeButton.h不规则形状Button类

//
//  DJShapeButton.h
//  maptest
//
//  Created by 杜甲 on 14-5-18.
//
//

#ifndef __maptest__DJShapeButton__
#define __maptest__DJShapeButton__

class DJShapeButton;

class DJShapeButtonDelegate {

public:
    virtual void buttonCallBack(DJShapeButton* sender) = 0;

};

#include "cocos2d.h"
#include "ui/CocosGUI.h"

USING_NS_CC;

class DJShapeButton :public ui::Layout{

public:
    static DJShapeButton* create(const std::string& normalImage);

    CC_SYNTHESIZE(DJShapeButtonDelegate*, _delegateBtn, Delegate);

    virtual bool init(const std::string& normalImage);

    CC_SYNTHESIZE_RETAIN(Sprite*,  shapeBtn, ShapeBtn);

    void setShapeBtnTag(int tag);
private:
    bool isSwallow ;

};

#endif /* defined(__maptest__DJShapeButton__) */

DJShapeButton.cpp

//
//  DJShapeButton.cpp
//  maptest
//
//  Created by 杜甲 on 14-5-18.
//
//

#include "DJShapeButton.h"
DJShapeButton* DJShapeButton::create(const std::string &normalImage)
{
    DJShapeButton *pRet = new DJShapeButton();
    if (pRet && pRet->init(normalImage))
    {
        pRet->autorelease();
        return pRet;
    }
    else
    {
        delete pRet;
        pRet = NULL;
        return NULL;
    }

}
bool DJShapeButton::init(const std::string &normalImage)
{
    bool bRet = false;
    do {
        CC_BREAK_IF(!ui::Layout::init());

        Image* myImg = new Image();
        myImg->initWithImageFile(normalImage);

        Texture2D* temp = new Texture2D();
        temp->initWithImage(myImg);

        shapeBtn =Sprite::createWithTexture(temp);

        log("%f,%f",shapeBtn->getAnchorPoint().x ,shapeBtn->getAnchorPoint().y);
        log("width = %f,height = %f",shapeBtn->getContentSize().width , shapeBtn->getContentSize().height);

        addChild(shapeBtn);

        this->setSize(shapeBtn->getContentSize());
        shapeBtn->setPosition(Point(getSize().width / 2, getSize().height / 2));

        auto listener1 = EventListenerTouchOneByOne::create();

        listener1->onTouchBegan = [=](Touch* touch, Event* event)
        {
            auto target = static_cast<Sprite*>(event->getCurrentTarget());
            Point locationInNode = target->convertToNodeSpace(touch->getLocation());
            Color4B c = {0,0,0,0};

            Point pt = Point(locationInNode.x, target->getContentSize().height - locationInNode.y);

            Size s = target->getContentSize();
            Rect rect = Rect(0, 0, s.width, s.height);

            if (rect.containsPoint(locationInNode)) {
                log("sprite began... x = %f, y = %f", locationInNode.x, locationInNode.y);

                unsigned int x = pt.x, y = pt.y;
                unsigned char* data = myImg->getData();
                unsigned int* pixel = (unsigned int*)data;
                pixel = pixel + (y * 116) + x;
                c.r = *pixel & 0xff;
                c.g = (*pixel >> 8 ) & 0xff;
                c.b = (*pixel >> 16) & 0xff;
                c.a = (*pixel >> 24) & 0xff;
                log("8888888888%d",c.a);
                if (c.a <= 4) {
                    isSwallow = false;
                }else
                {
                    isSwallow = true;

                }

            }else{
                isSwallow = false;
            }

            listener1->setSwallowTouches(isSwallow);

            return isSwallow;
        };

        listener1->onTouchEnded =  [=](Touch* touch, Event* event)
        {
            if (_delegateBtn != nullptr) {
                _delegateBtn->buttonCallBack(this);
            }
        };

        _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, shapeBtn);

        bRet = true;
    } while (0);
    return bRet;
}

void DJShapeButton::setShapeBtnTag(int tag)
{
    shapeBtn->setTag(tag);
    setTag(tag);

}

装饰模式--私人定制冬装夏装

时间: 2024-08-24 10:12:02

装饰模式--私人定制冬装夏装的相关文章

“私人定制”——开启定制家具2.0时代

说起定制,最早还属于高级服装和珠宝奢侈品这类范畴,近几年已在家居行业悄然兴起,衣柜.橱柜成为了人们最青睐定制的家具.就在人们还在谈论着家具定制的新鲜感和优越感时,一场更大的定制革命今天已经来临,家具定制的2.0版"全屋定制".   62.9%的消费者倾向于全屋定制 随着80后逐渐成为家居市场消费的主力军,消费习惯和理念和其父辈完全不一样,传统家居模式很难满足他们的个性化需求,而"私人定制"就此悄然走红.与传统家居相比,定制家具可根据消费者自己的喜好.占用空间的大小以

私人定制推送铃声

最好的用户体验就是私人定制,今天说下推送铃声的私人定制. 分为3个步骤: 1.制作推送提醒铃声 一般的iphone手机铃声都能够,限时30s之内. 2.倒入项目 将制作好的铃声加入到xcode的project项目中 3.改动推送json(改动后台) $body['aps'] = array( 'alert' => $message, //'sound' => 'default',//这个是默认的 'sound' =>'sub.m4r', //sub.m4r为你加入到项目中的声音文件名 '

自定义 Android Preference——SpinnerPreference的私人定制

因客户需求SpinnerPreference,网上各种搜索不到,无奈只能重写组件,现将过程分享大家. 自定义SpinnerPreference 一:首先从扩展preference开始:类文件必须继承自Preference并实现构造函数,如下 public MySpinnerPreference(Context context) { super(context); } public MySpinnerPreference(Context context, AttributeSet attrs) {

圆满结束【一对一私人定制,我和马哥有个约会】

[一对一私人定制,我和马哥有个约会]活动圆满结束 7.28日马哥一对一沟通交流会圆满结束了,几位幸运的马哥铁粉纷纷反馈收获满满. 他们不仅零距离和马哥一对一进行了沟通,更收获了满满干货,在运维道路上开阔了视野,还认识了志同道合的朋友. 马哥在线上跟同学交流,答疑解惑 学员反馈及群里沟通,直接跟马哥沟通,说服力和指导力都会比较信服 这次马哥也拿出了价值1200元的内部技术资料分享给报名的120个用户,很多学员要求尽快举办第二期活动,后续51CTO学院还会举办更多精彩的活动回馈广大用户盆友的,敬请期

私人定制javascript中数组小知识点(Only For Me)

先上笑话,1.刚看到一个游泳的,想起公司组织去三亚旅游,老板跳海里,各种挣扎,捞上来老板第一句话:我记得我会游泳的啊. 2.媳妇说:老公对不起,我把你新买的自行车撞散架了! 老公:没事宝贝,你若安好,便是晴天! 媳妇说:老公你太有诗意了. 老公:滚犊子,安不好我整死你! 数组的概念 javascript数组是值得有序集合,不过它实属一个javascript对象的特殊形式,这是一个很重点的定性. 创建数组 1.var a=new Array();//等同于[] 2.var a=new Array(

私人定制-代码生成器2

大家好最近一直比较忙没有及时更新软件,首先说声抱歉.这次为大家带来的是v2.3.0版本,这次主要更新有如下几点: 一.V2.3.0新增功能:1.支持生成数据库常用脚本 Update.InsertAndUpdate . 2.支持NHibernate映射文件Hbm文件生成 .3.支持Mssql2000数据库 .4.新增了字段类型与目标类型映射 .5.优化了进度条显示,主要是程序执行和界面显示不同步问题 .6.对代码进行了适当的重构,减少了冗余代码.提高了代码复用率.代码每页不超过100行.7.优化软

私人定制!13个在线纹理生成资源网站

私人定制!13个在线纹理生成资源网站 私人定制!13个在线纹理生成资源网站私人定制!13个在线纹理生成资源网站,布布扣,bubuko.com

裁缝店私人定制 风生水起 紧跟时尚

"爱上原品"上线主打设计师原创_科技_腾讯网 "爱上原品"上线主打设计师原创 2011年11月16日01:58北京商报魏蔚我要评论(0) 字号:T|T 记者近日获悉,设计师原创时装网站"爱上原品"已正式上线开卖,该网站以设计师原创时装为主营产品,一经推出就吸引了国内外众多合作厂商的关注与加盟. 据了解,"爱上原品"在今年9月15日就已面向公众开放注册,并推出注册会员即赠送百元消费券等一系列活动.据内部人士透露,该网站开通首日注

利用BusyBox ~私人定制 My LINUX~

前言 我在今天在这里跟大家详细地探讨一下Linux系统的定制过程和实现例如.用户能够远程登录:和Nginx能够稳定地运行在我们私人定制的LINUX系统上.一步一步从头开始定制属于我们自己的系统. 正文    首先我们先来简单的介绍一下我们这里定制属于自己的Linux系统的基本元素. 一个定制的linux内核+一个定制的busybox就可以定制一个小型的Linux操作系统了,安装Dropbear和Nginx,Linux的组成 部分包括内核空间和用户空间.而用户空间其实就是根文件系统.用户空间中又包