数组中所有对象的 SKSpriteNode moveTo:X

SKSpriteNode moveTo:X for all in array

        for (int i = 0; i < [playerCards count]; i++) {
            int cardsLaid = i * (cardDisplay.size.width / 3);
            CGPoint forPoint = CGPointMake((0.5 - (self.frame.size.width / 4)) + cardsLaid, 0.0);

            playerCards[i]

            [??? runAction:[SKAction moveTo:forPoint duration:0.6]];
        }

我需要某种 SKSpriteNode withName : X move to point : forPoint;

不多说了,基本上就是牌从一个位置移动,留下一个空位。然后在那张牌从 Players 数组中移出后,这些牌应该像以前一样收紧。然而,事实证明,以 CardSpriteNodes 为目标很困难。

正如您所看到的位置,它将过滤阵列中的所有卡片,我将乘以它们之间的差距,因此对它们进行排序。但我无法针对数组中的特定卡片,它们通过 .names

存储在数组中

-编辑-

如您所见,它们向上移动后,与它们被带走的位置留下了一个空隙。上面的卡片现在是 cardsPlayed,下面的车是 playerCards NSMutableArrays

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    SKNode *node = [self nodeAtPoint:location];
    if ([node isKindOfClass:[CardSpriteNode class]]) {
        int add = (int)[playerCards count] * (cardDisplay.size.width / 3);
        CGPoint origPos = CGPointMake(-self.frame.size.width/2.8 + add, -218);

        if ([cardsPlayed containsObject:node.name]) {
            //Card is already played, return to original position and remove from array.
            CGPoint point = origPos;

            [node runAction:[SKAction moveTo:point duration:0.6]];

            node.zPosition = zPosCount;
            zPosCount += 1;

            [cardsPlayed removeObject:node.name];
            [playerCards addObject:node.name];

            NSLog(@"this ran");
        } else {
            //Card is not already played, position to add card and add to array.
            amountOfCardsLaid = (int)[cardsPlayed count] * (cardDisplay.size.width / 3);
            CGPoint point = CGPointMake((0.5 - (self.frame.size.width / 4
            )) + amountOfCardsLaid, 0.0);
            [node runAction:[SKAction moveTo:point duration:0.6]];

            node.zPosition = zPosCount;
            zPosCount += 1;

            [playerCards removeObject:node.name];
            [cardsPlayed addObject:node.name];

            for (int i = 0; i < [playerCards count]; i++) {
                int cardsLaid = i * (cardDisplay.size.width / 3);
                CGPoint forPoint = CGPointMake((0.5 - (self.frame.size.width / 4)) + cardsLaid, 0.0);

                playerCards[i]

                [??? runAction:[SKAction moveTo:forPoint duration:0.6]];
            }
        }

        //Hide.Unhide buttons
        if ([cardsPlayed count] == 0) {
            if (addButton.hidden == FALSE) addButton.hidden = true;
            if (cancelButton.hidden == FALSE) cancelButton.hidden = true;
        } else {
            if (addButton.hidden == TRUE) addButton.hidden = false;
            if (cancelButton.hidden == TRUE) cancelButton.hidden = false;
        }
    }
}

所以正如你所看到的,当一张牌从底部被拿走时它会回到顶部。当它在顶部时,如果再次按下,它将移动到底部卡片的最后一个位置并重新添加到该数组中。但是,一旦卡片向上移动,我需要关闭 gap

为了实现这一点,我打算过滤每个包含 CardSpriteNode (SKSpriteNode) .name 的 playerCards 数组,并使用 forloop 移动每个数组。但是无法确切地弄清楚如何 select playerCard 中的每张卡片的名称?

我想我更了解你的问题。要解决上述问题,请使用卡片的原始点并通过 right/left 侧使用该区域的宽度调用光线投射,并增加所有具有名称的节点的距离(假设您调用了您的卡片"cards") 超过适当的距离。不需要特定的顺序,因为您正在将具有该名称的所有节点移动相同的距离。使用

hitTestWithSegmentFromPoint:toPoint:options:

否则,您必须枚举您的节点和一些如何用标志标记 SKSpriteNode 对象,以通知您它是已播放还是在手。枚举的时候一定要得到一个总距离,计算出每张牌必须占据的位置。您应该能够使用数组来记录卡片从左到右的位置,并将该对象的索引乘以计算出的距离,再将总距离除以卡片总数。 (不要忘记您可以使用 indexOfObject:on NSArrayfind(arr, "d") in Swift 从数组中获取对象的索引。

我也在业余时间写了一个纸牌游戏,所以我知道你正在看的问题。我创建了 SKSpriteNode 的子类,在其中我有卡片具有不同值的键。

然而,如果你想让它更基本,你甚至不需要这样做,只需设置 SKSpriteNode 的名称 属性,然后使用 enumerateChildNodesWithName: 方法或 for loop 与评论中建议的 if statement