Day 4: Adding User Input (Swipe, Touch, Button Events) #GameControls #PhaserInput

User input is a critical aspect of any game. On Day 4, we’ll implement various input methods—touch, swipe gestures, and button clicks—to make the game interactive and responsive across devices.


1. Understanding Input Handling in Phaser

Phaser provides flexible methods for handling user input:

  • Pointer Events: Touch and mouse interactions (e.g., pointerdown, pointerup).
  • Keyboard Events: Key presses for desktop gameplay.
  • Gestures: Swipe, drag, and multi-touch.

2. Adding Touch and Pointer Input

Step 1: Basic Touch Interaction

Update the create method in Game.js to add touch functionality:

    create() {
        this.player = this.add.image(400, 300, 'player').setInteractive();

        // Add touch interaction
        this.input.on('pointerdown', (pointer) => {
            this.player.x = pointer.x;
            this.player.y = pointer.y;
        });
    }
  • The player moves to the position where the user taps.

Step 2: Adding Dragging

Enable dragging for the player sprite:

    create() {
        this.player = this.add.image(400, 300, 'player').setInteractive();

        // Enable dragging
        this.input.setDraggable(this.player);

        this.input.on('drag', (pointer, gameObject, dragX, dragY) => {
            gameObject.x = dragX;
            gameObject.y = dragY;
        });
    }
  • Users can drag the player sprite across the screen.

3. Adding Swipe Gestures

Step 1: Detect Swipe Gestures

Track swipe start and end points to detect the direction:

    create() {
        let swipeStart = { x: 0, y: 0 };

        this.input.on('pointerdown', (pointer) => {
            swipeStart.x = pointer.x;
            swipeStart.y = pointer.y;
        });

        this.input.on('pointerup', (pointer) => {
            const deltaX = pointer.x - swipeStart.x;
            const deltaY = pointer.y - swipeStart.y;

            if (Math.abs(deltaX) > Math.abs(deltaY)) {
                if (deltaX > 0) {
                    console.log('Swipe Right');
                } else {
                    console.log('Swipe Left');
                }
            } else {
                if (deltaY > 0) {
                    console.log('Swipe Down');
                } else {
                    console.log('Swipe Up');
                }
            }
        });
    }

4. Adding Button Inputs

Step 1: Create a Button

Use Phaser’s built-in text objects to create a button:

    create() {
        this.startButton = this.add.text(400, 500, 'Start Game', {
            fontSize: '32px',
            color: '#ffffff',
            backgroundColor: '#0000ff',
        })
        .setOrigin(0.5)
        .setInteractive()
        .on('pointerdown', () => {
            console.log('Game Started!');
        });
    }

Step 2: Style the Button

Add hover effects for a better user experience:

    create() {
        this.startButton = this.add.text(400, 500, 'Start Game', {
            fontSize: '32px',
            color: '#ffffff',
            backgroundColor: '#0000ff',
        })
        .setOrigin(0.5)
        .setInteractive()
        .on('pointerdown', () => {
            console.log('Game Started!');
        })
        .on('pointerover', () => {
            this.startButton.setStyle({ backgroundColor: '#ff0000' });
        })
        .on('pointerout', () => {
            this.startButton.setStyle({ backgroundColor: '#0000ff' });
        });
    }

5. Integrating with React Native

Update the WebView in App.js:

Modify the phaserHTML to include the updated game logic:

const phaserHTML = `
    <html>
        <head>
            <script src="https://cdn.jsdelivr.net/npm/phaser@3/dist/phaser.min.js"></script>
            <script>
                const config = {
                    type: Phaser.AUTO,
                    width: 800,
                    height: 600,
                    backgroundColor: '#2d2d2d',
                    scene: {
                        preload: function () {
                            this.load.image('player', 'https://your-image-url.com/player.png');
                        },
                        create: function () {
                            let swipeStart = { x: 0, y: 0 };

                            this.player = this.add.image(400, 300, 'player').setInteractive();
                            this.input.setDraggable(this.player);

                            this.input.on('pointerdown', (pointer) => {
                                swipeStart.x = pointer.x;
                                swipeStart.y = pointer.y;
                            });

                            this.input.on('pointerup', (pointer) => {
                                const deltaX = pointer.x - swipeStart.x;
                                const deltaY = pointer.y - swipeStart.y;

                                if (Math.abs(deltaX) > Math.abs(deltaY)) {
                                    console.log(deltaX > 0 ? 'Swipe Right' : 'Swipe Left');
                                } else {
                                    console.log(deltaY > 0 ? 'Swipe Down' : 'Swipe Up');
                                }
                            });

                            this.input.on('drag', (pointer, gameObject, dragX, dragY) => {
                                gameObject.x = dragX;
                                gameObject.y = dragY;
                            });
                        },
                    },
                };
                new Phaser.Game(config);
            </script>
        </head>
        <body></body>
    </html>
`;

6. Running the Game

Step 1: Start the Development Server

npm start

Step 2: Test on a Mobile Device

  • Test touch, swipe, and button interactions in the Expo Go app.
See also  Day 8: Implementing Real-Time Security Updates with Firebase #SecureMobileApp #FirebaseSecurity

Next Steps

On Day 5, we’ll implement game state management and scoring, enabling tracking of player progress and points.

References and Links:

SEO Keywords: Phaser input handling, touch gestures in mobile games, swipe detection in Phaser, adding buttons in Phaser, React Native WebView game controls.

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.