专职C++

不能停止的脚步

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  156 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

常用链接

留言簿(13)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#

(基于cocos2dx2.2.2)cocos2dx的按钮类定义在extensions\GUI\CCControlExtension\CCControlButton.h
在需要用的时候,包括就可以了。
我们在相应的申明的地方,包含下面三个头文件

#include "GUI/CCControlExtension/CCControlButton.h"
#include "GUI/CCControlExtension/CCScale9Sprite.h"
#include "GUI/CCControlExtension/CCControl.h"
然按钮的事件有如下定义
enum 
{
    CCControlEventTouchDown           = 1 << 0,    // A touch-down event in the control.
    CCControlEventTouchDragInside     = 1 << 1,    // An event where a finger is dragged inside the bounds of the control.
    CCControlEventTouchDragOutside    = 1 << 2,    // An event where a finger is dragged just outside the bounds of the control. 
    CCControlEventTouchDragEnter      = 1 << 3,    // An event where a finger is dragged into the bounds of the control.
    CCControlEventTouchDragExit       = 1 << 4,    // An event where a finger is dragged from within a control to outside its bounds.
    CCControlEventTouchUpInside       = 1 << 5,    // A touch-up event in the control where the finger is inside the bounds of the control. 
    CCControlEventTouchUpOutside      = 1 << 6,    // A touch-up event in the control where the finger is outside the bounds of the control.
    CCControlEventTouchCancel         = 1 << 7,    // A system event canceling the current touches for the control.
    CCControlEventValueChanged        = 1 << 8      // A touch dragging or otherwise manipulating a control, causing it to emit a series of different values.
};
事件原型定义:typedef void (CCObject::*SEL_CCControlHandler)(CCObject*, CCControlEvent); 并用宏cccontrol_selector定义了 #define cccontrol_selector(_SELECTOR) (SEL_CCControlHandler)(&_SELECTOR) 事件的两个参数分别的产生事件的对象,具体的事件,这是一个无符号32位整数,事件值就是CCControlEventTouchDown等定义的值。
在这里,定义了事件函数    void OnTouchDown(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchDragEnter(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchDragExit(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchDragInside(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchDragOutside(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchUpInside(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchUpOutside(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchCancel(CCObject* pSender, extension::CCControlEvent event);
具体事件实现如下

void HelloWorld::OnTouchDown(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchDown:%u", event);
}

void HelloWorld::OnTouchDragEnter(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchDragEnter:%u", event);

}

void HelloWorld::OnTouchDragExit(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchDragExit:%u", event);

}

void HelloWorld::OnTouchDragInside(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchDragInside:%u", event);
}

void HelloWorld::OnTouchDragOutside(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchDragOutside:%u", event);
}

void HelloWorld::OnTouchUpInside(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchUpInside:%u", event);
}

void HelloWorld::OnTouchUpOutside(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchUpOutside:%u", event);
}

void HelloWorld::OnTouchCancel(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchCancel:%u", event);
}
然后定义一个按钮,在init中实现 

            {
                extension::CCScale9Sprite * pBtnNormal = extension::CCScale9Sprite::create("up.png");
                extension::CCScale9Sprite * pBtnDown = extension::CCScale9Sprite::create("up.png");
                CCLabelTTF * pBtnCaption = CCLabelTTF::create("", "宋体", 30);
                extension::CCControlButton * pBtn = extension::CCControlButton::create(pBtnCaption, pBtnNormal);
                pBtn->setBackgroundSpriteForState(pBtnDown, extension::CCControlStateSelected);
                pBtn->setPosition(GetPosition(pPlayerLayer, "UpPoint"));
                pBtn->setAnchorPoint(CCPointZero);
                pBtn->setPreferredSize(CCSizeMake(32, 32));
                pBtn->setTag(100);
                this->addChild(pBtn);

                pBtn->addTargetWithActionForControlEvents(this,    cccontrol_selector(HelloWorld::OnTouchDown), CCControlEventTouchDown);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDragEnter), CCControlEventTouchDragEnter);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDragExit), CCControlEventTouchDragExit);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDragInside), CCControlEventTouchDragInside);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDragOutside), CCControlEventTouchDragOutside);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchUpInside), CCControlEventTouchUpInside);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchUpOutside), CCControlEventTouchUpOutside);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchCancel), CCControlEventTouchCancel);


                
            }
需要注意的事件,不要开启touch事件,否则会找不到。 也就是这句//CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
具体的按钮事件实验结果说明:
CCControlEventTouchDown:鼠标该处于按下并曾经点中按钮时,则触发一次 
CCControlEventTouchDragEnter:当鼠标处于按下并曾经点中按钮的状态下,鼠标进入按钮范围,则触发一次 ,也就是处于按下状态,回到该按钮区域
CCControlEventTouchDragExit:当鼠标处于按下并曾经点中按钮的状态下,鼠标离开按钮范围,则触发一次 ,也就是处于按下状态,离开该按钮区域
CCControlEventTouchDragInside:当鼠标处于按下并曾经点中按钮的状态下,鼠标进入按钮范围,则触发,每产生移动,就会触发 ,
CCControlEventTouchDragOutside: 当鼠标处于按下并曾经点中按钮的状态下,鼠标离开按钮范围,则触发,每产生移动,就会触发 
CCControlEventTouchUpInside:当鼠标处于按下并曾经点中按钮的状态下,鼠标松开且在按钮范围内,则触发一次,也就是处于按下状态,并在该按钮区域放起
CCControlEventTouchUpOutside:当鼠标处于按下并曾经点中按钮的状态下,鼠标松开且在按钮范围外,则触发一次 也就是处于按下状态,但是已经离开该按钮区域,再放起
CCControlEventTouchCancel:暂时没有发现能用鼠标触发这个事件的操作
了解后,就可以根据实际要求实现了
posted @ 2014-05-05 23:49 冬瓜 阅读(4606) | 评论 (0)编辑 收藏

因为要用到调试json的解析结果,所以在这里写了一个,结果近似json格式

void PrintJsonList(const string & paramPre, Json::Value & paramValue)
{
    Json::Value::Members mem = paramValue.getMemberNames();  
    for (auto iter = mem.begin(); iter != mem.end(); iter++)  
    {  
        cout<<paramPre<<"\""<<*iter<<"\":";  
        if (paramValue[*iter].type() == Json::objectValue)  
        {  
            cout<<paramPre<<"{"<<endl;  
            PrintJsonList(paramPre + "   ", paramValue[*iter]);  
            cout<<paramPre<<"},"<<endl;
        }  
        else if (paramValue[*iter].type() == Json::arrayValue)  
        {  
            cout<<paramPre<<"["<<endl;  
            auto cnt = paramValue[*iter].size();  
            for (auto i = 0; i < cnt; i++)  
            {  
                Json::Value & pElem = paramValue[*iter][i];
                if (pElem.type() == Json::arrayValue)
                {
                    cout <<paramPre<< "["<<endl;
                    PrintJsonList(paramPre + "   ", pElem);  
                    cout <<paramPre<< "],"<<endl;
                }
                else if (pElem.type() == Json::objectValue)
                {
                    cout <<paramPre<< "{"<<endl;
                    PrintJsonList(paramPre + "   ", pElem);  
                    cout <<paramPre<< "},"<<endl;
                }
                else PrintJsonList(paramPre + "   ", pElem);  
            }  
            cout<<paramPre<<"]"<<endl;  
        }  
        else if (paramValue[*iter].type() == Json::stringValue)  
        {  
            cout<<"\""<<paramValue[*iter].asString()<<"\""<<endl;  
        }  
        else if (paramValue[*iter].type() == Json::realValue)  
        {  
            cout<<paramValue[*iter].asDouble()<<endl;  
        }  
        else if (paramValue[*iter].type() == Json::uintValue)  
        {  
            cout<<paramValue[*iter].asUInt()<<endl;  
        }  
        else
        {  
            cout<<paramValue[*iter].asInt()<<endl;  
        }  
    }  
    return;  
}
posted @ 2014-04-29 16:30 冬瓜 阅读(1238) | 评论 (0)编辑 收藏

     摘要: C++Builder XE6,这个发布了,同时这次破解也很快发布了(以前,每次更新只是更新防破解,搞的人家懒的破解了),于是,我就有兴趣下载下来试用了,我的目的是Fire Monkey的移动应用开发。  阅读全文
posted @ 2014-04-29 14:01 冬瓜 阅读(7320) | 评论 (5)编辑 收藏

最近在搞一个项目,需要用的curl。因为使用windows下面开发比较习惯,于是用它了。然并不是一帆风顺的。
先去官网下载curl。我先下下载了libcurl-7.19.3_win32_ssl_msvc.zip,然后提示"应用程序无法正常启动(0xc000007)",反复测试没用(本人是win7 64位环境),它自带的也是这样。看到也有人说这个问题,好像是64位环境的问题,于是就重新搞一下。
首先到官网下载64位的:http://curl.haxx.se/download.html,在这里选择Use the curl Download Wizard!,然后按照要求,下载了一个64位版本。下载后的文件名是curl-7.34.0-devel-mingw64.7z。然后解压就可以了。
vs工程也要加一个,选择工程树具体的某个工程,点该工程的属性,终出下面的对话框后,选择配置管理器(图中所示)


设置先成后,选择相应的工程配置方案,就可以了。


下步就是如何加到工程,在下载的libcurl中,是用mingw编译了,没有的lib文件,但是他提供了def文件,我们可以用它来生成lib。在curl-7.34.0-devel-mingw64\lib64里面。
在windows的开始菜单找到visual studio 2013,选择visual studio tools,会打开一个目录,然后选择“VS2013 x64 本机工具命令提示”进入命令提示符下面。
进入到libcurl解压的目录,在lib64目录下面。然后输入下面两个命令,就可以得到两个lib了
lib /DEF:libcurl.def /MACHINE:X64
lib /DEF:libssh2.def /MACHINE:X64
把生成的libcurl.lib和libssh2.lib放到工程可以找到的lib目录,再把curl-7.34.0-devel-mingw64\bin下的所有dll复制到程序生成.exe的目录,这样,就可以在工程中使用curl了。
下面的博客提供了一个curl的使用,可以直接用,并编译通过。http://dewei.iteye.com/blog/1572016,唯一不同的指定lib
#include "curl/curl.h"  
#pragma comment(lib, "libcurl.lib")  

posted @ 2014-04-15 17:03 冬瓜 阅读(7706) | 评论 (2)编辑 收藏

平时用dynamic_cast,但是一直没有考虑过性能。但是性能怎么样,还真没想过。下测试就是一段测试程序,在linux下跑。
循环2亿次,用dynamic_cast<XTestEx *>()的时候是2.39978秒,用(XTestEx *)直接转的时间是0.723503秒。如果加上附加代码带来的误差。dynamic_cast<XTestEx *>()费时是(XTestEx *)的近4倍.但总的来说,性能影响不大!
#include <iostream>
#include<sys/time.h>

using namespace std;

class XTestBase
{
public:
    virtual ~XTestBase(){}
    virtual int getValue() = 0;
    
};

class XTestEx : public XTestBase
{
public:
    virtual ~XTestEx(){}
    virtual int getValue() 
    {
        return 100;
    }
};

int main(int argc, char * argv[])
{
    struct timeval st1,st2;

    XTestBase * pB = new XTestEx();
    int iC = 0;
    gettimeofday(&st1, NULL);
    for(int i = 0; i < 200000000; i++)
    {
        XTestEx * p = dynamic_cast<XTestEx *>(pB);
        iC += p->getValue();
    }
    gettimeofday(&st2, NULL);
    long long diff  = 1000000ll * (st2.tv_sec-st1.tv_sec)+ st2.tv_usec-st1.tv_usec;
    cout<<"diff:"<<(diff/1000000.0)<<endl;

    gettimeofday(&st1, NULL);
    for(int i = 0; i < 200000000; i++)
    {
        XTestEx * p = (XTestEx *)pB;
        iC += p->getValue();
    }
    gettimeofday(&st2, NULL);
    diff  = 1000000ll * (st2.tv_sec-st1.tv_sec)+ st2.tv_usec-st1.tv_usec;
    cout<<"diff:"<<(diff/1000000.0)<<endl;

    return 0;
}
posted @ 2014-04-02 11:46 冬瓜 阅读(1355) | 评论 (1)编辑 收藏

     摘要: 第一:没有美术,只好自己用PS。先用PS在原来的4个方向上,做一个履带差异的4方向坦克。
第二:用SpritePacker打包成tankbase.plist。然后用CCSpriteFrameCache加载到内存中。
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("basetank.plist");  阅读全文
posted @ 2014-03-25 00:05 冬瓜 阅读(1210) | 评论 (1)编辑 收藏

(基于cocos2dx 2.2.2)
如果很多图片很小或常用,可以使用CCSpriteFrameCache,来避免资源被反复加载。 
(注:对于plist,我这里使用的是一个免费的工具,SpritePacker,http://spritepacker.kernys.net)

如:CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("basetank.plist");
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>frames</key>
    <dict>
        <key>basetank_down.png</key>
        <dict>
            <key>frame</key>
            <string>{{0,0},{26,26}}</string>
            <key>offset</key>
            <string>{0,0}</string>
            <key>rotated</key>
            <false/>
            <key>sourceColorRect</key>
            <string>{{3,3},{26,26}}</string>
            <key>sourceSize</key>
            <string>{32,32}</string>
        </dict>
        <key>basetank_left.png</key>
        <dict>
            <key>frame</key>
            <string>{{0,27},{26,26}}</string>
            <key>offset</key>
            <string>{0,0}</string>
            <key>rotated</key>
            <false/>
            <key>sourceColorRect</key>
            <string>{{3,3},{26,26}}</string>
            <key>sourceSize</key>
            <string>{32,32}</string>
        </dict>
        <key>basetank_right.png</key>
        <dict>
            <key>frame</key>
            <string>{{0,54},{26,26}}</string>
            <key>offset</key>
            <string>{0,0}</string>
            <key>rotated</key>
            <false/>
            <key>sourceColorRect</key>
            <string>{{3,3},{26,26}}</string>
            <key>sourceSize</key>
            <string>{32,32}</string>
        </dict>
        <key>basetank_up.png</key>
        <dict>
            <key>frame</key>
            <string>{{0,81},{26,26}}</string>
            <key>offset</key>
            <string>{0,0}</string>
            <key>rotated</key>
            <false/>
            <key>sourceColorRect</key>
            <string>{{3,3},{26,26}}</string>
            <key>sourceSize</key>
            <string>{32,32}</string>
        </dict>
    </dict>
    <key>metadata</key>
    <dict>
        <key>format</key>
        <integer>2</integer>
        <key>realTextureFileName</key>
        <string>basetank.png</string>
        <key>size</key>
        <string>{32,128}</string>
        <key>smartupdate</key>
        <string>{None}</string>
        <key>textureFileName</key>
        <string>basetank.png</string>
    </dict>
</dict>
</plist>
这样,就可以完成一组图片资源加载。
            CCSprite * p1Pic = CCSprite::createWithSpriteFrameName(“basetank_up.png”);
            p1Pic->setPosition(GetPosition(pPlayerLayer, "Player1"));
            p1Pic->setAnchorPoint(ccp(0, 0));
            this->addChild(p1Pic);
如需更换图片,
p1Pic
->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("basetank_right.png"));
这里的作用相当于是把tank向右转
posted @ 2014-03-24 00:08 冬瓜 阅读(1399) | 评论 (0)编辑 收藏

(基于cocos2dx 2.2.2)现在下载的cygwin自带的gcc编译器的版本是4.8.x了,也就是全面支持c++0x11版本了。(我用的vs2013也已经大部分支持C++0x11的版本)。但是默认情况下,gcc是不支持的,需要在编译选项设置开关。
我们用文本编辑器打开proj.android\jni\Application.mk,并增加 -std=c++0x,这样就可以编译c++0x11的C++代码了。
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++0x
posted @ 2014-03-16 23:35 冬瓜 阅读(1181) | 评论 (0)编辑 收藏

     摘要: 在手机上调试,不能所见所得日志,这个是一个比较麻烦的事,于是想到了,用多行文本做日志。
下面是日志的代码。从CCLabelTTF派生。这里主要提供了VLog和Log两个日志输出函数。
定义如下
void VLog(const char * paramFormat, va_list param_argptr);
void Log(const char * paramFormat, ...);
其中VLog主要应用于已经有va_list的情况下。  阅读全文
posted @ 2014-03-16 23:15 冬瓜 阅读(3508) | 评论 (0)编辑 收藏

     摘要: 游戏周迭代开发


游戏上线后,可以进行周迭代模式。即每周开发新功能和修复bug,并每周估计时间停服更新。如果无版本更新,也要进行例行停服维护。  阅读全文
posted @ 2014-02-17 21:01 冬瓜 阅读(1295) | 评论 (0)编辑 收藏

仅列出标题
共16页: First 5 6 7 8 9 10 11 12 13 Last