10分钟开发一个游戏服务器
前言
安利一个游戏服务器框架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分钟开发一个游戏服务器相关推荐
- 10 分钟实现一个自己的服务器监控器
需求 最近需要给自己的服务器添加监控器,目的是监控服务器的内存.CPU.磁盘占用率,资源占用率过高的话能给自己发个提醒,当前主流的平台一般会提供邮件.短息.甚至会提供微信提醒,不过这类提醒包含的噪音太 ...
- python scrapy 入门,10分钟完成一个爬虫
在TensorFlow热起来之前,很多人学习python的原因是因为想写爬虫.的确,有着丰富第三方库的python很适合干这种工作. Scrapy是一个易学易用的爬虫框架,尽管因为互联网多变的复杂性仍 ...
- 10分钟python爬虫_python scrapy 入门,10分钟完成一个爬虫
在TensorFlow热起来之前,很多人学习python的原因是因为想写爬虫.的确,有着丰富第三方库的python很适合干这种工作. Scrapy是一个易学易用的爬虫框架,尽管因为互联网多变的复杂性仍 ...
- 10分钟出一个块的BCH,可以作为日常支付?
中本聪创建比特币的初衷是希望其成为全球支付的货币,作为继承中本聪衣钵的比特币现金更是在这方面不断的努力.比特币平均10分钟出一个块,交易确认的时间也是10分钟左右.10分钟的支付确认时间对于日常支付来 ...
- mysql connection闪退重连_玩家排位巅峰赛开局闪退,重连失败,10分钟后一个提示让他懵了...
#游戏圈中的春节# 王者荣耀排位赛460是经常的事情,不过闪退还是比较少见的,玩家排位巅峰赛开局闪退,重新登录游戏之后,重连一直失败,10分钟后一个提示让他懵了. 460的情况大家都经历过,这是很多原 ...
- pythonhelloworld项目,10分钟搭建一个小型网页(python django)(hello world!)
10分钟搭建一个小型网页(python django)(hello world!) 1.安装django pip install django 安装成功后,在Scripts目录下存在django-ad ...
- 100行代码 5分钟开发一个数字货币行情软件(升级版)
鉴于之前 ccxt 的接口貌似被墙了. 国内访问不了. 所以我又重新用了 非小号 的数据 重新弄了一下,现在国内的也能访问了. 非小号的 api 禁止了浏览器跨域请求.所以中间我又用我的服务器做了一层 ...
- C++:开发一个游戏逻辑引擎
开发一款游戏也许看起来十分困难,但在C++的帮助下,将会变得更加简单. 如果你是一个开发游戏的老手,应该知道Unity引擎.这个引擎不但提供了逻辑的支持,还提供了UI的支持.可以说的五脏俱全. 但是, ...
- 10分钟开发一款“一键二次元化“AI小程序
10分钟开发一款"一键二次元化"AI小程序 1. 创建人像卡通化应用 登录云开发平台.通过以下链接 https://workbench.aliyun.com/applicatio ...
最新文章
- 【每日一题】二分查找
- ffmpeg rtsp转 rtmp
- linux系统启动过程(三)
- GridControl动态添加 颜色列
- 算法(2)-二叉树的遍历(递归/迭代)python实现
- 如何卸载服务器的系统,卸载服务器的操作系统
- 软件测试——0319作业
- 最近总结了串口(COM)读写操作的三种方式
- python读取json数据教程_Python教程之解析json数据
- 大数据平台在分布式服务中的应用
- 拿下微软、Google、Adobe,印度为何盛产科技圈 CEO?
- mysql随机显示记录_mysql随机提取记录数的方法
- 解决办法:Eclipse卡死在“revert resources”,进度一直为0
- 明翰游戏学笔记V0.2(持续更新)
- 【钉钉机器人 + 爬虫 + celery】定时发送微博热搜 + 定时发布财经新闻
- php 模拟登录qq空间,PHP模拟QQ登录的方法
- c++ windows console 快速编辑模式 关闭
- Cordova插件之跳转第三方app
- 编写程序,统计某旅馆住宿客人的总数,要求输入客人姓名,输出客人编号(按先后顺序自动生成),姓名以及总人数。...
- [经验教程]国内如何下载更新google谷歌浏览器及更新谷歌chrome浏览器无法访问此网站怎么办?
热门文章
- 查询最近电脑都访问过哪些文件
- iOS中注册功能的体验探究
- spring4报错Caused by: java.lang.NoClassDefFoundError: org/springframework/dao/DataAccessException
- 微信自定义菜单 快递接口 SpringMVC mybatis redis shiro ehcache websocket
- 对于广播电视这一点最致命,赶紧看看
- 聊天尬住了?教你用Python一键获取斗图表情包,从此摇身变海王
- 嗨呀科技:教你如何轻松把视频做成表情包
- CameraX API 的 YUV_420_888 图像转换为NV21数据和Bitmap
- 从手机里上传文件到云服务器,手机传文件到云服务器
- 利用Python采集电影详细信息(上)