代码改变世界

【原创】XNA 4.0学习知识记录(1)

2011-01-27 21:11  刺客之家  阅读(629)  评论(0编辑  收藏  举报

记录一下学习过程中的知识点,以后进行整理。

 

1:使用Window.ClientBounds属性,可以随时获取当前显示区域(PC上理解为游戏的可见区域)的大小。

 

2:几个方法的用法:

1)LoadContent()  进行资源的载入

2)Update()      XNA进行画面更新的时候,需要修改的参数在这里修改

3)Draw()      XNA进行绘制图片的时候,绘制逻辑在这里调用

 

3:绘制图片的时候,绘制逻辑应该写在: spriteBatch.Begin 和 spriteBatch.End方法之间(一般情况下)

 

4:SpriteSortMode.FrontToBack枚举,字面意思是从前到后,但是实际绘制的结果,是Idex比较小的,反而显示在后面。可以这么理解,从前到后的意思,是层次较小的先绘制,层次较深的后绘制,所以层次较深的反而显示在最前面。

 

5:XNA默认的透明色是洋红色(255,0,255),这可能有历史原因,但是这个是可以修改的,可以指定任意一种颜色让XNA渲染为透明色。

 

6:帧速是控制绘制事件执行的重要因素,帧速保持在60fps比较好,这是让人眼睛不产生闪烁感的最低速度,高了会加重显卡的负担,低了效果不好。

 

7:帧速的修改有几种方式,一种是在构造函数中修改 TargetElapsedTime ,比如设置为TargetElapsedTime = new TimeSpan(0, 0, 0, 0, 17);表示每2帧间隔17毫秒,算下来相当于一秒大概60帧

 

8:可以在Update和Draw方法中,通过参数gameTime.IsRunningSlowly是否为true,来判断此时XNA是否已经跟不上你所指示的帧速了,如果是,你可能需要提醒用户当前配置获取不到最佳效果。

 

9:使用修改帧速虽然可以改变精灵的绘制频度,但是这往往不是解决问题的方式,如果需要不同的精灵以不同的频率进行刷新,这种方法就不行了。还有一种可行的方式,就是为每个精灵自定义自己的“精灵帧速”,需要2个变量,一个记录精灵本身多少毫秒绘制一次,一个记录从上一次绘制开始已经过了多少毫秒。然后在Update函数中,通过gameTime.ElapsedGameTime.Milliseconds属性,获取上一帧到现在过去了多少时间,然后累加变量,只有当变量超过自身的绘制等待时间,才绘制。

【PS:此种方法我理解是有条件的:整个画面的帧速必须要快于动画中任意一个精灵的绘制速度,因为这里帧速成为了累加时间的最小单位(每个帧触发一次Update)】

 

10:可以获取键盘的状态,从而对用户的输入进行处理: KeyboardState keyboardState = Keyboard.GetState();这句话可以获取键盘当前状态,然后使用类似keyboardState.IsKeyDown(Keys.Left)的方法来判断某个键是否按下。

【 Keyboard.GetState();方法开销很大, 在update里最好调用一次,保存结果,然后判断全部用这个结果】

 

11:使用“游戏组件”,可以简化程序的设计,利用DrawableGameComponent来对若干游戏中的精灵进行控制,并且在主程序的ComponentList中添加游戏组件,可以灵活的配置整个游戏框架中的各个模块。比如利用一个组件来控制所有的敌人,一个组件来控制所有的玩家,一个控制子弹等。这样可以灵活的配置是否需要处理子弹,处理玩家。

 

12:使用XNA GameStudio 4.0的专业工具Audio Create Tool可以建立声音库,XNA通过与声音库进行通讯以播放声音。声音库需要用XACT Auditioning Ultility运行起来,并且会占用80端口。所以需要关闭IIS或者其他使用了80端口的服务。

 

13:只有启动了XACT Auditioning Ultility,才能在Audio Create Tool的wav或者cue库中进行试听

 

14:游戏组件的Update方法和Draw方法是随着Game本身的Update和Draw方法一起调用的,这是默认的行为,也是可以禁止的。GameComponent类的2个属性分别控制这些方法:

Enable 控制是否执行Update(),Visible  控制是否执行Draw();

 

15:在游戏中使用的素材分为图片,音频,字体等,其中图片和字体通常都是通过XNA的内容管道进行处理的,统一添加到项目中;而音频的话,如果是使用XACT处理的,则不进入内容管道(也有使用内容管道处理音频的方式)。如果经过内容管道,则在LoadContent中用Content.Load<T>方法载入的时候,不需要加Content文件夹路径,而如果不通过内容管道,则需要加入Content路径(就是根据exe所属路径,去找音频文件放置的文件路径)。

 

16:XNA开发3D游戏,使用的坐标系是右手系,具体如下图:[右边的是右手系]

本博客文章若非标记转载,均为原创,转载请注明出处~