视角角度的旋转和调整是通过按住鼠标右键

发布 游戏

基于Torque引擎的游戏实例开发学习
    
    3D网络游戏开发实践
    ?
    http://jpkc.sziit.com.cn/wlyx/www/yxddsjjr/index_01.html
    
    基于Torque引擎的游戏开发
    雏形游戏?原型丰富?游戏集成
    ?
    
    雏形游戏
    技能、素材准备?开发环境建立?创建简化的游戏场景?添加模型与对象,完成游戏启动与退出?实现基本游戏逻辑,原型测试
    ?
    
    技能、素材准备
    开发环境准备?剧情分析设计?游戏开发训练
    ?
    
    开发环境准备
    Torque功能了解,开发环境熟悉?运行根目录下的torqueDemo.exe文件,启动开发运行平台
    ?
    
    剧情设计
    ?
    设计一款夺宝FPS游戏
    
    游戏开发训练
    ?
    游戏世界中视角的调整
    ?进入系统的程序菜单中运行培训实例
    Tutorialbase开
    发环境?选择世界编辑器按钮进入世界编辑器,这时进入的是摄像头视角的游戏世界,这是一个空旷的虚拟世界,还没有人任何生灵和建筑,是世界编辑器的观查界面。?选择主菜单的摄像机Camera菜单,该菜单的各项有两类作用,上面是调整观查游戏世界的视角,下面是调整玩家或摄像头移动的速度,即视角移动的速度。
    
    ?
    首先要说明的是,如果是玩家视角,玩家的移动是受玩家的行动能力限制的,而如果是摄像头视角,则摄像头的移动是随处都可以去的,比如上天入地,进到人体或建筑物。
    CameraatPlayerAltQ:将摄像头移动到玩家处,并以摄像头为观查游戏世界的视角?DropPlayeratCameraAltW:将玩家移动到摄像头处并以玩家为观查游戏世界的视角。?ToggleCameraAltC:在玩家和摄像头之间切换观查游戏世界的视角
    ?Drop
    
    DropPlayeratCamera
    ?
    如果摄像头在地下时,会出现什么状况呢?
    ?因为玩家是有重量的而地面是可以托起玩家的,如果
    玩家在地下了,引擎就认为对玩家没有支撑了,这时,玩家将无限地掉到地心去。?解救方法是进行视角的切换用ToggleCamera,由玩家视角切换到摄像头视角,然后调整方向将摄像头从地下升上来,然后再执行DropPlayeratCamera将玩家移动到摄像头处。
    ?
    如果摄像头在高空,会出现什么状况呢?
    
    玩家基本动作控制键的使用
    ?
    ?
    视角的移动是通过字母按键W、S、A、D来控制的,W是向前,S是向后,A是向左,D是向右;视角角度的旋转和调整是通过按住鼠标右键,晃动鼠标来进行的。玩家现身
    ?在玩家视角中有两种方式一是无玩家方式,即以玩家
    的眼睛看世界;另一种方式则是以玩家身后的一个假想眼睛看世界,这样就会使玩家现身,玩家是否现身在游戏运行状态下是通过切换键Tab来实现的,在开发环境下通过Ctrl和Tab键来切换
    
    任务区域编辑器MissionAreaEditor
    ?
    任务区域编辑器MissionAreaEditor,由主菜单的窗口Window菜单中给出,用来定义限制玩家移动的区域,这里可以快速调整视角(摄像头或玩家)的位置进行地形的镜像
    
    美术素材准备
    选择Torque附带的第一人称射击游戏FPS的美术素材?将环境environment,建筑物interiors和模型shapes目录下的内容保存好以备自己编写游戏时使用
    ?
    
    知识点
    1)游戏世界中的视角有两类,其中玩家视角有分为玩家现身和不现身?2)玩家视角时,注意不要掉到地下
    ?
    
    开发环境建立
    建立自己的游戏结构?生成一个自己的游戏任务?添加美术素材
    ?
    
    建立自己的游戏结构
    
    ?
    ?
    1)在标准的Torque引擎的安装中,实际的游戏目录是在Torque/SDK/example目录中2)荒原夺宝游戏将以tutorial.base目录的培训环境为基础,由此展开游戏的制作,所以复制一份example目录(包括它里面所有的内容)出来3)将example目录改为GameRoot目录,这个目录是荒原夺宝游戏的根目录,将tutorial.base目录改为Capturetreasure(夺宝)目录,这个目录是游戏制作的目录4)将游戏根目录下的游戏执行文件torqueDemo.exe改为Capturetreasure.exe作为夺宝游戏的启动文件
    
    建立自己的游戏结构
    5)将GameRoot目录下main.cs脚本文件中的默认游戏目录进行如下的修改$defaultGame=Capturetreasure;以新的游戏目录Capturetreasure代替原来的tutorial.base注意:defaultGame是大小写敏感的,所以确保Capturetreasure是以大写字母开头?6)和步骤5)类似,将Capturetreasure目录下main.cs脚本文件中的默认游戏任务的路径进行如下的修改$Editor::newMissionOverride=tutorial.base/data/missions/flat.mis;修改为$Editor::newMissionOverride=Capturetreasure/data/missions/flat.mis;
    ?
    
    生成一个自己的游戏任务
    1)运行启动Capturetreasure.exe,在Torque开发平台中进入世界编辑器,通过文件菜单File-NewMission产生新的游戏任务?2)通过文件菜单File-SaveMission保存这个新游戏任务?3)保存在Capturetreasure/data/missions/目录下,命名为Capturetreasure.mis,退出并关闭Torque开发平台?4)将Capturetreasure目录下,main.cs中的默认任务名改为新的任务名Capturetreasure.mis,将函数onStart的下面一行$Editor::newMissionOverride=Capturetreasure/data/missions/flat.mis;修改为$Editor::newMissionOverride=Capturetreasure/data/missions/Capturetreasure.mis;?5)再次运行启动Capturetreasure.exe,如图2所示进入世界编辑器,这样进入的就是刚保存的新游戏任务,即是荒原夺宝游戏的原始模型
    ?
    
    添加美术素材
    ?
    将环境environment,建筑物interiors和模型shapes目录及其内容复制到Capturetreasure/data/目录下,添加新的美术素材
    
    知识点
    1)根目GameRoot下的main.cs脚本程序是游戏脚本的入口程序?2)Torque开发平台的每个新脚本的编译都需要该平台的重新启动和运行?3)文件菜单File-OpenMission同样可以装入游戏任务
    ?
    
    创建简化游戏场景
    ?
    剧情理解:
    ?根据游戏背景的描述,勇士们夺宝的古城并非
    鸟语花香、景色宜人的胜地,而是荒草丛生,怪石峥嵘,以藏有无数财宝而著名。作为夺宝游戏,过于简单的场景将使游戏的可玩性大打折扣。因此,在游戏的地形设计上,需要考虑能烘托出恶劣、凶险、变化多端的夺宝环境为宜。当然,宝物的设置必不可少。
    
    创建简化游戏场景
    需求分析:根据游戏需要,本任务的核心是实现游戏的基本地形并在不同地点设置宝物。通过对剧情的理解,游戏场景需要设计为恶劣、凶险、变化多端的夺宝环境。因此,在游戏场景的实现上使用三种类型的地面:杂草丛生的荒草地、一望无际的绿地及粗犷荒芜的沙漠。玩家每次加入战场都会从大本营内出现,作为玩家出生地点选择较为平坦的绿地,便于玩家进入游戏熟悉环境。为了丰富游戏的场景,增加环境的复杂度,将为游戏准备不同类型的游戏模型,如树、建筑物和桥等。除此之外,需要准备在场景中随机放置宝物。
    
    创建简化游戏场景
    ?
    方案设计:
    ?对于游戏地形的实现,可直接使用
    Torque引
    擎中的地形编辑器实现。?对于增加场景复杂度的游戏模型及玩家需要抢夺的宝物,可先将这些模型资源准备好,分类放在合适的游戏目录中。?通过Torque引擎添加静态模型。
    
    创建简化游戏场景
    关键技术:?地形编辑器的使用?静态模型的添加
    
    创建简化游戏场景初步创建游戏的场景
    ?
    ?
    1)使用主菜单的窗口Window-TerrainTexturePainter渲染游戏的地面,使用三类画面,荒草patchy.jpg、绿地grass.jpg和沙漠sand.jpg2)使用主菜单的窗口Camera-ToggleCamera使用玩家视角,使用主菜单的窗口ActionExcavate和Flatten将玩家出生的地方整理的比较平坦,注意,不要将玩家埋没,只有在渲染条件下主菜单才有Action项
    
    创建简化游戏场景初步创建游戏的场景
    3)使用主菜单的窗口Window-WorldEditorCreatorF4在窗口右下角按照图1的方式,在玩家出生的脚下添加一Logo,以便找到自己的位置。见图1?4)使用主菜单的窗口Window-WorldEditorCreatorF4在窗口右下角按照图2的方式,在开发平台上添加树的目录trees,然后在里面添加各种树
    ?
    
    创建简化游戏场景初步创建游戏的场景
    
    ?
    5)根据需要可以多建几个目录,例如再建一个placeEnviron用来包含其他场景6)添加一个logos目录,在该目录下添加几个Shapes\items\下的logo模型。该模型将作为后面的宝使用,如图5所示的游戏场景的目录结构7)使用主菜单的窗口Files-SaveMission…CtrlS将场景建立结果保存到Capturetreasure/data/missions/目录下的Capturetreasure.mis文件中
    
    添加模型对象,完成游戏启动与退出
    ?
    1.添加模型对象,将一个卵石添加为一个Item模型对象以后作为宝石
    )修改Capturetreasure/server/logoitem.cs,将logoitem+.cs中的程序添加上,建立模型目录下的新的模型分类Boulders?2)将item.cs复制到Capturetreasure/server/目录下,并在game.cs的onServerCreated()函数的末尾添加item.cs的加载执行,exec(./item.cs);?3)重新启动游戏开发平台,就可以在shapes目录下看到Boulders类,及其里面的boulderitem模型。见图1?4)在游戏场景的适当位置添加该模型,并将它们组织为一个宝石组,命名为boulders见图2
    ?1
    
    添加模型对象,完成游戏启动与退出
    ?
    2.建立游戏的启动按钮1)通过F10进入界面设计窗口2)在新控件中选择GuiButtonCtrl按钮,见图33)在右下方属性框中找到Misc节的text项,并把输入在按钮上希望显示的文字“GameStart”并点击“Apply”。现在按钮上显示的就是“GameStart”了,见图44)在Parent节的command项中填入“loadMyMission();”并点击“Apply”5)修改loadMyMission()函数,保证它装入的是需要的任务Capturetreasure.mis该函数位于Capturetreasure目录下的main.cs文件的末尾。6)保存新的启动界面,到Client/ui/mainMenuGui.gui,见图57)退出后重新启动则在启动界面上就可以通过GameStart按钮,进入游戏。8)采用同样的方式可以加入游戏退出按钮,区别是在退出按钮的Parent节的command项中填入“quit();”即可
    
    知识点
    1)界面控件的添加及属性设置2)loadMyMission()函数的作用和修改3)用户函数和系统函数的使用
    
    设计、实现基本游戏逻辑
    ?
    剧情理解:
    ?在游戏中,玩家最后的胜利取决于通过夺宝赚
    取的分数。玩家每成功夺宝一件,分数将自动增加,各种宝物的分值不等,分数的多少显示了占有宝物的价值。
    
    设计、实现基本游戏逻辑
    ?
    需求分析:
    ?本任务初步实现玩家夺宝和分数的增加。游戏
    中,需要在一个显眼的位置设置一个显示分数的计分器。该计分器能够实时更新玩家的夺宝状况。在宝物被某一玩家夺取后,根据情节需要,应使该宝物自动消失,游戏显示结束。
    
    设计、实现基本游戏逻辑
    ?
    方案设计:
    ?对于计分器的添加,使用GUI控件中的
    GuiTextCtrl文本框。?对于宝石夺取后的消失、计分器分值的增加等逻辑的实现需要在服务器端添加加分和程序结束判断的脚本程序及在客户端添加分数显示和结束处理脚本程序。
    
    设计、实现基本游戏逻辑
    ?
    关键技术:
    ?界面控件的添加及属性设置、加分逻辑的分析
    与实现、宝石抢夺结束的判断及处理、分数显示及游戏结束或重新开始的提示。
    
    记分器的实现
    ?
    基本游戏逻辑要实现的是每一个抢到宝石的要加1分,方法如下:
    ?
    1)进入GUI界面编辑器。启动游戏,使其处于运行状态。键入F10进入GUI界面编辑器;进入后,在该编辑器上方中间,GUI文件选择下拉菜单中,选中的PlayGui文件就是游戏世界的界面文件,如图1所示
    
    记分器的实现
    ?
    2)添加分数计数器。在编辑器上方的第一个“新控件选择NewControl”下拉菜单中选择GuiTextCtrl。在编辑器右侧上方的树形视图上,确定该新控件被选重,
    
    记分器的实现
    ?
    3)设置记分器属性。该文本控件用作记分器,在右下方的属性窗口中把这个控件重命名为“ScoreCounter”(在Apply按钮旁边的输入框)。点击Parent节中的profile按钮,选择GuiBigTextProfile,使记分显示大文字。在General节的text域里填入“Score:0”,设置初值,并点击Apply,如图3所示,这时在游戏界面上,可以看到这个显示较大字符的记分器了,如图4所示
    
    记分器的实现
    ?
    4)调整记分器位置。把它放在一个看起来舒服的位置,并检查它在不同分辨率下的显示效果。可以把HorizSizing和VertSizing都设置为relative。使得记分器的相对位置不变。选择File菜单的SaveGUI…选项,把它存放在“Capturetreasure/client/ui/playGui.gui”目录,如图5.所示
    
    记分器的实现
    ?
    ?
    ?
    5)在编辑界面中修改这个playGui.gui,在主控件定义的最后一行添加nocursor=1;保证鼠标能够指挥摄像机6)添加并保证加载加分程序。由教学网站上得到该套路的服务器端加分程序logoitem+.cs,将代码粘贴到Capturetreasure/server/logoitem.cs文件中并保存它。7)添加并保证加载分数显示程序。由教学网站上得到该套路的客户端分数显示程序clientGame.cs,将其拷贝到Capturetreasure/client/目录下
    
    记分器的实现
    ?
    ?
    8)打开Capturetreasure/main.cs文件并找到initClient函数里的“Clientscripts”节。在这节代码行的下面添加下面一行代码,保证正确载入和执行clientGame.cs脚本文件。exec(./client/clientGame.cs);9)重新启动游戏,当玩家碰到宝石时,宝石将不见了(表示已经获得了宝石),并在记分器中加1分。当全部宝石抢夺完毕后将显示结束游戏或重新开始的提示框,如图6所示
    
    知识点
    1)界面控件的添加及属性设置?2)加分逻辑的分析与实现,宝石抢夺结束的判断及处理?3)分数显示及游戏结束或重新开始的提示
    ?
    
    脚本程序
    1)服务器端加分和程序结束判断程序(logoitem+.cs)?2)客户端分数显示和结束处理程序(clientGame.cs)
    ?
    
    原型丰富
    场景丰富?声效添加?玩家特性?环境仿真?界面友好
    ?
    
    场景丰富
    添加篝火与瀑布场景?实现爆炸效果
    ?
    
    添加篝火场景
    ?
    ?
    ?
    1)将脚本程序中的Particls.cs复制到Capturetreasure/server/目录下,在game.cs的onServerCreated()中添加该脚本的加载执行,exec(./particle.cs);2)将美术素材中的两个图片复制到data/shapes/particles/目录下3)重新启动游戏开发平台,在图形界面下建立篝火和烟(见图1,图2)4)建立火的发射器节点对象fire01,如图1所示5)建立烟的发射器节点smoke01,如图2所示6)通过修改烟的位置坐标调整烟火的位置,使两者配合得当7)如此可以根据需要建立相应的火和烟,例如可以建立灯火,如图3所示
    
    添加瀑布
    
    ?
    ?
    1)将脚本程序中的waterFall.cs中的脚本复Particls.cs的后面2)重新启动游戏开发平台,在图形界面下建瀑布(见图4)3)建立瀑布的粒子发射器节点wfall01,如图4所示4)一个优美的瀑布一般可以多用几个瀑布的粒子发射器节点,图5就是两个粒子发射器给出的瀑布5)通过修改位置坐标调整瀑布的位置,如图5所示6)如此可以根据需要建立相应的瀑布
    
    实现爆炸效果
    ?
    剧情理解:
    ?要想夺得宝物,顺利取得胜利几乎是不可能的。除了
    险恶的自然环境,游戏中还充满机关,处处存在陷阱,最终胜出的夺宝人必定是勇猛却又充满智慧的。为了增加游戏的不确定性给玩家带来惊险和刺激,爆炸效果必不可少。
    ?
    需求分析:
    ?根据故事情节,需要为游戏添加爆炸效果。爆炸效果
    出现在当玩家碰到卵石时即刻产生爆炸,同时玩家需要为爆炸付出代价,玩家的分值自动减少5分。
    
    实现爆炸效果
    ?
    方案设计:
    ?
    对于爆炸效果,采用粒子系统来实现,需要的素材包括火花、烟及爆炸碎片等图片和模型。
    ?
    关键技术:
    ?粒了系统的Particle,爆炸数据块ExplosionData
    和碎片数据块DebrisData
    
    实现爆炸效果套路
    ?
    
    1)将脚本程序目录中的Explosion.cs复制到Capturetreasure/server/目录下,在game.cs的onServerCreated()中添加该脚本的加载执行,exec(./Explosion.cs);2)将美术素材中的三个文件复制到data/shapes/particles/目录下3)重新启动游戏开发平台,在图形界面下建立一个卵石并命名它为”jiaBao”如图1所示,保存游戏任务。
    
    ?
    ?
    4)修改Capturetreasure/server/目录下,文件logoitem.cs中的functionBoulderItem::onCollision(%this,%obj,%col)函数,该函数原来的功能是如果碰到就加3分,这里改为如果碰到的是“jiaBao”则要减去5分,并引发爆炸。5)重新启动游戏如果玩家碰到的是jiaBao卵石则产生爆炸,并减去5分,如图2所示。
    
    知识点
    1)数据块对象Datablock用到三类:例子系统的Particle,爆炸数据块ExplosionData和碎片数据块DebrisData。?2)爆炸数据块和例子发射器之间的关系?3)爆炸函数对被炸对象的使用
    ?
    
    声效添加
    使用界面背景音乐?使用场景背景音乐
    ?
    
    使用界面背景音乐
    ?
    1)打开client目录下的audioProfiles.cs音乐定义脚本文件,里面已经有了一些描述声音的数据块对象,使用下载的脚本程序myBackAudio.cs在该文件的后面定义自己的声音描述,例如这里的MyBackAudio声音描述块和声音原数据块MyBackAudioProfile2)将素材中的背景音乐文件background.wav拷贝到Capturetreasure/data/sound/目录下,如图1所示3)打开Capturetreasure/目录下的main.cs脚本文件,在initClient();客户端初始化函数的结尾添加播放声音的函数alxPlay(MyBackAudioProfile);4)启动游戏这样在启动界面中就能听到添加进去的音乐
    ?
    ?
    ?
    
    使用场景背景音乐
    
    ?
    ?
    1)将素材中的背景音乐文件playgroundsound.wav拷贝到Capturetreasure/data/sound/目录下,与前面的步骤2类似2)在脚本程序中已经准备一个服务器端的声音定义文件audioProfiles.cs,注意不要和客户端的那个弄混,注意两者内容的区别。将这个服务器端的文件拷贝到Capturetreasure/server/目录下3)打开server目录下的Game.cs脚本程序,在函数onServerCreated()的最后一行添加语句exec(./audioProfiles.cs);实现该脚本的装入执行4)启动游戏用F11进入世界编辑器,在主菜单的Window-WorldEditorCreateor下,通过右下角的树型结构添加该背景音乐,如图2所示
    
    使用场景背景音乐
    ?
    5)主要有三项选择,SoundProfile选择脚本文件中设置的palyBackSound;SoundDescription选择AudioDefaultLooping3d;Useprofiledesc?选项一定要选中,即处于非空状态如图2所示
    ?
    6)得到如图3所示的绿色音乐盒,注意:如果是黑盒或者是音乐播完或者是脚本程序有问题,这里是绿盒并能听到音乐,场景音乐是有距离的,该音乐盒要设置在玩家常在的地方,或在不同的环境放置不同的背景。
    7)保存任务重新启动游戏,这时自己游戏的界面背景音乐和场景背景音乐就出现了
    ?
    
    知识点
    1)音乐描述数据块和音乐原数据块的区别?2)客户端定义音乐是使用new方法,而服务器端音乐的定义是使用Datablock?3)界面背景音乐是无距离的,而场景音乐是有有距离的。
    ?
    
    玩家特性
    优美的环境、逼真的音效自然为游戏增加了不少好感,接下来需要让玩家和角色对应起来了。?本次任务主要是根据游戏需要搜集整角色资源,实现玩家角色与模型的联接。
    ?
    
    方案设计:
    为游戏搜集符合要求的角色及对应角色动画。?搜集角色可能发出的声音文件。?实现玩家角色与模型的联接,定义TSShapeConstructor数据集。
    ?
    
    动画素材准备
    ?
    ?
    1)在开发平台的素材准备时,已经将游戏中需要的动画准备好了,可以用TorqueShowTool工具来查看每个动画,如图1所示2)其中.dts文件是玩家的基础模型,.dsq文件则是玩家的各种动画,player.cs文件是玩家动作的定义文件,通过该文件将玩家的各种动作命名,方便脚本编程时使用,
    
    声音素材准备
    ?
    
    1)根据游戏剧情的要求需要下载玩家及各种事件需要的音乐,在音乐素材的下载中包含如下文件:Fightpain.wav:大宝砸下来的声音和玩家痛苦的声音,配合玩家的动画laughBao.wav:得到宝后的笑声,配合玩家动画oh_no.wav:被炸和最后体力耗尽时发出的声音,配合玩家动画2)将这些音乐文件拷贝到声音目录data/sound/的下面,已被调用3)根据自己的设计在网上发现自己的音效,例如:火的声音、风的声音等
    
    知识点
    1)player.cs文件中动画的命名和使用方法?2)音效与玩家动作的配合
    ?
    
    创建角色特征
    ?
    剧情理解:
    ?玩家角色正式入场了!最令玩家兴奋必定是夺
    宝那一刻。在游戏中当玩家成功夺得宝物时,玩家将开怀大笑,同时还将兴奋地挥动手臂。
    ?
    需求分析:
    ?本次任务要求玩家在夺得宝物一刻大笑和挥手。
    因此,需要在玩家碰到宝物时产生大笑的音效,并播放玩家挥手的动作。
    
    方案设计:
    创建笑声音效数据集并在游戏的OnCollision函数中播放该声音。?定义玩家数据集,加入角色动画,在OnCollision函数中播放挥手动画。
    ?
    
    创建玩家角色
    ?
    ?
    ?
    ?
    1)打开基础运行平台下server/目录下的角色创建文件player.cs,将文件开头的装入模型及其对应动画的脚本改为下面的语句exec(~/data/shapes/player/player.cs);表明使用角色模型目录下的脚本程序player.cs进行玩家模型和动画的定义,见图12)在玩家数据块datablockPlayerData(PlayerBody)的定义中,设定玩家的最大伤害值为100,即添加语句maxDamage=100;结果如图1所示3)将下载的脚本程序playCel.cs的玩家得到宝时高兴的动作和声音定义、播放等脚本添加到server/目录下player.cs文件的最后面4)确定声音文件已经拷贝到~/data/sound/目录下
    
    夺宝动画及其音效
    ?
    ?
    1)打开server/目录下的夺宝脚本文件logoitem.cs,对得到普通宝石的函数BoulderItem::onCollision添加笑声和晃手,结果如图2所示,注意:这里不对logo和弹力宝石添加音乐和动画2)保存程序,启动游戏在玩家得到宝石时就会听到他的笑声和摆手的动作,注意:由于玩家是受键盘控制的,如果在操作时一直按住移动键则不能出现摆手动作,所以,要快速离开键盘
    
    游戏集成
    建立网络游戏服务器?实现服务器查找和加入?实现玩家聊天室
    ?
    
    建立网络游戏服务器
    ?
    TGE引擎内置了C/S结构,因此Torque应用程序的结构分为三种运行模式
    ?独立服务器模式,这种模式无客户端;?主机服务器模式,是一个自身的C/S模式,这
    种模式的应用程序包含服务器和客户端两部分;?纯客户端,这种模式仅是搜索并加入服务器,自身没有创建服务器。
    
    需求分析:
    ?
    ?
    荒原夺宝作为一款网络游戏,建立网络游戏服务器是一个必不可少的内容,玩家可以根据所用计算机的处理能力和玩游戏的方式建立网络游戏服务器通常建立独立服务器是多人参与游戏的首选方式,主机服务器模式虽然能够实现多人参与游戏,但是位于主机服务器上的客户端与其他客户端不是平等的,会影响服务器的运行状态。
    
    需求分析:
    独立服务器的创建是不需要客户端界面的,这样可以最大限度地节省服务器的资源,从而提高程序的运行效率,所以在独立服务器方式仅提供一个控制台方式的信息显示和操作窗口,系统通过批文件命令的方式启动?而主机服务器则要求启动游戏的计算机既要启动游戏服务器还要运行游戏的客户端。
    ?
    
    方案设计:
    ?
    ?
    以批命令文件的方式启动独立服务器,当用户的输入参数含有-dedicated参数时表明是启动专用服务器,通过函数createServer(“MultiPlayer”,$missionArg);完成网络游戏服务器的启动通过在任务选择界面中增加复选控件GuiCheckBoxCtrl,命名为ML_isMultiplayer,Text属性设置为HostMultiplayer;variable变量属性设置为pref::HostMultiPlayer,通过该变量的值脚本程序判断是建立多人参与的游戏服务器还是单人玩的单机游戏服务器。
    
    关键技术:
    ?
    ?
    文件prefs.cs中的变量是系统的全局变量,它保存着系统运行中的赋值结果,是由脚本程序控制自动创建的,而Capturetreasure/server/defaults.cs中的变量是开发者提供的默认值,所以一个发行的新游戏通常只是建立后者,并且在首次运行前删除前者。createServer(MultiPlayer,$missionArg);建立服务器函数的应用。
    
    开发套路
    ?
    建立网络游戏独立服务器
    1)由脚本编辑器修改Capturetreasure/main.cs脚本程序,下载脚本程序中的文件dedicatedServer.cs,用其中的脚本代替下列脚本packagettb{……activatePackage(ttb);
    
    开发套路
    ?
    建立网络游戏独立服务器
    1)由脚本编辑器修改Capturetreasure/main.cs脚本程序,下载脚本程序中的文件dedicatedServer.cs,用其中的脚本代替下列脚本packagettb{……activatePackage(ttb);
    
    开发套路
    ?
    建立网络游戏独立服务器
    1)由脚本编辑器修改Capturetreasure/main.cs脚本程序,下载脚本程序中的文件dedicatedServer.cs,用其中的脚本代替下列脚本packagettb{……activatePackage(ttb);
    
    开发套路
    ?
    建立网络游戏独立服务器
    1)由脚本编辑器修改Capturetreasure/main.cs脚本程序,下载脚本程序中的文件dedicatedServer.cs,用其中的脚本代替下列脚本packagettb{……activatePackage(ttb);
    
    开发套路
    ?
    建立网络游戏独立服务器
    1)由脚本编辑器修改Capturetreasure/main.cs脚本程序,下载脚本程序中的文件dedicatedServer.cs,用其中的脚本代替下列脚本packagettb{……activatePackage(ttb);
    
    开发套路
    ?
    建立网络游戏独立服务器
    2)建立启动独立服务器的批文件CapturetreasureDedicated.bat,该文件中仅包含下面的一行批命令:Capturetreasure.exe-dedicated-missionCapturetreasure/data/missions/Capturetreasure.mis
    
    ?
    建立网络游戏独立服务器
    3)将文件Capturetreasure/prefs.cs和Capturetreasure/server/defaults.cs中的$Pref::Server::Name=TorqueTTBServer;修改为$Pref::Server::Name=CapturetreasureGameServer;
    
    ?
    建立网络游戏独立服务器
    4)保存各修改后的脚本程序,启动独立服务器结果如图1所示,为了验证该服务器是否可以使用,可以通过系统自带的示例游戏,starter.fps。用它的JoinServer按钮,如图2所示,启动服务器搜索界面,如图3所示,通过QueryLAN按钮查到该服务器
    
    图1启动独立服务器
    
    图2.服务器查询按钮
    图3.查询游戏服务器的结果
    
    开发套路
    ?
    建立网络游戏主机服务器
    ?启动游戏,由F10进入界面编辑器,由中间的
    界面下拉框选择任务选择界面startMissionGui,结果如图4所示
    
    图4.游戏任务选择界面
    
    ?
    建立网络游戏主机服务器
    ?由左边的新控件选择下拉框选择复选控件
    GuiCheckBoxCtrl,命名为ML_isMultiplayer,Text属性设置为HostMultiplayer;variable属性设置为pref::HostMultiPlayer,结果如图5所示
    
    图5.设置复选框的属性
    
    ?
    建立网络游戏主机服务器
    ?以File-Save
    GUI方式,将该GUI保存回Capturetreasure/client/ui/目录的startMissionGui.gui文件中?退出GUI编辑界面和游戏,重新启动游戏后点击主菜单的开始按钮则弹出游戏任务选择窗口,在该窗口的中下部则能看到HostMultiplayer复选框,如果是单人游戏则不要选中该框,如果选中则建立多人玩的主机服务器模式
    
    知识点
    建立独立服务器的主要脚本?理解prefs.cs和defaults.cs文件中主要全局变量的意义?建立主机服务器时,$pref::HostMultiPlayer全局变量,在界面程序startMissionGui.gui和处理程序startMissionGui.cs中的纽带作用
    ?
    
    需求分析:
    ?
    在多人玩的网络游戏中,玩家通过加入到游戏服务器来共同玩一个游戏,因此游戏的操作界面需要提供一个服务器查找和加入的对话框,玩家可以根据个人的兴趣选择要加入的网络游戏服务器。
    
    需求分析:
    ?
    服务器查找和加入过程需要完成以下几项功能:查找界面的建立;查找程序的执行;查找状态的显示;查找结果的显示;而加入到一个指定的服务器则是与其建立一个连接。由此需要进行界面和脚本程序两方面的配合。
    
    方案设计:
    ?
    以滚动窗口控件GuiScrollCtrl,作为服务器列表的显示界面,列表控件GuiTextListCtrl负责列表数据的存放。进度条控件GuiProgressCtrl,显示具体查询的进行状态,在这个进度条中添加一个文本条,显示当前查询的内容。
    
    方案设计:
    ?
    使用查询函数queryMasterServer()进行主管网络服务器的查询,使用查选函数queryLANServers()进行局域网络服务器的查询,使用查询回调函数onServerQueryStatus(%status,%msg,%value)确定查询的进度显示。
    
    方案设计:
    ?
    通过函数%conn.connect($ServerInfo::Address);连接到指定的网络游戏服务器。
    
    关键技术:
    1)回调函数onServerQueryStatus(%status,%msg,%value)对查询进度显示的作用。?2)语句setNetPort(0);确定查找服务使用的端口号,注意:进行网络操作时,本地网络一定要可用,不是禁用状态。
    ?
    
    开发套路结构
    ?
    1)启动游戏以F10进入GUI编辑界面,以File-NewGUI方式,选择建立新的GUI界面。将新的GUI命名为JoinServerGui,类为GuiChunkedBitmapCtrl,点击设置框左下角的Create按钮完成新GUI的建立,将该GUI的背景图片设置为startMissionBG.jpg
    
    ?
    由新控件下列框中选择GUI控制控件GuiControl,然后将该控件拖拽到画面的中心位置,适当调整区域大小,如图1所示,设置该控件的Profile为GuiWindowProfile;HorizSizing和VertSizing设置为center
    
    图1.建立GuiControl控件
    
    ?
    由新控件选择框中选择GUI控制控件GuiTextCtrl,建立文本框显示输入提示,如图2所示,设置该控件的属性Text为PlayerName:属性maxLength为128。在该提示文本的右面添加GuiTextEditCtrl控件,设置该控件的属性Variable为pref::Player::Name,属性maxLength为128,如图2所示
    
    图2.添加玩家命名框
    
    ?
    与上步骤一样,用GuiTextCtrl控件,为服务器查找列表框建立提示文本ServerList,然后在其下方添加滚动窗口控件GuiScrollCtrl,修改该控件的hScrollBar属性为dynamic,如图3所示,为该控件加入列表控件GuiTextListCtrl命名为JS_serverList
    
    图3.建立服务器查询列表框
    
    ?
    在服务器查找列表框的下面添加五个按钮控件GuiButtonCtrl,分别命名为:JS_back,JS_queryLan,JS_queryMaster,JS_refreshServer和JS_joinServer其text属性分别设置为Back、QueryLAN、QueryMaster、RefreshServer和JoinServer!,Command属性分别设置为Canvas.getContent().exit();、Canvas.getContent().queryLan();、Canvas.getContent().query();、Canvas.getContent().refresh();和Canvas.getContent().join();
    
    ?
    其作用分别为:由该查找窗口回到主界面、在局域网中查找服务器、在网络中查找主服务器、服务器列表刷新,和加入到选定的游戏服务器,如图4所示
    
    图4.服务器查询列表界面
    
    ?
    添加查找状态条,在主查询界面的中空处添加一个用作查找状态条的GuiControl控件,适当调整区域大小,设置该控件的Profile为GuiWindowProfile,如图5所示,命名为JS_queryStatus,在这个状态条的左边添加一个取消按钮,以便查询时间过长时终止查询,选择按钮控件GuiButtonCtrl,命名为JS_cancelQuery命令属性Command设置为Canvas.getContent().cancel();为了显示查找的进度在取消按钮的右侧添加进度条控件GuiProgressCtrl,命名为JS_statusBar,为了显示具体查询内容在这个进度条中添加一个文本条,使用文本控件GuiTextCtrl,命名为JS_statusText,其text属性设置为QueryServers,如图6所示
    
    图5.建立服务器查询进度条
    
    图6.完善服务器的查询进度条
    
    ?
    为了方便直接查看查询的结果,在查询窗口的右上角再添加一个直接的文字显示,使用文本控件GuiTextCtrl,命名为JS_status。将该新建的服务器查找窗口保存到Capturetreasure/client/ui/目录的JoinServerGui.gui文件中
    
    ?
    由界面编辑器的中间下拉框,选择游戏的主界面mainMenuGui,如图7所示,为该界面的加入游戏按钮建立Command属性,设置为:Canvas.setContent(JoinServerGui);保存该主界面文件,退出图形界面开发平台,进行脚本的编辑
    
    图7.设置加入游戏按钮的Command属性
    
    ?
    编辑JoinServerGui.gui脚本文件,将下载的脚本程序JoinServerGui.cs复制到JoinServerGui.gui文件的最后面,保存回该界面文件。修改Capturetreasure/目录下的main.cs文件中客户端初始化函数initClient(),在exec(./client/ui/aboutDlg.gui);语句的下面添加装载服务器查询GUI的脚本exec(./client/ui/JoinServerGui.gui);
    
    ?
    在exec(./client/default.bind.cs);语句的下面添加setNetPort(0);以便确定查找服务使用的端口号注意:进行网络操作时,本地网络一定要可用,不是“禁用”状态保存该文件main.cs
    
    ?
    启动游戏,在主菜单中选择加入游戏按钮,就会进入游戏服务查找的界面,然后就可以由界面中下部的按钮进行相应的查找操作,并通过JoinServer!按钮加入到选定的游戏服务器
    
    知识点
    1)建立服务器查找界面的各种GUI控件的使用?2)理解不同范围服务器查找函数的具体含义?3)理解回掉函数onServerQueryStatus(%status,%msg,%value)在查询进度显示时的作用
    ?
    
    实现玩家聊天室
    ?
    玩家可以以单独方式进行游戏,也可以以组队的方式进行游戏,所以,玩家之间需要进行沟通,游戏聊天室则是玩家之间进行沟通的重要手段。系统也会将当前游戏场景中的各种事件及时地通知给玩家,所以在聊天室中系统也会发布当前游戏场景中的时事要闻。
    
    需求分析:
    ?
    玩家聊天室可以通过编写脚本全部自己实现也可以利用common目录下已经实现的函数来实现,common目录下的server和client目录分别实现了相应端的聊天函数,根据需要调用或重载相应的函数就可以了,这里就采用这种方法来实现,这里聊天室实现了玩家输入信息的广播发送,和系统信息的广播。
    
    方案设计:
    ?
    从实现上看聊天室是由两部分组成,一部分是信息的显示,另一部分是信息的录入,信息的显示是将来自服务器的信息显示出来,而录入部分则是将用户录入的信息交给服务器。每一部分都需要界面和程序的配合。
    
    方案设计:
    ?
    以HUD方式实现信息显示界面,命名为MainChatHud。信息控件为窗口滚动控件GuiScrollCtrl和消息向量控件GuiMessageVectorCtrl,信息的来源是通过函数onChatMessage(%message,%voice,%pitch)由服务器传来的。
    
    方案设计:
    ?
    以HUD方式实现玩家聊天录入框,命名为MessageHud。以文本编辑控件GuiTextEditCtrl,命名为MessageHud_Edit来让玩家输入聊天信息,通过属性AltCommand设置为MessageHud_Edit.eval();实现玩家聊天信息的发送,通过U键在场景界面中调出聊天输入窗口,需要热键的绑定语句moveMap.bind(keyboard,u,toggleMessageHud);。
    
    关键技术:
    1)GUI控件的profile属性决定文本的显示、存储和编辑方式,本任务中的该属性设置要根据控件的作用适当选择。?2)信息接收的接口函数和信息发送函数的使用。?3)热键的绑定语句moveMap.bind()的使用。
    ?
    
    
 
友情链接:ag体育网投  尊龙游戏  ag环亚手机客户端  ag电子游戏哪个容易赢  尊龙注册官网  万博app客户端下载