Обнаружение столкновения пикселей cocos2d - PullRequest
1 голос
/ 25 марта 2012

В настоящее время я пишу игру с несколькими прямоугольниками (скажем, 30), если пользователь нажимает на одну из четырех сторон, необходимо предпринять определенное действие. Проблема в том, что каждая карта будет иметь ту же сторону, которая будет выполнять это действие. Например, для прямоугольника 1 сторона, которая будет выполнять это действие, будет слева, а для прямоугольника 3 сторона будет верхней стороной. Я предполагаю, что здесь необходимо обнаружение столкновения пикселей. Что, вы парни, думаете? Также есть ли хороший пример столкновения пикселей при использовании cocos2s?

Ответы [ 3 ]

2 голосов
/ 25 марта 2012

Вы можете просто использовать следующий код

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

ИСПОЛЬЗОВАНИЕ выше CGRectIntersectsRect вы можете обнаружить пиксели столкновения в прямоугольной области.

0 голосов
/ 27 марта 2012

да, хорошая точка зрения, решение было немного грязным, но оно работало, вот что я сделал: я создал подкласс CCSprite и создал новый атрибут с именем state, сохраняющий текущую позицию, если повернуть ее относительно этого поворота.В зависимости от того, какая сторона была затронута, я использовал эту информацию, чтобы определить, какая сторона прямоугольника была затронута.-

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

+ (int) whichSideTouched: (SpriteCard *) sprite sideTouched: (int) коснулся touchSprite: (SpriteCard *) sprite2 {

switch (sprite.state) {case kStateUpPlus: case kStateUpMinus: if (touched == kStateDownPlus) {NSLog (@ "touched up");[sprite setTop: sprite2];retValue = kStateUpPlus;} else if (touch == kStateRightPlus) {NSLog (@ "touch left");[sprite setRight: sprite2];retValue = kStateLeftPlus;
}}

0 голосов
/ 26 марта 2012

Спасибо за этот 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");
    }

}
...