XNA游戏开发之速度调整

简介:

摘要:

我们知道在Windows Phone 7中XNA游戏默认的帧频是30fps(PC和xbox360中是60fps),可是实际游戏开发过程中这个值未必都能满足我们的需求。下面我们就一块看一下在XNA游戏开发过程中如何调整游戏的速度。

内容:

在Game类中有一个属性TargetElapsedTime,用来表示每一帧之间的时间间隔,例如默认为1/30秒,也就是帧频为30fps。如果仔细看一下你会发现在VS自动生成的Game1类的构造函数中给TargetElapsedTime属性赋值为TimeSpan.FromTicks(333333) ,也就是时间间隔为 0.0333… 秒,帧频 30fps 。既然如此我们就可以修改这个值达到我们想要的结果,例如我们修改为 333333*2 就可以将速度放慢一倍(当然也可以不使用刻度为单位,例如使用 TimeSpan.FromSeconds(1/15) )。

这种方法看似可行,但是多数情况下我们没有办法这么做,因为如果修改了TargetElapsedTime属性就表示整个游戏的帧频都进行了修改。通常游戏中不可能都是某种固定帧频,一般都是游戏中有些元素运动得快,有些元素运动的慢,因此很难用某种统一的速度来设置。这个时候我们怎么办呢?

我们知道游戏的动画速度取决于Update中动态变量变化的程度,如果我们可以控制变量的变化速度就可以修改游戏的速度。此时我们注意到Update方法有一个GameTime类型的参数,它有一个属性ElapsedGameTime ,表示从上一帧到这一帧的时间间隔。有了它我们只需要设置一个变量用来记录时间间隔,只有间隔到达我们需要的值时才在Update中修改动态变量,这样的话就可以变形的修改动画速度了。例如下面一个通过动态更改图片来形成动画效果Demo(图片在对应的Content中,分别为1.png、2.png、3.png、4.png、5.png),原来的代码如下:

复制代码

  
  
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
namespace WindowsPhoneGameDemo
{
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Dictionary
< int , Texture2D > dicImgs = new Dictionary < int , Texture2D > ();
Texture2D currentImg
= null ;
int index = 1 ;
public Game1()
{
graphics
= new GraphicsDeviceManager( this );
Content.RootDirectory
= " Content " ;
TargetElapsedTime
= TimeSpan.FromTicks( 333333 ); // 此处可修改全局帧频

}
protected override void Initialize()
{
base .Initialize();
currentImg
= dicImgs[ 1 ]; // 设置默认值
}
protected override void LoadContent()
{
spriteBatch
= new SpriteBatch(GraphicsDevice);
for ( int i = 1 ; i <= 4 ; ++ i)
{
dicImgs.Add(i,
this .Content.Load < Texture2D > (i.ToString()));
}
}
protected override void UnloadContent()
{
}
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this .Exit();
if (index > 4 )
{
index
= 1 ;
}
currentImg
= dicImgs[index];
index
++ ;
base .Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(currentImg,
new Vector2( 320 , 135 ), Color.White);
spriteBatch.End();
base .Draw(gameTime);
}
}
}
复制代码

经过修改后:

复制代码

  
  
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
namespace WindowsPhoneGameDemo
{
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Dictionary
< int , Texture2D > dicImgs = new Dictionary < int , Texture2D > ();
Texture2D currentImg
= null ;
int index = 1 ;
int timeSinceLastFrame = 0 ; // 记录更新间隔
int millisecondsPerFrame = 330 ; // 设置时间间隔
public Game1()
{
graphics
= new GraphicsDeviceManager( this );
Content.RootDirectory
= " Content " ;
TargetElapsedTime
= TimeSpan.FromTicks( 333333 ); // 此处可修改全局帧频

}
protected override void Initialize()
{
base .Initialize();
currentImg
= dicImgs[ 1 ]; // 设置默认值
}
protected override void LoadContent()
{
spriteBatch
= new SpriteBatch(GraphicsDevice);
for ( int i = 1 ; i <= 4 ; ++ i)
{
dicImgs.Add(i,
this .Content.Load < Texture2D > (i.ToString()));
}
}
protected override void UnloadContent()
{
}
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this .Exit();
timeSinceLastFrame
+= gameTime.ElapsedGameTime.Milliseconds;
if (millisecondsPerFrame <= timeSinceLastFrame) // 只有小于等于指定的时间间隔才进行图片切换
{
timeSinceLastFrame
-= millisecondsPerFrame;
if (index > 4 )
{
index
= 1 ;
}
currentImg
= dicImgs[index];
index
++ ;
}
base .Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(currentImg,
new Vector2( 320 , 135 ), Color.White);
spriteBatch.End();
base .Draw(gameTime);
}
}
}
复制代码

下面我们对比一下这个动画的修改前后的效果:

修改帧频前

修改帧频后

OK,今天就到这里吧!

目录
相关文章
|
人工智能 安全 Unix
游戏编程之九 设计工具之游戏引擎
游戏编程之九 设计工具之游戏引擎
88 0
|
4月前
|
开发者 C# 容器
【独家揭秘】当WPF邂逅DirectX:看这两个技术如何联手打造令人惊艳的高性能图形渲染体验,从环境搭建到代码实践,一步步教你成为图形编程高手
【8月更文挑战第31天】本文通过代码示例详细介绍了如何在WPF应用中集成DirectX以实现高性能图形渲染。首先创建WPF项目并使用SharpDX作为桥梁,然后在XAML中定义承载DirectX内容的容器。接着,通过C#代码初始化DirectX环境,设置渲染逻辑,并在WPF窗口中绘制图形。此方法适用于从简单2D到复杂3D场景的各种图形处理需求,为WPF开发者提供了高性能图形渲染的技术支持和实践指导。
304 0
|
5月前
|
存储 缓存 C#
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
|
6月前
|
前端开发 图形学
技术经验解读:【Unity3d游戏开发】UGUI插件入门之游戏菜单
技术经验解读:【Unity3d游戏开发】UGUI插件入门之游戏菜单
36 0
|
缓存 算法 API
《unity游戏优化》第六章读书笔记
《unity游戏优化》第六章读书笔记
110 0
游戏开发:碰撞模型,球球大作战小游戏【VB编程经典案例】
游戏开发:碰撞模型,球球大作战小游戏【VB编程经典案例】
132 0
Silverlight 游戏开发小技巧:“.NET研究”冲击技能特效制作
  玩游戏的时候,肯定对以角色为中心释放的冲击波肯定上海徐汇企业网站设计与制作特别有震撼力,前面使用Silverlight的变换完成了升级特效和传送点特效,这次制作以中心为原点冲击的发散特效,相信效果会非常的不错。
854 0
一起谈.NET技术,Silverlight 游戏开发小技巧:冲击技能特效制作
  玩游戏的时候,肯定对以角色为中心释放的冲击波肯定特别有震撼力,前面使用Silverlight的变换完成了升级特效和传送点特效,这次制作以中心为原点冲击的发散特效,相信效果会非常的不错。   首先仍然是建立一个控件,这个控件名字,我暂时命名为Shockwave.xaml,并且准备两张作为冲击波效果基础图像,这里面的图片可以随便更换,可以拜托美术的兄弟制作一下,如果你有兴趣,可以了解有关软件的使用方法,当然了,使用Blend也能做出来,只不过考虑麻烦程度,还是先以简单的为主,我找来两张图片简单做了处理。
944 0
|
图形学
Unity 优化之 移动游戏加载性能和内存管理全解析【2017年版】
首先感谢UWA的公开课讲解,本文中的内容主要采集于UWA2017的公开课公开课中的优化点对于项目的帮助是不容小觑的~ 去年的PPT截取,笔者抽时间整理一下,有相关视频的PPT的截图和博客地址。
1195 0
|
前端开发 图形学 atlas
Unity 优化之UGUI (2017年版【一】)
首先感谢UWA的公开课讲解,本文中的内容主要采集于UWA2017的公开课公开课中的优化点对于项目的帮助是不容小觑的~ 在去年观看uwa在直播公开课的时候,发现了多在自己使用ugui中使用不正确的地方,但是碍于项目工期比较紧张,并没有进行系统的整理,时...
1758 0

热门文章

最新文章