我正在使用SpriteKit进行游戏。
我的主要精灵节点定义如下:
ball = [SKSpriteNode spriteNodeWithImageNamed:@"green"];
ball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:ball.frame.size];
ballcoordinates = CGPointMake(x, y);
ball.position = ballcoordinates;
ball.name = @"green";
[self addChild:ball];
我有其他球精灵.name字符串"蓝色,红色,黄色......"。它们被多次添加&安排在2d网格中。
基本上我的代码是:
使用touchesBegan选择一个球Sprite:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
touchedNode = (SKSpriteNode *)[self nodeAtPoint:[touch locationInNode:self]];
}
使用nodeAtPoint从周围(上,下,左,右)节点的坐标中选择周围节点。因此,对于右侧的节点,它看起来像:
CGPoint right= CGPointMake(touchedNode.position.x + 63, touchedNode.position.y);
SKNode *rightNode = [ball.parent nodeAtPoint:right];
如果触摸的字符串名称等于任何周围节点的字符串名称,则所有具有相同名称的节点都是A.)添加到数组B.)在检查所有周围节点后删除
NSMutableArray* ballArray;
[ballArray addObject:rightNode];
//Repeated for up,down,left
for (id ball in ballArray) {
[ball removeFromParent];
}
醇>
75%的时间它完美无瑕。另外25%,它一直有效,直到从父节点中删除节点。之后,如果我点击网格的另一个区域,我的.name字符串将返回已点击节点的正确名称,但对于周围节点则返回null。因此,我从nodeAtPoint选择节点的方式是错误的,或者removeFromParent正在删除属性。
我花了很多时间在这上面,但仍然感到难过。有什么建议?
答案 0 :(得分:1)
您是否认为在removeFromParent之后节点已经消失(取消分配)? ballArray本身不会保留直到3.中的方法结束,特别是它不会保留任何节点开始,因为假设上面的代码片段是你所有的,ballArray只是nil - 你没有分配一个实例的NSMutableArray。
将其更改为:
NSMutableArray* ballArray = [NSMutableArray array];
并且可能也会将声明移动到@interface,这样数组就变成了一个ivar,而不是在方法结束时释放的局部变量。