前言

  安利一个游戏服务器框架colyseus,使用起来十分简单,只需要一丢丢的代码就可以实现一个状态同步的服务器,10分钟主题,废话不多说,Let’s Rock!

安装&项目设置

  • 使用npm初始化项目
npm i -g typescript
npm init -y
tsc --init
npm i colyseus
npm i express @types/express @types/node @types/redis

编程ING

先码一遍代码比看着纸想有用. —–鲁迅

  • 入口文件 在主目录下新建一个index.ts文件
import { GameRoom } from './room/GameRoom';
import { Server } from 'colyseus';
import express from 'express';
import http from 'http';const app = express();// 初始化游戏服务器
const gameServer = new Server({server: http.createServer(app)
});// 注册房间服务器
gameServer.register('game', GameRoom);// 开始监听端口
gameServer.listen(3000);
console.log('server is on');
  • 新建一个文件夹room 新建一个GameRoom.ts文件
import { Room, Client } from 'colyseus';
import { PlayerState } from '../entity/PlayerState';export class GameRoom extends Room<PlayerState> {// 房间内的最大人数maxClients: number = 2;// 房间初始化方法onInit(options: any) {console.log('ChatRoom onInit');// 设置需要更新的状态this.setState(new PlayerState());// 设置发送频率this.setPatchRate(50);}// 消息收取方法onJoin(client: Client) {this.state.addPlayer(client);}// 消息收取方法onLeave(client: Client) {this.state.removePlayer(client);}// 消息收取方法onMessage(client: Client, data: any): void {this.state.movePlayer(client, data.x, data.y);}}
  • 新建一个文件夹entity 新建文件PlayerState.ts和Player.ts

  • PlayerState.ts

import { EntityMap, Client } from 'colyseus';
import { Player } from './Player';export class PlayerState {// EntityMap是colyseus的对象实体模板players: EntityMap<Player> = {};/*** 添加新用户的方法** @param {Client} client* @memberof PlayerState*/addPlayer(client: Client) {let player = new Player(0, 0);this.players[client.sessionId] = player;}/*** 删除一个用户的方法** @param {Client} client* @memberof PlayerState*/removePlayer (client: Client) {delete this.players[ client.sessionId ];}/*** 移动用户的方法** @param {Client} client* @param {number} [x=0]* @param {number} [y=0]* @memberof PlayerState*/movePlayer(client: Client, x: number = 0, y: number = 0) {this.players[client.sessionId].x += x;this.players[client.sessionId].y += y;if(x > 0){this.players[client.sessionId].dir = true;} else {this.players[client.sessionId].dir = false;}}
}
  • Player.ts
import { randomChineseName } from '../Utils'
export class Player {public name: string;  // 名称public x: number;    // x轴的位置public y: number;   // y轴的位置public dir: boolean; // 玩家的方向(左 false 右 true) 简单定义constructor( x: number,  y: number,name?: string) {this.x = x;this.y = y;this.name = name || randomChineseName();this.dir = true;}
}
  • 根目录新建一个Utils.ts的文件
  • 一些基础工具方法写在这里
  • 现在又一个随机返回一个中文名称的方法
const NAMES: Array<string> = ['断笔画墨','默然相爱','旅人不扰','多余温情','云中谁忆','残雪冰心','末世岛屿','桑榆非晚','扉匣与桔','木槿暖夏','空城旧梦',
];/*** 返回随机的中文名* * @export* @returns {string}*/
export function randomChineseName(): string {return NAMES[~~(NAMES.length * Math.random())];
}

简单分析

  • 不正确的图像架构

  • 一个游戏服务器下面可以开N个房间Room
  • Room中存在一个state的对象,发生变化时候同步到Room下的客户端
  • 使得客户端的状态保持一致
  • 这个就是colyseus实现的状态同步服务器

启动服务器

tsc && node ./dist/index.js

简单的客户端

源码地址:https://gitee.com/limo/simple_server

转自https://allknowboy.com/posts/a8be8288/

10分钟开发一个游戏服务器相关推荐

  1. 10 分钟实现一个自己的服务器监控器

    需求 最近需要给自己的服务器添加监控器,目的是监控服务器的内存.CPU.磁盘占用率,资源占用率过高的话能给自己发个提醒,当前主流的平台一般会提供邮件.短息.甚至会提供微信提醒,不过这类提醒包含的噪音太 ...

  2. python scrapy 入门,10分钟完成一个爬虫

    在TensorFlow热起来之前,很多人学习python的原因是因为想写爬虫.的确,有着丰富第三方库的python很适合干这种工作. Scrapy是一个易学易用的爬虫框架,尽管因为互联网多变的复杂性仍 ...

  3. 10分钟python爬虫_python scrapy 入门,10分钟完成一个爬虫

    在TensorFlow热起来之前,很多人学习python的原因是因为想写爬虫.的确,有着丰富第三方库的python很适合干这种工作. Scrapy是一个易学易用的爬虫框架,尽管因为互联网多变的复杂性仍 ...

  4. 10分钟出一个块的BCH,可以作为日常支付?

    中本聪创建比特币的初衷是希望其成为全球支付的货币,作为继承中本聪衣钵的比特币现金更是在这方面不断的努力.比特币平均10分钟出一个块,交易确认的时间也是10分钟左右.10分钟的支付确认时间对于日常支付来 ...

  5. mysql connection闪退重连_玩家排位巅峰赛开局闪退,重连失败,10分钟后一个提示让他懵了...

    #游戏圈中的春节# 王者荣耀排位赛460是经常的事情,不过闪退还是比较少见的,玩家排位巅峰赛开局闪退,重新登录游戏之后,重连一直失败,10分钟后一个提示让他懵了. 460的情况大家都经历过,这是很多原 ...

  6. pythonhelloworld项目,10分钟搭建一个小型网页(python django)(hello world!)

    10分钟搭建一个小型网页(python django)(hello world!) 1.安装django pip install django 安装成功后,在Scripts目录下存在django-ad ...

  7. 100行代码 5分钟开发一个数字货币行情软件(升级版)

    鉴于之前 ccxt 的接口貌似被墙了. 国内访问不了. 所以我又重新用了 非小号 的数据 重新弄了一下,现在国内的也能访问了. 非小号的 api 禁止了浏览器跨域请求.所以中间我又用我的服务器做了一层 ...

  8. C++:开发一个游戏逻辑引擎

    开发一款游戏也许看起来十分困难,但在C++的帮助下,将会变得更加简单. 如果你是一个开发游戏的老手,应该知道Unity引擎.这个引擎不但提供了逻辑的支持,还提供了UI的支持.可以说的五脏俱全. 但是, ...

  9. 10分钟开发一款“一键二次元化“AI小程序

    10分钟开发一款"一键二次元化"AI小程序 1. 创建人像卡通化应用 登录云开发平台.通过以下链接  https://workbench.aliyun.com/applicatio ...

最新文章

  1. 【每日一题】二分查找
  2. ffmpeg rtsp转 rtmp
  3. linux系统启动过程(三)
  4. GridControl动态添加 颜色列
  5. 算法(2)-二叉树的遍历(递归/迭代)python实现
  6. 如何卸载服务器的系统,卸载服务器的操作系统
  7. 软件测试——0319作业
  8. 最近总结了串口(COM)读写操作的三种方式
  9. python读取json数据教程_Python教程之解析json数据
  10. 大数据平台在分布式服务中的应用
  11. 拿下微软、Google、Adobe,印度为何盛产科技圈 CEO?
  12. mysql随机显示记录_mysql随机提取记录数的方法
  13. 解决办法:Eclipse卡死在“revert resources”,进度一直为0
  14. 明翰游戏学笔记V0.2(持续更新)
  15. 【钉钉机器人 + 爬虫 + celery】定时发送微博热搜 + 定时发布财经新闻
  16. php 模拟登录qq空间,PHP模拟QQ登录的方法
  17. c++ windows console 快速编辑模式 关闭
  18. Cordova插件之跳转第三方app
  19. 编写程序,统计某旅馆住宿客人的总数,要求输入客人姓名,输出客人编号(按先后顺序自动生成),姓名以及总人数。...
  20. [经验教程]国内如何下载更新google谷歌浏览器及更新谷歌chrome浏览器无法访问此网站怎么办?

热门文章

  1. 查询最近电脑都访问过哪些文件
  2. iOS中注册功能的体验探究
  3. spring4报错Caused by: java.lang.NoClassDefFoundError: org/springframework/dao/DataAccessException
  4. 微信自定义菜单 快递接口 SpringMVC mybatis redis shiro ehcache websocket
  5. 对于广播电视这一点最致命,赶紧看看
  6. 聊天尬住了?教你用Python一键获取斗图表情包,从此摇身变海王
  7. 嗨呀科技:教你如何轻松把视频做成表情包
  8. CameraX API 的 YUV_420_888 图像转换为NV21数据和Bitmap
  9. 从手机里上传文件到云服务器,手机传文件到云服务器
  10. 利用Python采集电影详细信息(上)