1

我目前正在写一个带有多个矩形(比如说30)的游戏,如果用户点击四边中的某一边需要采取某个动作。麻烦的是每张卡片都会有相同的一面执行此操作。例如,对于矩形1,将执行此操作的一侧将是左侧,而矩形3的一侧将是顶侧。我的猜测是在这里需要一个像素碰撞检测。你们有什么感想?还有一个关于使用cocos2s进行像素碰撞的好例子吗?cocos2d像素碰撞检测

回答

2

您可以简单地使用下面的代码

if (CGRectIntersectsRect(Rect1, Rect2)) 
{ 
    //Your code ...     
} 

使用上述CGRectIntersectsRect你可以一个矩形区域内检测到冲突的像素。

+0

我有,那部分工作正常,但现在我需要确定矩形的哪一侧是相交的,即左,右底部等,什么是最好的方法来实现这一目标? – godzilla 2012-03-25 13:11:52

+0

取两个矩形的中心点,并查看它们是相对于彼此的位置(即x1大于x2?如果是,则rect1在rect2的右边)。 – LearnCocos2D 2012-03-25 19:16:55

0

感谢您的Dhaval,这里是我写的代码,我希望做类似的任何人的未来参考,它可以进一步微调,如果我找出一个更准确的方式做到这一点,我会相应地更新此线程

-(void)touchWhichSide:(CCSprite *)sprite1 collidingSprite:(CCSprite *)sprite2 
{ 
    BOOL retValue = NO; 

    CGPoint spriteCentre1 = sprite1.position; 
    CGPoint spriteCentre2 = sprite2.position; 

    NSLog(@"X %f",spriteCentre2.x - spriteCentre1.x); 
    NSLog(@"Y %f",spriteCentre1.y - spriteCentre2.y); 
    float xAxisDiff = spriteCentre1.x - spriteCentre2.x; 
    float yAxisDiff = spriteCentre1.y - spriteCentre2.y; 

    NSLog(@"x axis %f",xAxisDiff); 
    NSLog(@"y axis %f",yAxisDiff); 

    if((spriteCentre1.x < spriteCentre2.x) && (xAxisDiff < yAxisDiff)) 
    { 
     NSLog(@"right touch"); 
    } 
    else if((spriteCentre2.x < spriteCentre1.x) && (xAxisDiff > yAxisDiff)) 
    { 
     NSLog(@"left touch"); 
    } 
    else if((spriteCentre2.y < spriteCentre1.y) && (yAxisDiff > xAxisDiff)) 
    { 
     NSLog(@"Bottom touch"); 
    } 
    else if((spriteCentre1.y < spriteCentre2.y) && (yAxisDiff < xAxisDiff)) 
    { 
     NSLog(@"Top touch"); 
    } 

} 
+0

啊是的......但如果精灵旋转了呢! – 2012-03-26 15:15:54

+1

是的好点,解决方案有点混乱,但它的工作,这就是我所做的:我分类CCSprite并创建一个新的属性称为状态保存当前位置,如果旋转相对于该旋转。根据触摸哪一面,我将使用该信息来确定矩形的哪一面被触摸。 – godzilla 2012-03-26 20:43:54

0

是好点了,该解决方案是一个有点混乱,但它的工作,这是我做的:我的子类CCSprite和创建节约当前位置好像相对于该转动而转动名为状态的新属性。根据触摸哪一面,我将使用该信息来确定矩形的哪一面被触摸。 -

if((spriteCentre1.x < spriteCentre2.x) && (xAxisDiff < yAxisDiff)) 
    { 
    [HelloWorldLayer whichSideTouched:sprite1 sideTouched:kStateRightPlus touchingSprite:sprite2]; 
} 

+(int)的whichSideTouched:(SpriteCard *)精灵sideTouched:(int)的触摸touchingSprite:(SpriteCard *)sprite2 {

开关(sprite.state){ 情况kStateUpPlus: kStateUpMinus: if(touched == kStateDownPlus) { NSLog(@“touch up”); [sprite setTop:sprite2]; retValue = kStateUpPlus; (触摸== kStateRightPlus) { } NSLog(@“touch left”); [sprite setRight:sprite2]; retValue = kStateLeftPlus;
} }