XNA游戏开发之滚动背景

简介:

摘要:

在很多游戏开发中角色的运动都是相对游戏背景而言的,也就是说我们通过移动游戏场景来给游戏角色带来一种运动效果,毕竟我们的游戏视窗是有限的,如果无止境的让角色运动肯定是不可行的,下面我们就一块看一下在XNA中如何制作滚动的背景。

内容:

在多数游戏开发的时候,特别是对于角色游戏,除了游戏角色本身的运动之外,更多的时候游戏给人的行动感觉是由游戏背景的移动造成的(我们平时看的动画片也是如此),毕竟游戏视窗是有限的,角色不可能超出游戏视窗而运动,它的运动范围也仅仅在整个游戏视窗内。这样一来我们就必须准备好整个游戏的背景,在游戏中动态改变它的位置。可是对于稍微复杂的游戏,其背景长度也是不可估量的(例如超级玛丽),此时我们就不可能一次加载所有的背景,此时我们怎么办呢?事实上对于这个问题我们通常是将整个背景做成可循环的,这有一点类似于我们地板设计,每个地板和另一地板的连接处花纹都是连续的;其次就是我们可以将游戏背景中的物体拆分开来,然后在游戏运行过程中进行动态组合。对于第二种情况我们暂且不管,我们今天主要讨论一下第一种情况。针对第一种情况假设我们有下面一副背景,在X方向它是可以无限循环显示的:

整幅背景图片

那么下面我们是不是就可以直接让整个图片循环显示就可了呢?答案是否定的。对于重复显示的背景我们直接整张图片加载起来是不切实际的,因为它的体积太大了。我们常用的做法是根据屏幕大小将图片分割成多张。例如上面的背景我们就可以切分成两张图片:

背景图片1
背景图片2

为了清楚的看到整个背景滚动形成的动画效果,我们给游戏添加一个角色:小鸟

下面是我们的完整代码:

复制代码

  
  
1 using System;
2   using System.Collections.Generic;
3   using System.Linq;
4 using Microsoft.Xna.Framework;
5 using Microsoft.Xna.Framework.Audio;
6 using Microsoft.Xna.Framework.Content;
7 using Microsoft.Xna.Framework.GamerServices;
8 using Microsoft.Xna.Framework.Graphics;
9 using Microsoft.Xna.Framework.Input;
10 using Microsoft.Xna.Framework.Input.Touch;
11 using Microsoft.Xna.Framework.Media;
12 namespace ScrollBackground
13 {
14 public class MyGame : Microsoft.Xna.Framework.Game
15 {
16 GraphicsDeviceManager graphics;
17 SpriteBatch spriteBatch;
18 private Texture2D background1; // 第一个背景
19 private Texture2D background2; // 第二个背景
20 private Vector2 bg1Position1; // 第一个背景位置
21 private Vector2 bg2Position2; // 第二个背景位置
22 private float speed; // 滚动速度
23 private Texture2D bird; // 小鸟
24 private Vector2 birdPosition; // 小鸟所在位置
25 public MyGame()
26 {
27 graphics = new GraphicsDeviceManager( this );
28 Content.RootDirectory = " Content " ;
29 graphics.PreferredBackBufferWidth = 800 ; // 游戏视窗的高度和宽度决定了游戏在模拟器中是横向显示还是纵向显示
30 graphics.PreferredBackBufferHeight = 480 ;
31 TargetElapsedTime = TimeSpan.FromTicks( 333333 );
32 }
33 protected override void Initialize()
34 {
35 bg1Position1 = new Vector2( 0 , 0 );
36 bg2Position2 = new Vector2(graphics.PreferredBackBufferWidth, 0 );
37 speed = 2 ;
38 birdPosition = new Vector2( 200 , 50 );
39 base .Initialize();
40 }
41 protected override void LoadContent()
42 {
43 spriteBatch = new SpriteBatch(GraphicsDevice);
44 background1 = Content.Load < Texture2D > ( " bg1 " );
45 background2 = Content.Load < Texture2D > ( " bg2 " );
46 bird = Content.Load < Texture2D > ( " bird " );
47 }
48 protected override void UnloadContent()
49 {
50 }
51 protected override void Update(GameTime gameTime)
52 {
53 if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
54 this .Exit();
55 if (bg1Position1.X < - background1.Width)
56 {
57 bg1Position1.X = bg2Position2.X + graphics.PreferredBackBufferWidth;
58 }
59 if (bg2Position2.X < - background2.Width)
60 {
61 bg2Position2.X = bg1Position1.X + graphics.PreferredBackBufferWidth;
62 }
63 bg1Position1.X -= speed;
64 bg2Position2.X -= speed;
65 base .Update(gameTime);
66 }
67 protected override void Draw(GameTime gameTime)
68 {
69 GraphicsDevice.Clear(Color.CornflowerBlue);
70 spriteBatch.Begin();
71 spriteBatch.Draw(background1, bg1Position1, Color.White);
72 spriteBatch.Draw(background2, bg2Position2, Color.White);
73 spriteBatch.Draw(bird, birdPosition, Color.White);
74 spriteBatch.End();
75 base .Draw(gameTime);
76 }
77 }
78 }
复制代码

其运行后的效果如下:

游戏截图

游戏运行动画

OK,代码比较简单,我也就不再过多解释,附上源程序:

download

目录
相关文章
|
11月前
|
机器学习/深度学习 算法 图形学
Unity小游戏——无限滚动的背景的改良
Unity小游戏——无限滚动的背景的改良
101 0
|
图形学
【游戏开发】unity透明特效的制作方法
Unity是一种强大的游戏开发引擎,它支持许多不同的特效和图形效果。其中一种常用的特效是透明特效,它可以使游戏中的材质变得半透明或完全透明。在本文中,我们将介绍如何使用Unity创建透明特效。
|
人工智能 搜索推荐 C#
Photoshop和WPF双剑配合,打造炫酷个性的进度条控件
结合Photoshop和WPF,共同创建一个矢量的个性化进度条。
550 0
Photoshop和WPF双剑配合,打造炫酷个性的进度条控件
|
C# Windows
UI前沿技术:XNA颜色滚动程序
导读:在2011年1月的MSDN杂志中,MSDN长期特约编辑Charles Petzold发表了一篇有关“XNA颜色滚动程序”的文章 全文如下 我最早编写并发布的 Windows 程序之一名为 COLORSCR(“颜色滚动程序”),发表在本杂志的前身 Microsoft Systems Journal 的 1987 年 5 月号中。
1228 0
一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(五)圣赞之HLSL渲染动画
  或许大家依旧对上一节中的“黑夜”及“梦回过去”记忆犹新,追问下去HLSL到底是何方神圣能实现如此炫酷之效果?HLSL(高级着色器语言)作为微软的独门兵器,仅供Direct3D使用。Silverlight无比幸运,从第二个版本开始便已获得了这把旷世利器,虽然目前仅能发挥其不到3层之功力,不过前辈Moonlight近期已向世界宣布全面突破技术壁垒,HLSL的威力提升至7层左右。
1154 0
Silverlight 2.5D RPG游戏技巧与特效处理:(五“.NET研究”)圣赞之HLSL渲染动画
  或许大家依旧对上一节中的“黑夜”及“梦回过去”记忆犹新,追问下去HLSL到底是何方神圣能实现如此炫酷之效果?HLSL(高级着色器语言)上海企业网站设计与制作an>作为微软的独门兵器,仅供Direct3D使用。
1384 0
|
Windows UED API
[UWP]如何实现UWP平台最佳图片裁剪控件
原文:[UWP]如何实现UWP平台最佳图片裁剪控件 前几天我写了一个UWP图片裁剪控件ImageCropper(开源地址),自认为算是现阶段UWP社区里最好用的图片裁剪控件了,今天就来分享下我编码的过程。
1159 0
|
C#
借助Photoshop,Illustrator等设计软件进行WPF图形图像的绘制
原文:借助Photoshop,Illustrator等设计软件进行WPF图形图像的绘制 本文所示例子是借助第三方设计软件,制作复杂的矢量图形,转成与XAML酷似的SVG,再转换成xaml而实现的。
1245 0
|
前端开发 C#
silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发) 这篇介绍的是3D导航,点击图标,页面360°翻转的效果!有什么不足的欢迎大家指出来。 1.新建一个usercontrol,命名为menu. 2.按照下图设置一下属性。
1243 0
|
C# 前端开发
silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发) 前面我们画了一只会飞动的小鸟,今天我们在目标是一个会发光的太阳。本章节的动画虽然简单,但是实现的效果可是一点也不打折。
1183 0