当前位置: 首页 > news >正文

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

相关文章:

  • Java程序中添加播放MIDI音乐功能
  • string与char*的转换(转载)
  • OSSIM远程连接与文件传输图示
  • android studio修改项目包名
  • 每天一个linux命令(18):locate 命令
  • android微信支付
  • 13 款惊艳的 Node.js 框架——第1部分
  • shell学习笔记2---awk字符串处理(原创)
  • 各主流浏览器的区别
  • java获取真实ip地址
  • 简单查询(1)
  • 详解Zoosk千万用户实时通信背后的开源技术[转]
  • 【转】jvm 内存模型及内存调优
  • UESTC 75 The Queen's New Necklaces
  • 冯·若依曼体系结构
  • 收藏网友的 源程序下载网
  • css选择器
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • es6--symbol
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • java多线程
  • Laravel Mix运行时关于es2015报错解决方案
  • PAT A1050
  • TypeScript实现数据结构(一)栈,队列,链表
  • VUE es6技巧写法(持续更新中~~~)
  • 阿里云Kubernetes容器服务上体验Knative
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 复杂数据处理
  • 给第三方使用接口的 URL 签名实现
  • 回顾2016
  • 如何在 Tornado 中实现 Middleware
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 阿里云服务器如何修改远程端口?
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (11)MSP430F5529 定时器B
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (LeetCode C++)盛最多水的容器
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (一)u-boot-nand.bin的下载
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)http协议
  • (转)项目管理杂谈-我所期望的新人
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .Net core 6.0 升8.0
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET4.0并行计算技术基础(1)
  • .net下简单快捷的数值高低位切换
  • .NET中使用Redis (二)
  • :O)修改linux硬件时间