Strange SpriteKit for loop error

I come across a very strange mistake that I just cannot understand. In my game, you drive a car on a two-dimensional plane, trying to avoid obstacles (for example, rock or a car). Obstacles can appear on 3 different tracks. Sometimes there is only one obstacle on any of the paths, and sometimes there are two obstacles on two of the three paths.

The problem I am facing is that when two obstacles appear and then are removed when they exit the screen, one of the obstacles that are currently moving on the screen is also “removed” (I know this because the console prints the “remote object” 3 times). But the obstacle that is randomly “removed” is not removed from the field of view. Instead, it freezes where it was before and never leaves.

Here is the code I'm having problems with:

var canGetScore = true
for (num,obj) in enumerate(obstaclesToMove) {
    obj.position.y -= CGFloat(gameSpeed)
    if obj.position.y <= userCar.position.y && obj.name == "NotPassed" {
        obj.name = "Passed"
        if canGetScore {
            canGetScore = false
            score += 1
            scoreLabel.text = "\(score)"
        }
    }
    if obj.position.y <= -CGRectGetMidY(self.frame) {
        obj.removeFromParent()
        obstaclesToMove.removeAtIndex(num)
        println("deleted object")
    }
}

Variable Key:

  • "ToMove obstacles" is an array of obstacles (SKSpriteNodes) that should be moved around the screen.

  • "gameSpeed" is an integer number of pixels that the screen moves every frame (in this case, the value is 5).

  • "userCar" is the character that the user controls (SKSpriteNode).

"canGetScore" - , . , , .

- , ? , .

: , .

+4
2

, , obstaclesToMove

, :

obstaclesToMove = [object1, object2, object3]

1 2, , , , 1, 2, , :

obstaclesToMove.removeAtIndex(0)
obstaclesToMove.removeAtIndex(1)

, , , , :

obstaclesToMove = [object1, object2, object3]
obstaclesToMove.removeAtIndex(0)
// obstaclesToMove = [object2, object3]
obstaclesToMove.removeAtIndex(1)
// obstaclesToMove = [object2]

, . , :

  • ,

:

var indexToDelete: [MyObstacleObject] = []
var canGetScore = true
for (num,obj) in enumerate(obstaclesToMove) {
    obj.position.y -= CGFloat(gameSpeed)
    if obj.position.y <= userCar.position.y && obj.name == "NotPassed" {
        obj.name = "Passed"
        if canGetScore {
            canGetScore = false
            score += 1
            scoreLabel.text = "\(score)"
        }
    }
    if obj.position.y <= -CGRectGetMidY(self.frame) {
        indexToDelete.append(num)
    }
}

indexToDelete.sort({ $0 > $1 })

for item in indexToDelete {
    obstaclesToMove[item].removeFromParent()
    obstaclesToMove.removeAtIndex(item)
    println("deleted object")
}

, , , , .

+1

, , , , , , . addObject removeObjectIdenticalTo (self.obstacles is NSMutableArray):

[self.obstacles addObject:asteroide]; //asteroide is subclass of SKSpriteNode 
[self.obstacles addObject:enemyShip];//enemyShip is subclass of SKSpriteNode 

, - :

[self.obstacles removeObjectIdenticalTo:asteroide];
[self.obstacles removeObjectIdenticalTo:enemyShip];

... , , - , , , , . :

    SKAction *sequence = [SKAction sequence:@[moveAsteroide,[SKAction runBlock:^{[asteroide removeFromParent]; [self.obstacles removeObjectIdenticalTo:asteroide];
               }]]];

  [asteroide runAction:sequence withKey:@"moving"];

, , , , (y = -obstacle.size.height), . , , , , , . , .

, , , . , : -)

+1

All Articles