非常不错,够详细
大侠赞一个
工程用的是cocos2d-x 2.0.1, 等有??我再更新一下吧.
— Begin quote from ____
ava 发表于 2013-4-11 00:09 url
我修改了一个版本支持 cocos2d-x v2.1地址为:https://github.com/mecoolshow/SneakInput
— End quote
支持!请持续更新,比如CCTime改成float,等。
我不知道是什么原因,用LZ的方法修改了部分sneaky的代码,从而希望能支持cocos2dx 2.0版本的,但是似乎修改的不够多,好像有些地方不对
运行的时候崩溃在这里
void SneakyButtonSkinnedBase::setContentSize(CCSize s)
{
CCLayer::setContentSize(s);
defaultSprite->setContentSize(s);
//button->setRadius(s.width/2);
}
跟踪了,发现是这个问题
首先是创建的时候调用是这样的:
SneakyJoystickSkinnedBase *joystickBase = new SneakyJoystickSkinnedBase();
joystickBase->autorelease();
joystickBase->init();
joystickBase->setBackgroundSprite(CCSprite::createWithSpriteFrameName(“circleBig.png”));
这里有个init方法,
源代码init包含下列代码,即先调用了cclayer的init方法,然后再对成员变量初始化为null,注意这里的backgroundSprite
bool SneakyJoystickSkinnedBase::init()
{
bool pRet = false;
if(CCLayer::init()){
this->backgroundSprite = NULL;
this->thumbSprite = NULL;
this->joystick = NULL;
this->schedule(schedule_selector(SneakyJoystickSkinnedBase::updatePositions));
pRet = true;
}
return pRet;
}
但是cclayer的init方法会执行下列代码
this->setContentSize(pDirector->getWinSize());
而setContentSize是虚函数,于是他就执行了void SneakyJoystickSkinnedBase::setContentSize(CCSize s),而这个setContentSize的代码如下
void SneakyJoystickSkinnedBase::setContentSize(CCSize s)
{
CCLayer::setContentSize(s);
backgroundSprite->setContentSize(s);
//joystick.joystickRadius = s.width/2;
}
这里backgroundSprite还没有初始化为null,或者说根本就没赋过值,所以就崩溃了
当然可以肯定的是,这里的这段代码本身写出来的时候就不怎么安全,
至少也应该先判断下是否为null
if (backgroundSprite)
{
backgroundSprite->setContentSize(s);
}
从上面来看,原因应该是backgroundSprite初始化的时机太晚了,至少要在init方法之前初始化,
所以我修改了代码,加入了构造函数
并且初始化了几个成员变量,这样就好用了。
不知道LZ是否有碰到这样的问题,又没人弄了一个比较完整正确的s可以在cocos2dx 2.0版本使用的sneaky???
— Begin quote from ____
dickinchina 发表于 2012-7-21 14:34 url
我不知道是什么原因,用LZ的方法修改了部分sneaky的代码,从而希望能支持cocos2dx 2.0版本的,但是似乎修改 …
— End quote
??指正.
我把一?的工程更新了至 cocos2d-x 2.0.1.
有用,刚好最近在学,参考一下
鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎:):):)
哪里下载你的Demo呢》?