在我的spritekit游戏中,我通过更新方法随机创建Stone。这是我随机创建石头的代码
//Create random island
-(void)createRandomStone:(NSMutableArray *)imageArray
{
int getRandomNumberCoordinate = [self getRandomNumberBetween:(int)0 to:(int)768];
int getRandomStoneImage = [self getRandomNumberBetween:0 to:(int)([imageArray count] - 1)];
NSLog(@"Stone Image name = %d", getRandomStoneImage);
SKSpriteNode *createStone = [SKSpriteNode spriteNodeWithTexture:[imageArray objectAtIndex:getRandomStoneImage]];
if((getRandomNumberCoordinate + createStone.size.height / 2) > 768 )
createIsland.position = CGPointMake(_myScreenSize.width + createStone.size.width, 768 - createStone.size.height / 2);
else if((getRandomNumberCoordinate - createStone.size.height / 2) < 0 )
createStone.position = CGPointMake(_myScreenSize.width + createStone.size.width, 0 + createIsland.size.height / 2);
else
createStone.position = CGPointMake(_myScreenSize.width + createStone.size.width, getRandomNumberCoordinate);
createStone.name = @"Stone";
createStone.zPosition = 3;
[self addChild:createStone];
//Apply physics on the Stone
createStone.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize: CGSizeMake(createStone.size.width - createStone.size.width / 4, createStone.size.height - createStone.size.height / 6)];
createStone.physicsBody.categoryBitMask = CollisionTypeStone;
createStone.physicsBody.contactTestBitMask = CollisionTypeMan;
createStone.physicsBody.usesPreciseCollisionDetection = YES;
createStone.physicsBody.collisionBitMask = 0;
}
石头从坐标1024移动到0,如果任何石头越过0坐标,石头将通过使用代码移除
-(void)updateStonePosition:(NSString *)whichDirection andMoveAmount:(float)speed
{
for (SKNode* node in self.children)
{
if([node.name isEqualToString:@"Stone"])
{
node.position = CGPointMake(node.position.x - speed, node.position.y);
if(node.position.x < -node.frame.size.width / 2)
[node removeFromParent];
}
}
}
以上两种方法都是从update方法调用的。如果该男子击中任何5石头,那么游戏将再次重新加载。重新加载代码是:
[self.view presentScene:[[MyScene alloc] initWithSize:self.size] transition:[SKTransition doorsCloseHorizontalWithDuration:0.5f]];
游戏重新加载,但几秒后,错误信息显示行上的EXC_BAD_ACCESS(代码= 2,地址= 0x0)
SKSpriteNode *createStone = [SKSpriteNode spriteNodeWithTexture:[imageArray objectAtIndex:getRandomStoneImage]];
请帮忙。提前谢谢。
答案 0 :(得分:1)
对我而言,使用您提供的代码/信息,似乎当您的场景重新加载时,您传递给#34; createRandomStone:&#34;是零。
在调用方法之前尝试检查nil:
if (imageArray != nil) {
// call createRandomStone
} else {
NSLog(@"imageArray is nil")
}
看看是否有助于确定错误的根本原因。
答案 1 :(得分:0)
我还试图找出一些信息,如何重置/重启 SpriteKit 游戏,但我没有成功。我没有花足够的时间来找出为什么在我的情况下发生这种情况,可能应该尝试在转换发生之前进行一些清理,例如删除所有操作和可能所有节点......但我找到了自己的解决方法.. < / p>
所以当你打电话/做过渡到同一场景时,似乎正在发生崩溃,所以我所做的就是:
1)我转换到我的 ResetScene ,这只是一个空场景 - 使用一些参数,以便我可以识别前一个场景
2)在DidMoveToView的 ResetScene 中,我转换回我之前的场景
这就是我解决这个问题的方法,但我不认为这是一个理想的解决方案。请注意,您无法确定存在2个转换而不是1个转换的区别。
让我们看看是否有人会以更多的智慧加入这个主题:)
答案 2 :(得分:0)
如果你的imageArray不是nil,并且你有多个项目,并且它仍在崩溃,那么你可能会遇到一个SpriteKit的物理主体(或其他地方的skshapenodes)的错误。 请参阅此主题..:https://stackoverflow.com/a/25007468/557362
我自己遇到过这种问题,我在常见的场景基类中有代码来清理场景,但我没有使用物理机构 - 这可能是你的问题(见链接)。 / p>
-(void)cleanUp
{
[self cleanUpChildrenAndRemove:self];
}
- (void)cleanUpChildrenAndRemove:(SKNode*)node {
for (SKNode *child in node.children) {
[self cleanUpChildrenAndRemove:child];
}
[node removeFromParent];
}
我还发现崩溃发生在转换上 - 如果我在转换后延迟清理一秒钟(并且让场景保持足够长时间),我没有崩溃。 E.g。
SKTransition* doors = [SKTransition fadeWithDuration:0.75];
[[self view] presentScene:newscene transition:doors];
SKNode* dummynode = [SKNode node];
// wait for the transition to complete before we give up the reference to oldscene
[dummynode runAction:[SKAction waitForDuration:2.0] completion:^{
// failing to clean up nodes can result in crashes... nice.
[((MySceneBaseClass*)oldscene) cleanUp];
}];
[newscene addChild:dummynode];