今天发现的问题,记录下,对cocos2d坐标转换的理解还不透彻,看来有必要去学习下OpenGL的基础知识了。
//使用的2dx是老版本.
1. 平时在CCLayer上放置的CCSprite,判断是否被点击到的,我一般这样做:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
//on "init" you need to initialize your instance
bool
HelloWorld::init()
{
bool
bRet =
false
;
do
{
CC_BREAK_IF(! CCLayer::init());
//Get window size.
CCSize size = CCDirector::sharedDirector()->getWinSize();
//pSprite is a CCSprite for test.
pSprite = CCSprite::spriteWithFile(
"fjut.png"
);
CC_BREAK_IF(! pSprite);
//Place the sprite on the center of the screen
pSprite->setPosition(ccp(size.width/2, size.height/2));
this
->addChild(pSprite, 0);
bRet =
true
;
}
while
(0);
this
->setIsTouchEnabled(
true
);
return
bRet;
}
void
HelloWorld::registerWithTouchDispatcher()
{
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(
this
, -1988,
true
);
}
static
CCRect getRect(CCNode* pNode)
{
CCRect rc;
rc.origin = pNode->getPosition();
rc.size = pNode->getContentSize();
rc.origin.x -= rc.size.width*0.5;
rc.origin.y -= rc.size.height*0.5;
return
rc;
}
void
HelloWorld::ccTouchEnded(CCTouch* pTouch, CCEvent* event)
{
CCPoint touchLocation = convertTouchToNodeSpace(pTouch);
if
(CCRect::CCRectContainsPoint(getRect(pSprite), touchLocation))
{
printf
(
"我被点中了!\n"
);
}
}
bool
HelloWorld::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
return
true
;
}
|
2. 要是在CCLayer1上放置CCLayer2(有偏移),再向CCLayer2上放置CCSprite的点击判断需要计算偏移量:
eg:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//on "init" you need to initialize your instance
bool
HelloWorld::init()
{
bool
bRet =
false
;
do
{
CC_BREAK_IF(! CCLayer::init());
bRet =
true
;
}
while
(0);
this
->setIsTouchEnabled(
true
);
this
->testLayer();
return
bRet;
}
void
HelloWorld::testLayer()
{
CCLayer* ly = CCLayer::node();
/*x, y轴各偏移100*/
ly->setPosition(ccp(100, 100));
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
//layer2 add to layer1
this
->addChild(ly);
pSprite = CCSprite::spriteWithFile(
"fjut.png"
);
pSprite->setPosition(ccp(20, 20));
ly->addChild(pSprite, 0);
}
void
HelloWorld::registerWithTouchDispatcher()
{
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(
this
, -1988,
true
);
}
static
CCRect getRect(CCNode* pNode)
{
CCRect rc;
rc.origin = pNode->getPosition();
rc.size = pNode->getContentSize();
/*x, y轴各偏移100*/
rc.origin.x -= rc.size.width*0.5 - 100;
//!!!!
rc.origin.y -= rc.size.height*0.5 - 100;
//!!!!
return
rc;
}
void
HelloWorld::ccTouchEnded(CCTouch* pTouch, CCEvent* event)
{
CCPoint touchLocation = convertTouchToNodeSpace(pTouch);
if
(CCRect::CCRectContainsPoint(getRect(pSprite), touchLocation))
{
printf
(
"我被点中了!\n"
);
}
}
bool
HelloWorld::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
return
true
;
}
|