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

目录
相关文章
|
7月前
|
机器学习/深度学习 算法 图形学
Unity小游戏——无限滚动的背景的改良
Unity小游戏——无限滚动的背景的改良
|
图形学
【游戏开发】unity透明特效的制作方法
Unity是一种强大的游戏开发引擎,它支持许多不同的特效和图形效果。其中一种常用的特效是透明特效,它可以使游戏中的材质变得半透明或完全透明。在本文中,我们将介绍如何使用Unity创建透明特效。
581 0
|
vr&ar 图形学 Windows
【Unity3D 灵巧小知识点】☀️ | Unity 中 怎样切换 天空盒 背景
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【Unity3D 灵巧小知识点】☀️ | Unity 中 怎样切换 天空盒 背景
|
C# Windows
UI前沿技术:XNA颜色滚动程序
导读:在2011年1月的MSDN杂志中,MSDN长期特约编辑Charles Petzold发表了一篇有关“XNA颜色滚动程序”的文章 全文如下 我最早编写并发布的 Windows 程序之一名为 COLORSCR(“颜色滚动程序”),发表在本杂志的前身 Microsoft Systems Journal 的 1987 年 5 月号中。
1145 0
|
前端开发 C#
silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发) 这篇介绍的是3D导航,点击图标,页面360°翻转的效果!有什么不足的欢迎大家指出来。 1.新建一个usercontrol,命名为menu. 2.按照下图设置一下属性。
1225 0
|
C# 前端开发
silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发) 前面我们画了一只会飞动的小鸟,今天我们在目标是一个会发光的太阳。本章节的动画虽然简单,但是实现的效果可是一点也不打折。
1162 0
|
C#
silverlight,WPF动画终极攻略之迟来的第三章 动画整合篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之迟来的第三章 动画整合篇(Blend 4开发) 有个问题想请教下大家,我仿了腾讯的SL版QQ,相似度95%以上。我想写成教程教大家怎么开发出来,会不会有版权什么问题的。
1079 0
|
C#
WPF 分享一种背景动画效果
原文:WPF 分享一种背景动画效果  今天看微软的一个Samples,发现一个蛮好玩的背景样式,如下图所示: 风格比较卡哇伊。 ...
1366 0
|
Android开发 数据格式 XML
Android项目实战(三十六):给背景加上阴影效果
原文:Android项目实战(三十六):给背景加上阴影效果   圆角背景大家应该经常用: 一个drawable资源文件  里面控制corner圆角 和solid填充色     那么在此基础上 , 实现带阴影效果的圆角背景    代码如下  效果: 可以看到 右侧和下侧都有一个小范围的灰色阴影效果。
1692 0