代码之家  ›  专栏  ›  技术社区  ›  thyrgle

为什么这只检测到精灵中心的触摸?

  •  0
  • thyrgle  · 技术社区  · 15 年前

    我尝试用以下代码让手指拖动ccsprite:

    -(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
        CGPoint location = [touch locationInView: [touch view]];
        CGPoint convertedCoordinate = [[CCDirector sharedDirector] convertToGL:location];
    
        CGRect redCircleRect = CGRectMake(redCircle.position.x, redCircle.position.y, redCircle.contentSize.width, redCircle.contentSize.height);
        CGRect redCircle2Rect = CGRectMake(redCircle2.position.x, redCircle2.position.y, redCircle2.contentSize.width, redCircle2.contentSize.height);
    
        if(CGRectContainsPoint(redCircleRect, convertedCoordinate)) {
            //redCircle.position = ccp(convertedCoordinate.x, convertedCoordinate.y);
            NSLog(@"Touched");
            spriteIndex = 1;
        }
        else if(CGRectContainsPoint(redCircle2Rect, convertedCoordinate)) {
            //redCircle2.position = ccp(convertedCoordinate.x, convertedCoordinate.y);
            NSLog(@"Touched2");
            spriteIndex = 2;
        }
        else {
            spriteIndex = 0;
        }
        return YES;
    }
    -(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {
        CGPoint location = [touch locationInView: [touch view]];
        CGPoint convertedCoordinate = [[CCDirector sharedDirector] convertToGL:location];   
    
        if (spriteIndex == 1) {
            redCircle.position = ccp(convertedCoordinate.x, convertedCoordinate.y);
        }
        else if (spriteIndex == 2) {
            redCircle2.position = ccp(convertedCoordinate.x, convertedCoordinate.y);
        }
    
        //CGRect RedCircleRect = CGRectMake(redCircle.position.x, redCircle.position.y, redCircle.contentSize.width, redCircle.contentSize.height);
        //CGRect RedCircle2Rect = CGRectMake(redCircle.position.x, redCircle.position.y, redCircle.contentSize.width, redCircle.contentSize.height);
    

    }

    我的逻辑如下:

    ccTouchesBegan 我得到了触摸的位置,将其转换为正确的坐标,然后制作两个CGRECT,假设它们与我声明的两个精灵的尺寸和位置相同。然后,我用 CGRectContainsPoint . 在那里,我有一个全局int spriteIndex 我根据接触到的圆指定一个值。

    下一步,在 ccTouchesMoved 我检查是否 斯普利特指数 已经给出了我要移动的两个精灵中的一个的“索引”,如果是的话,将选中精灵的位置设置为触摸位置。

    问题:

    这个代码只起作用。它允许我拖动ccsprites,但仅当我单击中心时。sprite是40×40像素,所以它绝不是小的。

    1 回复  |  直到 15 年前
        1
  •  0
  •   thyrgle    15 年前

    在上找到答案 another forum :

    CGRect redCircleRect = CGRectMake(redCircle.position.x, redCircle.position.y, redCircle.contentSize.width, redCircle.contentSize.height);
    CGRect redCircle2Rect = CGRectMake(redCircle2.position.x, redCircle2.position.y, redCircle2.contentSize.width, redCircle2.contentSize.height);
    

    应该是:

    CGRect redCircleRect = CGRectMake(redCircle.position.x-20.0, redCircle.position.y-20.0, 40.0, 40.0);
    CGRect redCircle2Rect = CGRectMake(redCircle2.position.x-20.0, redCircle2.position.y-20.0, 40.0, 40.0);
    

    这是因为,CGRECT副本是从中心指针生成的,应该从左下角进行复制。

    推荐文章