数组中所有对象的 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 NSArray
或 find(arr, "d")
in Swift 从数组中获取对象的索引。
我也在业余时间写了一个纸牌游戏,所以我知道你正在看的问题。我创建了 SKSpriteNode 的子类,在其中我有卡片具有不同值的键。
然而,如果你想让它更基本,你甚至不需要这样做,只需设置 SKSpriteNode 的名称 属性,然后使用 enumerateChildNodesWithName:
方法或 for loop
与评论中建议的 if statement
。
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 NSArray
或 find(arr, "d")
in Swift 从数组中获取对象的索引。
我也在业余时间写了一个纸牌游戏,所以我知道你正在看的问题。我创建了 SKSpriteNode 的子类,在其中我有卡片具有不同值的键。
然而,如果你想让它更基本,你甚至不需要这样做,只需设置 SKSpriteNode 的名称 属性,然后使用 enumerateChildNodesWithName:
方法或 for loop
与评论中建议的 if statement
。