gpt4 book ai didi

ios - 如何检测连续相互接触的相同类型节点(SpriteKit)

转载 作者:行者123 更新时间:2023-11-29 01:49:13 25 4
gpt4 key购买 nike

其实这是一个算法和实现的问题。

我有一个节点数组,这些节点有 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 属性的 Sprite 进行分组。它创建一个字典,其中包含 Sprite 的索引作为键和匹配 Sprite 的数组作为对象:

- (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);
}
}];
}

关于ios - 如何检测连续相互接触的相同类型节点(SpriteKit),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31590012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com