簡體   English   中英

如何檢測相同類型的節點彼此連續接觸(SpriteKit)

[英]How to detect same types of nodes touching each other consecutively (SpriteKit)

實際上,這實際上是一個算法和實現問題。

我有一個節點數組,這些節點有3種類型。 他們的特色是顏色。

我想檢測是否有幾個相同的節點連續接觸自己以創建關節或類似的東西。

例如,假設我的陣列中有一堆球,可以是紅色,藍色,綠色3種顏色。 我想找到包含5個元素的關節。

我嘗試了遍歷數組的遞歸方法。 但是有時它有時起作用,有時卻沒有。 所以我認為我的做法有一些缺陷。

- (void) findAdjacentNode:(BallSpriteNode*) currentNode from:(NSMutableArray*)currentNodes{

    for (BallSpriteNode *node in currentNodes) {
        float distance = [self getDistanceBetween:node.position and:currentNode.position];

        if ( distance - (node.size.width/2 + currentNode.size.width/2 ) <= 0
            && [node.currentColor isEqual:((BallSpriteNode*)currentNode).currentColor]
            && ![node isEqual:currentNode]
            && ![sameColorNodes containsObject:node])
        {
            [sameColorNodes addObject:node];
            [self findAdjacentNode:node from:currentNodes];
        }
    }

    if (sameColorNodes.count >=5) {
        [self removeSelectedNodesFromArray:sameColorNodes];
        return;
    }
}

感謝任何形式的幫助和領導。

我已經解決了我的問題,但是仍然隨機出現了一個小問題。 我的SKSpriteNode子類具有isRemoved變量,以跟蹤是否刪除了節點。 我看到我的問題出現了一次又一次地刪除相同的節點,從而導致無限循環。


編輯:通過更改我的實現,如下所示,我解決了我的主要問題,這已經很好。

if (sameColorNodes.count >=5) {
    bool isEligibleToRemove = YES;
    for (BallSpriteNode *node in sameColorNodes) {
        if (node.isRemoved) {
            isEligibleToRemove = NO;
            break;
        }
    }

    if(isEligibleToRemove){
        NSLog(@"%@",sameColorNodes);
        [self removeSelectedNodesFromArray:sameColorNodes];
    }
}

現在,我正在處理一個隨機發生的問題,很難解決。 有時我的方法無法將某些節點添加到sameColorNodes數組中,即使它們應該在其中。 例如,如果其中有9個組成一個組,則其中有8個將成為其中一個。 但是,如果它有5個節點,則每次都能正常工作。


編輯2:

這是我算法的最終版本。 我測試了它,並且工作正常。 如果為某個數組中的所有節點調用此方法。 它將找到所有相同顏色的節點,並通過相互觸摸來創建路徑。

- (void) findAdjacentNode:(BallSpriteNode*)currentNode from:(NSMutableArray*)currentNodes{

    recursiveCount ++;

    if(![sameColorNodes containsObject:currentNode]){
        [sameColorNodes addObject:currentNode];
    }

    for (BallSpriteNode *node in currentNodes) {
        float distance = [self getDistanceBetween:node.position and:currentNode.position];

        if (node.ballType == BrickBall) {
            continue;
        }

        if (distance - (node.size.width/2 + currentNode.size.width/2) <= 0
            && [node.currentColor isEqual:((BallSpriteNode*)currentNode).currentColor]
            && ![node isEqual:currentNode]
            && ![sameColorNodes containsObject:node])
        {
            [sameColorNodes addObject:node];
            [self findAdjacentNode:node from:currentNodes];
        }
    }

    recursiveCount --;

    if (sameColorNodes.count >=5 && recursiveCount == 0) {
        bool isEligibleToRemove = YES;
        for (BallSpriteNode *node in sameColorNodes) {
            if (node.isRemoved) {
                isEligibleToRemove = NO;
                break;
            }
        }

        if(isEligibleToRemove){
            NSLog(@"%@",sameColorNodes);
            [self removeSelectedNodesFromArray:sameColorNodes];        
        }
    }
}

更新:

以下各組精靈彼此接近且具有相同的currentColor屬性。 它創建一個字典,其中包含精靈的索引作為鍵,並包含一個匹配的精靈數組作為對象:

- (CGFloat) getDistanceBetween:(CGPoint)point1 and:(CGPoint)point2 {
    CGFloat dx = point1.x - point2.x;
    CGFloat dy = point1.y - point2.y;
    return sqrt(dx*dx+dy*dy);
}

- (void) countMatches:(NSMutableArray*)currentNodes {
    NSMutableDictionary *colorCount = [NSMutableDictionary dictionary];
    NSMutableArray *nodes = [currentNodes mutableCopy];
    for (NSUInteger i=0;i<nodes.count;i++) {
        BallSpriteNode *ball1 = [nodes objectAtIndex:i];
        NSNumber *key = [NSNumber numberWithUnsignedInteger:i];
        for (NSUInteger j=nodes.count-1;j>i;j--) {
            BallSpriteNode *ball2 = [nodes objectAtIndex:j];
            float distance = [self getDistanceBetween:ball1.position and:ball2.position];
            if (distance - (ball2.size.width/2 + ball1.size.width/2) <= 0
                && [ball2.currentColor isEqual:ball1.currentColor]) {
                NSMutableArray *nodeArray = [colorCount objectForKey:key];
                if (!nodeArray) {
                    nodeArray = [NSMutableArray arrayWithCapacity:5];
                }
                [nodeArray addObject:ball2];
                [colorCount setObject:nodeArray forKey:key];
                [nodes removeObjectAtIndex:j];
            }
        }
        NSMutableArray *nodeArray = [colorCount objectForKey:key];
        if (nodeArray) {
            [nodeArray addObject:ball1];
            [colorCount setObject:nodeArray forKey:key];
        }
    }

    [colorCount enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSArray *array = obj;
        if (array.count >= 5) {
            // Add code to join the nodes here
            NSLog(@"color: %@ count: %ld", key, array.count);
        }
    }];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM