Swift Game Development(Third Edition)
上QQ阅读APP看书,第一时间看更新

Wiring up the sprite onTap events

Your games will often require the ability to run code when the player taps a specific sprite. I like to implement a system that includes all the sprites in your game so that you can add tap events to each sprite without building any additional structure. We have already implemented onTap methods in all of our classes that adopt the GameSprite protocol; we still need to wire up the scene to call these methods when the player taps the sprites.

Note

Before we move on, we need to remove the Core Motion code, since we will not be using it in the finished game. Once you finish exploring the Core Motion example, please remove it from the game by following the previous section's bullet points in reverse.

Implementing touchesBegan in the GameScene

SpriteKit calls our scene's touchesBegan function every time the screen is touched. We will read the location of the touch and determine the sprite node in that position. We can check whether the touched node adopts our GameSprite protocol. If it does, this means it must have an onTap function, which we can then invoke. Add the touchesBegan function before the GameScene class. I like to place it just after the didSimulatePhysics function:

override func touchesBegan(_ touches: Set<UITouch>, 
    with event: UIEvent?) { 
    for touch in (touches) { 
        // Find the location of the touch: 
        let location = touch.location(in: self) 
        // Locate the node at this location: 
        let nodeTouched = atPoint(location) 
        // Attempt to downcast the node to the GameSprite protocol 
        if let gameSprite = nodeTouched as? GameSprite { 
            // If this node adheres to GameSprite, call onTap: 
gameSprite.onTap() 
        } 
    } 
} 

That is all we need to do to wire up all of the onTap functions we have implemented on the game object classes we have made. Of course, all of these onTap functions are empty at the moment; we will now add some functionality to illustrate this effect.

Larger than life

Open your Player.swift file and locate the onTap function. Temporarily, we will expand the penguin to giant size when tapped to demonstrate that we have wired our onTap functions correctly. Add this code inside the penguin's onTap function:

print(" tapping on penguin")

Run the project and tap on the penguin. On the debug console, you will see the text getting printed out each time you tap on the penguin:

Larger than life

This example shows that our onTap functions work. You can remove the code you added to the Player class in the onTapfunction. We will keep the onTap wire-up code in GameScene so that we can use tap events later.