0

有人可以帮助我。我正在尝试使用 CCSprite 作为移动控制器,我可以拖动(左/右)来移动我的玩家角色。问题是当我在 CCSprite 之外触摸时,它仍然检测为 Active,这是我在 ccTouchBegan 上设置为 ACTIVE 的枚举,在 ccTouchEnded 方法中设置为 IDLE。默认情况下它处于空闲状态。不知道为什么当我开始触摸我的 CCSprite 之外时它会激活。

请指教。

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    BOOL touched = NO;

    CGPoint loc = [touch locationInView: touch.view];
    loc = [[CCDirector sharedDirector] convertToGL: loc];

    //avatar is a CCSprite...
    //inside of IF statement should not execute if I touch anywhere on screen 
    //outside of self.avatar sprite, but it still executes....
    if ( CGRectContainsPoint( [self.avatar boundingBox], loc) );
    {
        self.state = ACTIVE;
        self.action = MOVE_STOPPED; //player decides which direction to move, based on action state
        self.currPoint = self.prevPoint = self.avatar.position;
        touched = YES;
    }
    return touched;
}
4

2 回答 2

0

如果它对任何人有帮助,我就能解决这个问题。我没有继承 CCLayer,而是继承了 CCNode。在我的 ccTouchBegan 方法中,我进行了明确的边界检查,以查看触摸在 convertToNodeSpace 中的位置是否在精灵的 boundingBox 内。我从 SneakyInput 按钮类中借用了显式绑定检查。

这是 ccTouchBegan 方法。如果有人对如何在 CCLayer 的子类中执行此操作有任何想法,请告诉我,这样我就不必实现自己的 CCTouchOneByOneDelegate。

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    BOOL touched = NO;

    CGPoint loc = [touch locationInView: touch.view];
    loc = [[CCDirector sharedDirector] convertToGL: loc];
    loc = [self.avatar convertToNodeSpace: loc]; //YvesLeBorg's feedback

    float width = [self.avatar boundingBox].size.width;
    float height = [self.avatar boundingBox].size.height;
    //if ( CGRectContainsPoint( [self.avatar boundingBox], loc) );
    if ( loc.x < -width || loc.x > width || loc.y < -height || loc.y > height ) return touched;
    else
    {
        self.state = ACTIVE;
        self.action = MOVE_STOPPED;
        self.currPoint = self.prevPoint = self.avatar.position;
        touched = YES;
    }

//    CCLabelTTF *lbl = (CCLabelTTF *)[[[[CCDirector sharedDirector] runningScene] getChildByTag: -10] getChildByTag: 100];
//    NSString *str = [NSString stringWithFormat: @"Touch Pos: (%.2f, %.2f)", [self.avatar boundingBox].size.width, [self.avatar boundingBox].size.height ];
//    [lbl setString: str];

    return touched;
}
于 2013-05-13T02:46:23.467 回答
0

不是 100%,但在转换为 GL 后尝试添加:

loc = [self.avatar convertToNodeSpace:loc];
于 2013-05-12T11:35:06.960 回答