乘着头脑有点思绪,又没有时间进行整理, 赶紧把想到的一些个人见解记下:

1, 在网络编程里, 宜多用组合, 少用继承。 组合更适用于分解数据以在网络因时因地制宜的通讯。

2, 封装包含对数据的隐藏,但如果数据是多个对象共用的, 则数据不宜封装在某个对象内部再以拷贝的方式同步, 而宜采用“数据对象+操作对象”的组合方式。

3, 网络通讯里经常有以指令为异地链接点。考虑这样的问题:一个功能可能得划分成N段分布在各地进行实现拼接而成,例如登陆指令:

例如同一个指令, 逻辑服和代理服都有收发的处理函数,例如登陆流程如下:
代理服:登陆指令发送:登陆处理,。
逻辑服:登陆指令接收:登陆指令处理。
逻辑服:登陆指令接收:登陆处理结果发回。
代理服:登陆指令接收:处理登陆反馈。

一个指令有四种处理,如何解决这个问题呢?
a, 可以指定登陆指令ID, 后边加一个参数, 表示是到了这个指令的第几个阶段, 从而作出相应的处理。 但这样做很麻烦, 因为得对这个参数做相关操作, 万一这个参数出错了, 很难追踪。
b, 可以指令多个不同阶段的登陆指令,例如CMD_LOGIN_PROCESS_1, CMD_LOGIN_PROCESS_2...
但这样做极容易造成指令的维护和管理上的麻烦。

为了解决以上烦恼, 本人设计如下: 对每个指今做一个发送对象创建器和接收对象创建器。这样就可以把针对同指令不同阶段的处理,接收不同处理等问题从switch处理从if里转移到不同实例化对象的处理(不同实例化对象的处理可以由一个共同的封装函数来实现),其中由接收端总是回调函数, 所以需要把回调函数地址保存在接收对象里,而且使接收对象全局化,这也就是为什么不简单一个类就行了, 而还要弄成“创建器”的原因。

------------------------------------------------ 20120117 ---------------------------------------------

一、 情节设计:
方法1: 把角色升级作为故事。
a, 《圣火微章》里女主角必须转职成公主才会触发相应的情节。
b, 《武士道》里等级=经验值+荣誉分。 使用会影响正确性的华丽剑术以在胜利中获得更多的荣誉是明智的,这种面子性质的问题给能力至上倾向带来了一层新的意义。
方法2: 发掘戏剧性场景(反差大的场景)而不是线性故事。
a,  《毁灭战士》玩家作为后补留在了战场后方,最后队友都不幸战死,产生了玩家的简单定义,试图生存并为队友复仇。

二、 结构建模
1,服务器(物理(简单)|游戏仿真|网络) -> 客户端(渲染|动画|物理(详细)|游戏仿真|网络)
2,服务端对游戏状态空间有惟一精确表示,客户端代理服务器的对象。
3,实现一些类库:
a, 词典类:哈希表是一种关联数组,通过哈希函数把键映射到数组中的某个位置(常用于把网络指令映射到某相关的函数上或者状态的标示)。
b, 仿真事件: 系统的事务对象,它常包含五个元素:事件类型,频道属性(可用于用户自定义的参数),源行动者标识, 目标行动者标识,事件的参数。
c, 仿真状态:状态的表示,能否转换,进行转换。
d, 动作状态:动画状态的表示。
e, 控制状态:状态行动者的调用人。
f, 用户控制状态维护了一个等待执行的动作请求队列。
g, AI控制状态。
h, 把互斥行为分解到同一个并行层中, 跨层互斥则特殊处理。例如[移动层(停止移动|向后移动|向前移动|向左移动|向右移动),外观层(战立|坐下|步行|跑步|掉下|游泳|骑马|平躺),指令层(空闲|施放魔法|战斗)。其中外观层有时可以触发AI的不同处理, 例如玩家拨剑的外观时,AI则进行攻击。
i, 技能也可以看成是一种状态,游戏里几乎所有情况都可以看成状态的组合,例如让玩家移动,释放技能(技能状态器)。 游戏可以看成是 游戏 = 状态器 + 触发器。
j, 大量参数属性宜有一个自动生成参数程序和载入参数程序,如果全手工参数+载入则工作量大和易出错, 如果“自产自用混为一体”,则无法灵活控制。

------------------------------------------------ 20120118 ---------------------------------------------

供给房屋的好处:
1, 作为一个社交集合场所。
2, 代表了玩家的发展。
3, 可用来自我吹嘘和炫耀。
4, 它是一种对游戏世界进一步定制的方法。
5, 节省开发者的设计成本。

帮会房屋还应充许有一个可以展示玩家成果的功能,例如帮主的称号,武器等成果, 帮战甚至可以结合塔防类游戏。

为什么不充许玩家可以在服务中开设商店呢? 是商店而不是个人摆摊,有转手,代卖等功能。

1,声望: 一般人所能看到和判断的总体质量或特性。别人对某些特性或者能力的承认。
2,仿真对象维护了一个脏标志,每当有数据或者属性发生变化,这个标志就会被设置。保存时如果脏标志为真才会进行保存。
3,行动者维护了一个接收事件的事件队列,得到延迟处理的能力,对于需要即时处理的事件可以过滤出来。
4,可以添加订阅和取消订阅的方法来让某个体可以关注另一个体的消息
5,技能相当法庭,技能施放者(原告)将技能受益者(被告)提交到技能(法庭)里裁判,原告和被告属于法庭对象里的属性。
6,MMP游戏中玩家常是数以万计,十万计, 故可以在网络通讯中规模以万为单位作为开发的性能底线。
7,针对网游的移动,为了减少通讯量,可以在通讯端进行不连续位移的通讯, 而在客户端通过插值进行平滑连续的位移。此解也可应用于丢包问题。
8,网游发包的策略是:在满足需求的前提下,包尽量大,发包频率尽量小。当然,丢包问题对于大包来说,影响更历害。
9,在服务器端,每个玩家都应拥有一个发送队列。

------------------------------------------------ 20120228 ---------------------------------------------

1, 移动到某地, 其实不是一个独立指令,而是玩家的一种状态。

------------------------------------------------ 20120302 ---------------------------------------------

--[[
世界地图的拼接
副本的接入口
元素实体
NPC实体的实现(继承自元素实现)
法术实体的实现(继承自元素实现)
实体管理器:由管理器来处理生存和死亡问题,实体自杀也需向管理器递交消息
作用实体:
作用实体是不管前提的, 一旦出生则必执行。
NPC->作用实体(普通攻击)
NPC->法术实体->作用实体(法术攻击)
扫描一遍行动, 扫描一遍AI。
--]]
--依据IP区分控制端

不管多少, AI处理移动的框架是不合理的。 我觉得框架应该有三层: 一层是移动处理, 一层是AI处理, 一层是视觉处理。 这三层是“并行执行”的。

如果AI包含移动, 我只能说设计有问题。因为除了需求上的奇怪外(NPC移动时居然不能执行技能),还有实现上的奇怪, AI的某些耗时操作会影响到移动的执行。

其实每个生物应该就配三个状态机:
1,行动状态机(负责空间的移动,定位)
2,外观状态机(负责NPC的外形)
3,AI状态机(攻击,防守,加效果)

每个生物的每种状态会由这三种状态机合成,例如dota的挑战者,当他执行加攻并行走时, 会是以下状态:
1,行动状态机 = 移动到某点的状态
2,外观状态机 = 移动状态
3,AI状态机 = 给附近的人加攻击状态。

这三个状态机是并行的。 如果AI状态负责移动, 会出现搞笑的情况, 移动时居然不能给别人加攻击力了。

------------------------------------------------ 20120312 ---------------------------------------------

NPC里应该分状态类(状态类里再分视图类,行动类),而不是在NPC里分直接行动状态类和视图状态类。 直接分固然有利于动态组合行动状态和视图状态类成一个某状态,但是却有一个致命伤: 如果某个行动状态是需要多个小步骤的视图配合,这些小步骤的视图显然不是NPC生存期一直存在资源, 直接划分的方法会导致这些小资源的视图类成为整个NPC的共享视图类,从而导致数据隐藏的失效,管理量的膨胀,资源的浪费。当然先大分状态类,再细分视图和行动的方法也有问题,会导致资源的重复建设等,但显然不是致命伤。

------------------------------------------------ 20120316 ---------------------------------------------

class NPC
{//采用建造者模式,以对客户屏蔽生成功能, 只提供使用功能的权限。
//响应鼠标点击
public function onClip(){}
//转到移动状态
public function ToMove(){}
//转到被攻击状态
public function BeAttacked(){}
}
//NPC创建者
class NPCBuilder
{//建造者,对客户屏蔽目标的内部生成功能,暂时提供外部的生成选择,过后只提供目标的使用功能的权限。
//创建NPC
public function Build_NPC(); // new NPC
//移动状态
public function Build_MoveState(_ID);
//被攻击状态
public function Build_BeAttackedState(_ID);
//AI
public function Build_AI(_ID);
//装备
public function Build_Equipment(_ID);
//法术
public function Build_Magic(_ID);
//获得NPC
public function Get_NPC
}
//女剑士_NPC
class Girl_Sword_NPC
{
public function Girl_Sword_NPC()
{
// constructor code
}
static public function Create_Girl_Sword_NPC(_NPCBuilder:NPCBuilder):NPCBuilder
{
_NPCBuilder.Build_MoveState(0);
_NPCBuilder.Build_BeGiddyState(0);
_NPCBuilder.Build_BeAttackedState(0);
_NPCBuilder.Build_Magic("火球法术");
_NPCBuilder.Build_AI(0);
_NPCBuilder.Build_Equipment(0);
return _NPCBuilder
}
}
//男剑士_NPC
class Boy_Sword_NPC
{
public function Girl_Sword_NPC()
{
// constructor code
}
static public function Create_Girl_Sword_NPC(_NPCBuilder:NPCBuilder):NPCBuilder
{
_NPCBuilder.Build_MoveState(1);
_NPCBuilder.Build_BeGiddyState(1);
_NPCBuilder.Build_BeAttackedState(1);
_NPCBuilder.Build_Magic("火球法术");
_NPCBuilder.Build_AI(1);
_NPCBuilder.Build_Equipment(1);
return _NPCBuilder
}
}
//火球法术
class FireBall
{
public function FireBall();
//转到移动状态
public function ToMove(){}
//转到攻击角色状态
public function ToAttackNPC(_NPC:NPC)
{
_NPC.BeAttacked()//NPC转成被攻击态,并造成相应的损失。
}
}

网游开发的学习与杂绪相关推荐

  1. 【UE4】网游开发中的RPC和OnRep(二)

    [UE4]网游开发中的RPC和OnRep(二) 本文转自我的公众号-游戏开发手账 转载请标明出处 搭配Multicast,让Server和所有的Client正常运转起来. 上篇遗留了什么问题? 上一篇 ...

  2. 【UE4】网游开发中的RPC和OnRep(三)

    [UE4]网游开发中的RPC和OnRep(三) 本文转自我的公众号-游戏开发手账 转载请标明出处 最后说说怎么用OnRep完成子弹的同步. OnRep 使用属性同步也能够完成Client和Server ...

  3. (转)火溶CEO王伟峰:Unity3D手机网游开发

    今天看到这篇文章,感觉很不错,尤其是那句"Unity3D的坑我觉得最严重的坑就是没有懂3D的程序员,把Unity当成Office用". 转自http://blog.csdn.net ...

  4. 火溶CEO王伟峰:Unity3D手机网游开发

    http://www.gamelook.com.cn/2013/11/135467 GameLook报道 / 11月2日下午,GameLook游戏开放日活动在上海正式举行,此次会议gamelook邀请 ...

  5. Unity3D与AvosCloud网游开发实践 - 单线程U3D中的异步通讯处理

    Unity3D被设计为单线程的结构,即在主线程之外绝大多数API都是无法使用的,而AvosCloud所有数据通讯都是异步的,这样就产生了一些问题. 举例来说,角色获得了足够的升级经验,于是向服务器发送 ...

  6. python网络游戏开发教程_python 网游开发教程 | python做的游戏有哪些

    python游戏开发是做什么的 现在很多的线下培训,质量参差不而且线下的培都十分高昂,加上你的线下生活费的话,学一个技术没有三万是学不下来的,你可以考虑线上的教育,只培训费就会给你省一大笔,学习时间还 ...

  7. 关于Unity3D手机网游开发一些小看法

    它的知识技能和职责,我就不仔细说了,说细了有一点像招聘启示.他的主要职责虽然负责技术,但是也给产品决策和方向提供一些决策.他最主要的考核指标,就是经验很重要,最好主导或参与过一款网络游戏的开发.举个例 ...

  8. 手机网游开发基础知识之Wap协议

    WAP协议(Wireless Application Protocol)无线应用协议是一个开放式标准协议.它使用WML标记式语言(类似于HTML)并可通过WAP Gateway实现html和wml的转 ...

  9. 如何开发一款网游?(一)——数据结构设计

    本文中的网游是指智能设备的网游游戏.网游开发是一个系统工程,里面涉及到的工序繁多,人员可以从几人到数十人不等,主要包含策划.美术.客户端.服务端.这里主要是从服务端技术的角度并以最简洁的方式来阐述一个 ...

最新文章

  1. Java多线程之Callable接口的实现
  2. js 数组 转为树形结构
  3. java的问题_Java的问题
  4. 双目立体视觉及正交偏振 3D 显示
  5. 什么是现代通用计算机的轴型,大学计算机基础(版)各章节习题+答案.doc
  6. php 输出excepion内容,带有消息“无法关闭zip文件php://输出”的PHPExcel_Writer_Exception...
  7. 2017 阿里技术-年度精选
  8. 如何快速压测电商网站?
  9. linux--几种常见的进程调度算法
  10. 解决vue-cli插件下载慢的问题
  11. PMP/高项 项目立项管理
  12. 【Python古诗词鉴赏小程序】千古绝唱,精选中国最美古诗句,经典咏流传~
  13. MySQL数据库事务实例(模拟银行转账)
  14. 递归回溯求解数独 C++实现方法
  15. 复合函数求导定义证明,复合函数求导法则的又一证明
  16. h2o flow初探
  17. deepin更新启动项_Deepin修复启动项菜单---grub2启动修复
  18. Oracle Clob大于4000字节报错,那是你不懂Clob,XML类型的Clob在过程中就是取不到,我帮你
  19. 一篇文让你看懂NB-IoT、LoRa、eMTC、Sigfox及ZigBee的应用场景【转】
  20. linux切割日志方法,Linux下nginx生成日志自动切割的实现方法

热门文章

  1. 西门子200smart与安川V1000变频器modbus通讯
  2. Resuming debugger: error during debugging loop: TypeError: firstViewRangeElement is null
  3. 公共关系礼仪实务章节测试题——公共关系概述(四)
  4. 水产养殖管理系统如何管理鱼塘
  5. 湘潭大学计算机设计大赛,湘潭大学2017年大学生计算机设计大赛
  6. 物联网LoRa系列-4:LoRa终端射频芯片SX1268、SX1278、SX1262对比与选择
  7. 每天小练笔2-大数求和
  8. Maching Learning
  9. 关于select2高度自定义设置解决方案
  10. 广联达GTJ2018实战精准快速算量课程