Skip to content
Snippets Groups Projects
index.html 5.53 KiB
Newer Older
GitLab's avatar
GitLab committed
<!DOCTYPE html>
<html>
anbak98's avatar
anbak98 committed
<head>
    <script src="./phaser-3.60.0/dist/phaser-arcade-physics.min.js"></script>
</head>
<body>
GitLab's avatar
GitLab committed

anbak98's avatar
anbak98 committed
    <script>
    class Example extends Phaser.Scene
    {
        showDebug = false;
        player;
        helpText;
        debugGraphics;
        cursors;
        map;

        preload ()
        {
            this.load.setBaseURL('https://https://raw.githubusercontent.com/Anbak98/anbak98.github.io/main/phaser3/');
anbak98's avatar
anbak98 committed
            this.load.image('tiles', 'assets/tilemaps/tiles/catastrophi_tiles_16.png');
            this.load.tilemapCSV('map', 'assets/tilemaps/csv/catastrophi_level2.csv');
            this.load.spritesheet('player', 'assets/sprites/spaceman.png', { frameWidth: 16, frameHeight: 16 });
        }

        create ()
        {
            // When loading a CSV map, make sure to specify the tileWidth and tileHeight
            this.map = this.make.tilemap({ key: 'map', tileWidth: 16, tileHeight: 16 });
            const tileset = this.map.addTilesetImage('tiles');
            const layer = this.map.createLayer(0, tileset, 0, 0);

            //  This isn't totally accurate, but it'll do for now
            this.map.setCollisionBetween(54, 83);

            this.anims.create({
                key: 'left',
                frames: this.anims.generateFrameNumbers('player', { start: 8, end: 9 }),
                frameRate: 10,
                repeat: -1
            });
            this.anims.create({
                key: 'right',
                frames: this.anims.generateFrameNumbers('player', { start: 1, end: 2 }),
                frameRate: 10,
                repeat: -1
            });
            this.anims.create({
                key: 'up',
                frames: this.anims.generateFrameNumbers('player', { start: 11, end: 13 }),
                frameRate: 10,
                repeat: -1
            });
            this.anims.create({
                key: 'down',
                frames: this.anims.generateFrameNumbers('player', { start: 4, end: 6 }),
                frameRate: 10,
                repeat: -1
            });

            this.player = this.physics.add.sprite(50, 100, 'player', 1);

            // Set up the player to collide with the tilemap layer. Alternatively, you can manually run
            // collisions in update via: this.physics.world.collide(player, layer).
            this.physics.add.collider(this.player, layer);

            this.cameras.main.setBounds(0, 0, this.map.widthInPixels, this.map.heightInPixels);
            this.cameras.main.startFollow(this.player);

            this.debugGraphics = this.add.graphics();

            this.input.keyboard.on('keydown-C', event =>
            {
                this.showDebug = !this.showDebug;
                this.drawDebug();
            });

            this.cursors = this.input.keyboard.createCursorKeys();

            this.helpText = this.add.text(16, 16, this.getHelpMessage(), {
                fontSize: '18px',
                fill: '#ffffff'
            });

            this.helpText.setScrollFactor(0);
        }

        update (time, delta)
        {
            this.player.body.setVelocity(0);

            // Horizontal movement
            if (this.cursors.left.isDown)
            {
                this.player.body.setVelocityX(-100);
            }
            else if (this.cursors.right.isDown)
            {
                this.player.body.setVelocityX(100);
            }

            // Vertical movement
            if (this.cursors.up.isDown)
            {
                this.player.body.setVelocityY(-100);
            }
            else if (this.cursors.down.isDown)
            {
                this.player.body.setVelocityY(100);
            }

            // Update the animation last and give left/right animations precedence over up/down animations
            if (this.cursors.left.isDown)
            {
                this.player.anims.play('left', true);
            }
            else if (this.cursors.right.isDown)
            {
                this.player.anims.play('right', true);
            }
            else if (this.cursors.up.isDown)
            {
                this.player.anims.play('up', true);
            }
            else if (this.cursors.down.isDown)
            {
                this.player.anims.play('down', true);
            }
            else
            {
                this.player.anims.stop();
            }
        }

        drawDebug ()
        {
            this.debugGraphics.clear();

            if (this.showDebug)
            {
                // Pass in null for any of the style options to disable drawing that component
                this.map.renderDebug(this.debugGraphics, {
                    tileColor: null, // Non-colliding tiles
                    collidingTileColor: new Phaser.Display.Color(243, 134, 48, 200), // Colliding tiles
                    faceColor: new Phaser.Display.Color(40, 39, 37, 255) // Colliding face edges
                });
            }

            this.helpText.setText(this.getHelpMessage());
        }

        getHelpMessage ()
        {
            return `Arrow keys to move.\nPress "C" to toggle debug visuals: ${this.showDebug ? 'on' : 'off'}`;
        }
    }

    const config = {
        type: Phaser.AUTO,
        width: 800,
        height: 600,
        backgroundColor: '#2d2d2d',
        parent: 'phaser-example',
        pixelArt: true,
        physics: {
            default: 'arcade',
            arcade: {
                gravity: { y: 0 }
            }
        },
        scene: Example
    };

    const game = new Phaser.Game(config);

    </script>

</body>
</html>