-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


Phaser Node.js

, 02 2017 . 12:05 +
, ! real-time 2D node.js phaser.js.

, , , . , , node.js phaser.js , , .

, 2d . , , - :

image

, :
node.js;
express;
socket.IO;
phaser.js

:
var express = require('express');  // 
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http); // socket.IO
var port = process.env.PORT || 3000; //        

var players = {}; //   

/*   ,      */
io.on("connection", function(socket) {  
    console.log('an user connected ' + socket.id); //   node.js   ,    

    players[socket.id] = {
        "x": Math.floor(Math.random(1) * 2000),
        "y": Math.floor(Math.random(1) * 2000),
        "live": true,
    }; //   


    io.sockets.emit('add_player', JSON.stringify({
        "id": socket.id,
        "player": players[socket.id]
    })); //    

    socket.emit('add_players', JSON.stringify(players));//     (   )

    socket.on('player_rotation', function(data) {
        io.sockets.emit('player_rotation_update', JSON.stringify({
            "id": socket.id,
            "value": data
        }));
    }); //                 


    socket.on('player_move', function(data) {
        data = JSON.parse(data); //    

        data.x = 0; //    x      ,    
        data.y = 0; //  ,   y

       /*       */
        switch (data.character) {
            case "W":
                data.y = -5;
                players[data.id].y -= 5;
                break;
            case "S":
                data.y = 5;
                players[data.id].y += 5;
                break;
            case "A":
                data.x = -5;
                players[data.id].x -= 5;
                break;
            case "D":
                data.x = 5;
                players[data.id].x += 5;
                break;
        }
        io.sockets.emit('player_position_update', JSON.stringify(data)); //   
    });

    socket.on('shots_fired', function(id) {  // id 
        io.sockets.emit("player_fire_add", id); //        
    });

    socket.on('player_killed', function (victimId) { //     
		
		io.sockets.emit('clean_dead_player', victimId);  //   
		players[victimId].live = false; //      
        io.sockets.connected[victimId].emit('gameOver', 'Game Over'); //        
		
	});


    socket.on('disconnect', function() { //    
        console.log("an user disconnected " + socket.id); 
        delete players[socket.id];
        io.sockets.emit('player_disconnect', socket.id);
    });
});

app.use("/", express.static(__dirname + "/public")); //   
app.get("/", function(req, res) {
    res.sendFile(__dirname + "/public/index.html"); //  
}); 

http.listen(port, function() {
    console.log('listening on *:' + port); //  
});


:

var width = window.innerWidth; //  
var height = window.innerHeight; //  

var game = new Phaser.Game(width, height, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render }); //        ;

/*    */
var player;
var socket, players = {};
var map;
var map_size = 2000; // 
var style = { font: "80px Arial", fill: "white" }; //   "Game Over"
var text;
var bullets;

var fireRate = 100;
var nextFire = 0;
var balls;
var ball;
var player_speed = 400; //  
var live;
var moveBullets;

/*  */
function preload() {
    game.load.image('unit', 'img/unit.png');
    game.load.image('bullet', 'img/bullet.png');
    game.load.image('killer', 'img/killers.png');
    game.load.image('map', 'img/grid.png');
}

function create() {
    socket = io.connect(window.location.host); // 

    game.physics.startSystem(Phaser.Physics.ARCADE); 

    game.time.advancedTiming = true;
    game.time.desiredFps = 60;
    game.time.slowMotion = 0;

    bg = game.add.tileSprite(0, 0, map_size, map_size, 'map'); // 
    game.world.setBounds(0, 0, map_size, map_size); // 
    game.stage.backgroundColor = "#242424"; // 

    socket.on("add_players", function(data) {
        data = JSON.parse(data);
        for (let playerId in data) {
            if (players[playerId] == null && data[playerId].live) {
                addPlayer(playerId, data[playerId].x, data[playerId].y, data[playerId].name);
            }
        }
        live = true;
    }); // 

    socket.on("add_player", function(data) {
        data = JSON.parse(data);
        if (data.player.live) {
            addPlayer(data.id, data.player.x, data.player.y, data.player.name);
        }
    }); // 

    socket.on("player_rotation_update", function(data) {
        data = JSON.parse(data);
        players[data.id].player.rotation = data.value;
    }); //   ,   

    socket.on("player_position_update", function(data) {
        data = JSON.parse(data);
        players[socket.id].player.body.velocity.x = 0;
        players[socket.id].player.body.velocity.y = 0;

        players[data.id].player.x += data.x;
        players[data.id].player.y += data.y;

    }); //  

    socket.on('player_fire_add', function(id) {
            players[id].weapon.fire();        
    }); // 

    game.input.onDown.add(function() {
        socket.emit("shots_fired", socket.id);
    }); // 

    socket.on('clean_dead_player', function(victimId) {
        if (victimId == socket.id) {
            live = false;
        }
        
        socket.on("gameOver", function(data){
            text = game.add.text(width / 2, height / 2, data, { font: "32px Arial", fill: "#ffffff", align: "center" });
            text.fixedToCamera = true;
            text.anchor.setTo(.5, .5);
        });
        players[victimId].player.kill();

    }); //             

    socket.on('player_disconnect', function(id) {
        players[id].player.kill();
    }); //    

    keybord = game.input.keyboard.createCursorKeys(); // 
}
 

function update() {
    if (live == true) {
        players[socket.id].player.rotation = game.physics.arcade.angleToPointer(players[socket.id].player); //    
        socket.emit("player_rotation", players[socket.id].player.rotation); //     
        setCollisions(); //      
        characterController(); // 
    }
}


function bulletHitHandler(player, bullet) {
    socket.emit("player_killed", player.id);
    bullet.destroy(); //    ,  
} //     

function setCollisions() {
    for (let x in players) {
        for (let y in players) {
            if (x != y) {
                game.physics.arcade.collide(players[x].weapon.bullets, players[y].player, bulletHitHandler, null, this);
            }
        }
    }
} //    

function sendPosition(character) {
    socket.emit("player_move", JSON.stringify({
        "id": socket.id,
        "character": character
    }));
} //   ,     

function characterController() {

    if (game.input.keyboard.isDown(Phaser.Keyboard.A) || keybord.left.isDown) {
        //players[socket.id].player.x -= 5;
        sendPosition("A");
    }
    if (game.input.keyboard.isDown(Phaser.Keyboard.D) || keybord.right.isDown) {
        //players[socket.id].player.x += 5;
        sendPosition("D");
    }
    if (game.input.keyboard.isDown(Phaser.Keyboard.W) || keybord.up.isDown) {
        //players[socket.id].player.y -= 5;
        sendPosition("W");
    }
    if (game.input.keyboard.isDown(Phaser.Keyboard.S) || keybord.down.isDown) {
        //players[socket.id].player.y += 5;
        sendPosition("S");
    }
} //


function render() {
    game.debug.cameraInfo(game.camera, 32, 32);
}

function addPlayer(playerId, x, y) {
    player = game.add.sprite(x, y, "unit");
    game.physics.arcade.enable(player);
    player.smoothed = false;
    player.anchor.setTo(0.5, 0.5);
    player.scale.set(.8);
    player.body.collideWorldBounds = true; // 
    player.id = playerId;

    let weapon = game.add.weapon(30, 'bullet'); //  
    weapon.bulletKillType = Phaser.Weapon.KILL_WORLD_BOUNDS;
    weapon.bulletSpeed = 600; // 
    weapon.fireRate = 100;
    weapon.trackSprite(player, 0, 0, true);

    players[playerId] = { player, weapon };
    game.camera.follow(players[socket.id].player, ); //     
} //      :)


, ( heroku) :
github.com/Dmitry-Rudenko/phaser_mmo_shooter

, , .

, -.

, .

!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330058/

:  

: [1] []
 

:
: 

: ( )

:

  URL