【PSS SDK官方教程文档翻译】(6)编程向导之四:面向对象

发布时间:2012-05-08 14:49:56 网友评论0|进入论坛

  本文来源:PSS开发网,转载请注明出处!

  论坛讨论帖:http://bbs.duowan.com/thread-27434960-1-1.html

  4. 面向对象

  本章节解释了面向对象的编程方法。

  创建一个游戏框架类:

  PS Suite 程序的基本框架,在“程序框架”章节中有所解释。框架程序与用PS Suite建立的程序基本相同。

  试着建立一个程序框架作为一个基类,继承它,并且使之能使用。

  打开Sample/Tutorial/Sample04_01 并且参看TutoLib工程内的GameFramework.cs.

  Sample/Tutorial/TutoLib/GameFramework.cs

【PSS SDK官方教程文档翻译】(6)编程向导之四:面向对象

  GameFramework类被定义了。上一篇源代码中,本应在Main()方法中运行的Update()和Render()方法,现在移动到Run()方法中了。这个机制会使继承自GameFramework类,调用Run()方法,并且进入一个循环。

  其中,time[0] =(int)stopwatch.ElapsedTicks和time[1] =(int)stopwatch.ElapsedTicks,用来计算运行时间。计算运行时间很有必要,因为任何程序都需要。这点将在后面解释。

  继承GameFrameworkSample这个类,并且实现GameFrameworkSample这个类。下面是继承的部分。

  Sample/Tutorial/Sample04_01/GameFrameworkSample.cs

【PSS SDK官方教程文档翻译】(6)编程向导之四:面向对象

【PSS SDK官方教程文档翻译】(6)编程向导之四:面向对象

  覆盖(Override)的部分对这个程序来说很特殊,例如游戏操控和实现。

  base.Initialize(), base.Update(),和 base.Render()方法调用了基类GameFramework中的定义。

  需要注意的是:

  ·base.Intialize()是在被继承的Intialize()开头被调用的。
  ·base.Update()是在被继承的Update()开头被调用的。
  ·base.Render()是在被继承的Render()末尾被调用的。

  如果忘记了加入base.Update()和base.Render()语句,基类中的方法将不会被执行,所以程序也就不能正常运行。

  下面的代码中使用了GameFrameworkSample类。

  Sample/Tutorial/Sample04_01/AppMain.cs

【PSS SDK官方教程文档翻译】(6)编程向导之四:面向对象

  生成了一个GameFrameworkSample的实例,并且调用Run()来按照前面相同的方法运行程序。

  试着运行这个程序。

  飞机会同上一个程序一样移动。

【PSS SDK官方教程文档翻译】(6)编程向导之四:面向对象

  这一次,左上方有数字。这些数字是GameFramework实现的,代表着每一帧的运行时间。这将会在下面的部分中解释。

  计算处理时间:

  知道“进程在哪儿花费了多长时间”对于游戏开发是很重要的。进程无论是花费10毫还是50毫秒,对于一个控制台程序来说都不是问题,但是对于游戏程序来说,如果不能跟屏幕切换同步,就会产生延迟,并且会出现明显的错误。

  当Sample04_01被执行的时候,数字将会在屏幕的左上角,挨着Update和Render的字母显示。这个数字代表着每次处理时间有多长,如果是16毫秒(屏幕切换时间),这个数字就是100%。

  这些数字将会依赖于程序执行的设备,但是在我的PC上这个过程大概是:

  Update=0.50% 和 Render=25.00%

  Update几乎不需要处理时间。这是由于Update()方法只需要简单的条件判断和加法计算。

  Render是25%,所以它的处理时间相当长。

  注意:由于不同设备有不同的渲染时间,所以Render的处理时间只是一个参考值。

  如果Update和Render的处理时间之和超过了100%,就不会与屏幕切换同步,就会产生处理延迟现象。

  在GameFramework.cs中实现了计算处理时间的过程。让我们看一下这个部分。

  Sample/Tutorial/TutoLib/GameFramework.cs

【PSS SDK官方教程文档翻译】(6)编程向导之四:面向对象

  Stopwatch类是一个测量流逝时间的类。测量从stopwatch.Start()开始。

【PSS SDK官方教程文档翻译】(6)编程向导之四:面向对象

  stopwatch.ElapsedTicks是流逝的时间。

  我们想要知道帧开始时间,所以我们在循环的开始处

  time[0] = (int)stopwatch.ElapsedTicks,

  从而得到开始时间。

  接下来,我们在Update()终止的位置。

  time[1] = (int)stopwatch.ElapsedTicks;

  从而得到结束时间。time[1]-time[0]得到的就是流逝的时间。

  接下来,我们用

  time[2] = (int)stopwatch.ElapsedTicks;

  来得到Render()的结束时间。

【PSS SDK官方教程文档翻译】(6)编程向导之四:面向对象

  preTime=(int[])time.Clone();用来复制流逝的时间到一个数组。

  然后,每次流逝的时间都将会被计算并且在DebugString中显示。DebugString是一个在屏幕顶端显示ASC||的字符串。这个字符串将会作为参数传递,然后被Console.Write()打印到屏幕上。

【PSS SDK官方教程文档翻译】(6)编程向导之四:面向对象

  由于不能显示当前帧的测量时间,所以屏幕上会显示出存储在perTime中的上一帧的测量时间。

  想要更加具体了解进程在哪些位置耗费了多少时间,只需要增加time[]数组的大小,然后试着增加time[1] =(int)stopwatch.ElapsedTicks;

  如果希望debug信息在ON和OFF之间的切换,只需按住L键和R键(在键盘上,按住Q键和E键)。

温馨提示:玩家可通过手机登陆tv.duowan.cn阅读多玩TVG新闻。 转帖到:
看完本文后有何评价? 已有0人评价,点选表情后可看到其他玩家的表态。
0
0
0
0
0
0
路过 期待 喜欢 讨厌 雷倒 泪奔

近期关注

  • 《刺客信条 奥德赛》披露海量新截图情报:等级上限特色玩法
  • 希里乱入《赛博朋克2077》 游戏还没发售就开始搞同人创作了
  • Steam星际夏日特卖开启 和夏季特卖星人一起拯救特卖宇宙
  • 穿上制服去传火:《黑暗之魂》将推出联动主题T恤及小玩意
  • 开发进度75%!《鬼泣5》宣布将于今年科隆展现场提供试玩
  • 《刺客信条 奥德赛》精美原画及更多情报放出:大反派是邪教
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6