Navigation

Part 5 - Player Details

Now that we've received the all important startgame event from the plugin, we're in a position where we can access the SDKs features. The core app and player details are already available from the plugin, which means you can access any of the following:

property details
supportedAPIs A list of supported APIs
contextID The game Context ID
contextType The game Context Type
locale The game locale
platform The platform the game is running on
version The SDK version
playerID Player ID
playerName Player Name
playerPhotoURL Player Photo URL


Let's use this to show the player's name and photo:

class PlayerDetails extends Phaser.Scene {

    constructor ()
    {
        super({ key: 'PlayerDetails', active: false });
    }

    create ()
    {
        this.add.bitmapText(400, 400, 'azo', this.facebook.playerName).setOrigin(0.5);

        this.facebook.loadPlayerPhoto(this, 'player').once('photocomplete', this.addPlayerPhoto, this);
    }

    addPlayerPhoto (key)
    {
        this.add.image(400, 200, key);
    }

}

The code should be pretty clear, but to explain: The playerName is a property of the plugin that contains the current player's name. There are other properties available too, but we just use the name for this screen. It is being displayed with a bitmap font.

Then we use the built-in loadPlayerPhoto method to use Phaser's internal Loader to grab the player photo and call addPlayerPhoto when it finishes loading.

The end result looks like this:

Player Details

Rather than use loadPlayerPhoto you could also use the Loader Plugin directly. Here is the same as the above, but using direct Loader calls:

class PlayerDetails extends Phaser.Scene {

    constructor ()
    {
        super({ key: 'PlayerDetails', active: false });
    }

    create ()
    {
        this.add.bitmapText(400, 400, 'azo', this.facebook.playerName).setOrigin(0.5);

        this.load.image('player', this.facebook.playerPhotoURL);

        this.load.once('filecomplete-image-player', this.addPlayerPhoto, this);

        this.load.start();
    }

    addPlayerPhoto (key)
    {
        this.add.image(400, 200, key);
    }

}

You'll get the same end result.

For a complete list of all the properties available, such as playerName, please see the plugin API documentation.

Modifying Player Photos

Very often you'll want to modify the player's photo. Perhaps to make it into a circle, or add some kind of mask to it. There are lots of ways to achieve this and here I'll present one of them: using a Canvas Texture object.

First, let's add a new function:

    addRoundedPlayerPhoto (key)
    {
        var photo = this.textures.createCanvas('playerMasked', 196, 196);

        var source = this.textures.get('player').getSourceImage();

        photo.context.beginPath();

        photo.context.arc(98, 98, 98, 0, Math.PI * 2, false);

        photo.context.clip();

        photo.draw(0, 0, source);

        this.add.image(400, 200, 'playerMasked');
    }

Here we create a new Canvas Texture called playerMasked. We draw an arc to it, just using the normal canvas operations, but set it to be a clipping path. Finally, we draw the image we've loaded from Facebook. The end result is a clipped photo:

Arc Photo

Rather than define a clipping path, you can also draw a masked image over the top of your photo. I created a simple 196 x 196 mask in Photoshop that looks like this:

Mask

You can apply it to the photo using the following method:

    addMaskedPlayerPhoto (key)
    {
        var photo = this.textures.createCanvas('playerMasked', 196, 196);

        var source = this.textures.get('player').getSourceImage();
        var mask = this.textures.get('mask').getSourceImage();

        photo.draw(0, 0, mask);

        photo.context.globalCompositeOperation = 'source-in';

        photo.draw(0, 0, source);

        this.add.image(400, 200, 'playerMasked');
    }

Where the composite blend mode of source-in allows us to achieve the end result we want:

Masked Photo

Obviously, the mask can look a lot better than the squiggle above, but hopefully you get the idea!