• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Colyseus轻量级多人游戏免费开源解决方案

武飞扬头像
NMGWAP
帮助1

点击上方“青年码农”关注

回复“源码”可获取各种资料

Colyseus 是一个独特的多人游戏框架,被用于许多 H5 小游戏和手机游戏中,使用容易,且选项众多,可满足开发者多样化的需求。如果你在制作多人联网游戏时遇到过各种扩展性需求和细节问题造成的项目阻碍,那么推荐你使用这个免费的开源解决方案。

这个框架也是最近接触,自己在摸索过程中遇到很多坑,因此记录下。文章基于 Express TS 演示及说明。

在使用 Colyseus 框架之前,我们要满足 Colyseus 的运行环境。

  1. 下载并安装 Node.js V14.0 或更高版本(使用 nvm 或者 n 来管理 Node 版本)

  2. 下载并安装 Git SCM

  3. 下载并安装 Visual Studio Code (或者您喜欢的其他编辑器)

安装

安装过程和其他 npm 库一样,用 npm、yarn 或者其他都可以,但是要注意,npm 库中有 colyseus 和 colyseus.js,这两个有区别,一个是给服务端用的,一个是给客户端用的。

  • colyseus:Node 环境,也就是服务端

  • colyseus.js:前端环境,也就是客户端

  1.  
    npm i colyseus
  2.  
    # or
  3.  
    yarn add colyseus

配置

在 app.ts 文件中引入 colyseus ,

  1.  
    var express = require("express");
  2.  
    import { Server } from "colyseus";
  3.  
    import { WebSocketTransport } from "@colyseus/ws-transport";
  4.  
    import { createServer } from "http";
  5.  
    const port = 3300;
  6.  
     
  7.  
    var app = express();
  8.  
    const server = createServer(app);
  9.  
    const gameServer = new Server({
  10.  
      transport: new WebSocketTransport({
  11.  
        server
  12.  
      })
  13.  
    });
  14.  
     
  15.  
    gameServer.listen(port);
学新通

启动项目,如果没有报错,colyseus 服务就启动成功了,地址就是 IP 3300,客户端创建 client 就可以链接到这个服务了。

var client = new Colyseus.Client("ws://127.0.0.1:3300");

通过上面我们只是简单的有了服务可以使用,游戏,那应该有房间和状态

房间和状态

先说说我对房间的理解,Colyseus 内置房间有两个,大厅房间和中继房间,大厅房间应该是类似我们进入游戏时的大厅,所有人都在一起,然后再找自己喜欢类型的房间,中继房间,我猜测类似吃鸡游戏中,我们选择开始游戏,在出生岛等待游戏开始的房间,以上是个人理解,如有不对,请指正。

大厅房间和中继房间已经帮我们初始了一些状态,但是这些可能不满足我们游戏的需求,因此,我们就需要定义我们自己的房间,使用 Room 类定义

  1.  
    import http from "http";
  2.  
    import { Room, Client } from "colyseus";
  3.  
     
  4.  
    export class MyRoom extends Room {
  5.  
        // 房间初始化时
  6.  
        onCreate (options: any) { }
  7.  
     
  8.  
        // 在 WebSocket 握手完成前, 客户端基于其提供的 options 进行验证
  9.  
        onAuth (client: Client, options: any, request: http.IncomingMessage) { }
  10.  
     
  11.  
        // 当客户端成功加入房间时
  12.  
        onJoin (client: Client, options: any, auth: any) { }
  13.  
     
  14.  
        // 当客户端离开房间时
  15.  
        onLeave (client: Client, consented: boolean) { }
  16.  
     
  17.  
        // 析构函数, 当房间里没有客户端时被调用. (参考 `autoDispose`)
  18.  
        onDispose () { }
  19.  
    }
学新通

有了房间,肯定要有一些初始状态,使用 Schema 初始化状态

  1.  
    // MyState.ts
  2.  
    import { Client } from "colyseus";
  3.  
    import { Schema, MapSchema, type } from "@colyseus/schema";
  4.  
     
  5.  
    // 一个抽象玩家对象, 表达其在3D世界的位置
  6.  
    export class Player extends Schema {
  7.  
      @type("number")
  8.  
      x: number = 0;
  9.  
     
  10.  
      @type("number")
  11.  
      y: number = 0;
  12.  
     
  13.  
      @type("number")
  14.  
      z: number = 0;
  15.  
    }
  16.  
     
  17.  
    export class MyState extends Schema {
  18.  
      @type({ map: Player })
  19.  
      players = new MapSchema<Player>();
  20.  
     
  21.  
      @type("string")
  22.  
      direction: string = "up";
  23.  
      /**
  24.  
       * 添加新用户的方法
  25.  
       *
  26.  
       * @param {Client} client
  27.  
       * @memberof PlayerState
  28.  
       */
  29.  
      addPlayer(client: Client) {
  30.  
        let player = new Player(001);
  31.  
        this.players.set(client.sessionId, player);
  32.  
      }
  33.  
     
  34.  
      /**
  35.  
       * 删除一个用户的方法
  36.  
       *
  37.  
       * @param {Client} client
  38.  
       * @memberof PlayerState
  39.  
       */
  40.  
      removePlayer(client: Client) {
  41.  
        this.players.delete(client.sessionId);
  42.  
      }
  43.  
     
  44.  
      /**
  45.  
       * 移动用户的方法
  46.  
       *
  47.  
       * @param {Client} client
  48.  
       * @param {number} [x=0]
  49.  
       * @param {number} [y=0]
  50.  
       * @memberof PlayerState
  51.  
       */
  52.  
      movePlayer(
  53.  
        client: Client,
  54.  
        x: number = 0,
  55.  
        y: number = 0,
  56.  
        z: number = 0,
  57.  
        direction: string = "up"
  58.  
      ) {
  59.  
        let player = this.players.get(client.sessionId);
  60.  
        console.log(player);
  61.  
        if (player != undefined) {
  62.  
          if (direction == "down" || direction == "right") {
  63.  
            (<Player>player).x  = x;
  64.  
            (<Player>player).y  = y;
  65.  
            (<Player>player).z  = z;
  66.  
          } else {
  67.  
            (<Player>player).x -= x;
  68.  
            (<Player>player).y -= y;
  69.  
            (<Player>player).z -= z;
  70.  
            if ((<Player>player).x <= 0) {
  71.  
              (<Player>player).x = 0;
  72.  
            }
  73.  
            if ((<Player>player).y <= 0) {
  74.  
              (<Player>player).y = 0;
  75.  
            }
  76.  
            if ((<Player>player).z <= 0) {
  77.  
              (<Player>player).z = 0;
  78.  
            }
  79.  
          }
  80.  
        } else {
  81.  
          // 当前用户不存在
  82.  
          console.log("client sessionId not exist!");
  83.  
        }
  84.  
      }
  85.  
    }
学新通

状态有了,稍微修改下房间,在房间初始化时把状态加上

  1.  
    import { MyState } from "./myState";
  2.  
     
  3.  
    onCreate(options: any) {
  4.  
        this.setState(new MyState());
  5.  
    }

房间和状态都定义好了,通过 define 公开房间(修改文件 app.ts)

gameServer.define("game", MyRoom);

再重新启动项目,就可以使用新的房间了

通过@colyseus/monitor 实时监察服务器生成的房间列表

@colyseus/monitor 是一个方便易用的工具,可以实时监察服务器生成的房间列表.

安装模块:

npm install --save @colyseus/monitor

在项目中引入:

  1.  
    import { monitor } from "@colyseus/monitor";
  2.  
     
  3.  
    app.use("/colyseus", monitor());

学新通

接收消息和广播

怎么接收客户端发送的消息和怎么发送广播?通过 onMessage 接收消息,通过 broadcast 发送广播,在 onCreate 定义

  1.  
    onCreate(options: any) {
  2.  
        this.setState(new MyState());
  3.  
        // 活动消息
  4.  
        this.onMessage("action", (client, message) => {
  5.  
          console.log(client.sessionId, "sent 'action' message: ", message);
  6.  
        });
  7.  
     
  8.  
        // 消息保存
  9.  
        this.onMessage("save", (client, data) => {
  10.  
          // 广播
  11.  
          this.broadcast("action-taken""an action has been taken!");
  12.  
        });
  13.  
      }

客户端通过 send 触发。

  1.  
    this.room.send("action", { direction: "left" });
  2.  
    // 触发广播
  3.  
    this.room.send("save", { direction: "left" });

学新通

一个用户加入

学新通

两个用户加入,并且一个用户位置发生了改变

学新通

监测有人进入房间

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghakcc
系列文章
更多 icon
同类精品
更多 icon
继续加载