[翻译]XNA系列教程 2D 碰撞教程 1: 矩形检测

PS:转自__Vincent Zhang__的文章

2D 碰撞教程 1: 矩形检测
本文详细的介绍了在2D中实现运动和碰撞检测的方法。
绪论
一个有趣的游戏不一定要特别复杂,躲避障碍游戏就是其中一个,这个游戏包括了游戏角色和从空中落下的物体,而游戏角色必须要躲避开从空中落下的物体。
下图就是游戏角色成功躲避开落体的例子:
而下图则是玩家没有躲避开落体的情况:
当你完成此教程后,你将学会建立这样一个游戏所需要的全部技术。
第一步:建立新工程并加载资源文件
在开始编码之前你需要为你的游戏角色和落下的物体建立纹理贴图。这些纹理可以是任意大小,但应该使用洋红色(100% 红, 0% 绿, and 100% 蓝)等可以使之成为透明色的颜色。纹理贴图应当存储为.bmp或.png格式,而.gif 或.jpg格式会因为图像压缩而丢失颜色。
以下是本例子中所要用到的两个纹理贴图:
注意
洋红色是纹理处理器中所定义的默认关键色,在进行显示的时候洋红色会自动转换为透明色。

接下来,就需要你建立一个Window Game project并且添加纹理贴图。
建立一个新的文件
1.             打开 XNA Game Studio Express.
2.             单击 File, 之后单击New Project建立一个新工程.
3.             从模板列表中选择 Windows Game或Xbox 360 Game.
4.             在Name中键入游戏名, 在 Location 中键入工程所存放的地址.
5.             单击 OK.
你新建的工程中已经有自动生成的代码,这些代码是游戏开始和运行所必须的代码。而现在,你只需要加载资源文件,那么下面的步骤将帮助你。
将资源文件加载到工程当中
1.             首先,你要确定在项目界面的右侧可以看到 Solution Explorer。如果你无法看到的话,单击View按钮,选择 Solution Explorer的选项就可以了。打开之后你可以看到项目相关的树型结构。
2.             在Solution Explorer中, 右击 Project图标, 单击 Add, 之后单击New Folder. 将文件夹命名为Content. 这个文件将是你的美术资源文件的根目录.
3.             在Solution Explorer中单击Content文件夹 , 单击Add, 然后选择 Existing Item.在弹出的对话框当中选择你放置美术资源的路径,并且选择你所需要的两个纹理贴图即可。
你的工程结构图应该类似于下面这幅图片:
现在,我们开始编码了。
第二步:初始化和绘图
让我们来看看文件Game1.cs.第一件事情就是在代码当中添加绘图代码。也就是说你需要加载并存储游戏角色和下落物体的纹理贴图,在这里你需要首先声明 SpriteBatch。
1.         在 Solution Explorer中双击Game1.cs文件。
2.         在已经生成的代码中间添加一下代码。

1  //  The images to draw
2  Texture2D personTexture;
3  Texture2D blockTexture; 
4  //  The images will be drawn with this SpriteBatch
5  SpriteBatch spriteBatch; 
6  //  Person
7  Vector2 personPosition;
8  //  Blocks
9  List < Vector2 >  blockPositions  =   new  List < Vector2 > ();                    

3.  你必须正确的初始化这些变量. 纹理贴图应当在LoadGraphicsContent方法中加载,而剩余的初始化逻辑则应当在Initialize方法中.添加以下代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 protected override void Initialize()
 2 {            
 3    base.Initialize();             // Start the player in the center along the bottom of the screen            
 4 personPosition.X = (Window.ClientBounds.Width - personTexture.Width) / 2;            
 5 personPosition.Y = Window.ClientBounds.Height - personTexture.Height;
 6 
 7 protected override void LoadGraphicsContent(bool loadAllContent)
 8 {            
 9      if (loadAllContent)            
10     {                        // Load textures                        
11       blockTexture = content.Load<Texture2>"Content/Block");                   
12         personTexture = content.Load<Texture2D>("Content/Person");    // Create a sprite batch to draw those textures                        
13        spriteBatch = new SpriteBatch(graphics.GraphicsDevice);            
14      }
15 }                         
16 
17 

4.         现在,你已经拥有了纹理贴图和其他精灵数据,想要将他们绘制在屏幕上,就要在Draw方法中修改以下代码。

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 protected override void Draw(GameTime gameTime)
 2 {            
 3 graphics.GraphicsDevice.Clear(Color.CornflowerBlue);             
 4  spriteBatch.Begin();             
 5 // Draw person            
 6 spriteBatch.Draw(personTexture, personPosition, Color.White); // Draw blocks            
 7 foreach (Vector2 blockPosition in blockPositions)           
 8   spriteBatch.Draw(blockTexture, blockPosition, Color.White);             spriteBatch.End();             
 9  base.Draw(gameTime);
10 }

5.         现在,你就可以编译并运行你的工程了,按下F5键或者单击Start Debugging。你可以看到你的游戏角色了。

Step 3: 实现物体的运动

因为存储 blocks 的数组是空的,所以无法显示他们。你现在所要做的就是为下来的物体添加动画和逻辑,当然还要添加对游戏角色移动的功能。
1.         简单期间,下落的物体和游戏角色将以一个固定的速率运动,而下落物体的数量则是随机的,为了实现上述功能,你需要在 Game 类的开始添加一下声明。
1  //  Person
2  Vector2 personPosition;
3  const   int  PersonMoveSpeed  =   5 //  Blocks
4  List < Vector2 >  blockPositions  =   new  List < Vector2 > ();
5  float  BlockSpawnOdds  =   0.01f ; const   int  BlockFallSpeed  =   2
6  Random random  =   new  Random();                                               

2.         他们的值都是随意的,可以根据你的喜好来确定 .

3.         下面我们需要修改Update方法:

4.         在继续下面内容之前,你必须要仔细的阅读上面的代码,他们分别实现了以下功能:

a.             收集用户输入 .
b.             根据输入确定游戏角色的位置 .
c.              以一定的时间比率创建新的下落下落 .
d.             为创建的下落物体选择一个随机位置出现 .
e.             实现物体下落的动作 .
现在,你就可以编译并运行你的工程了,按下 F5 键或者单击 Start Debugging 。你可以看到下落的物体并且可以移动自己的游戏角色了。

Step 4: Boundary Collision第四步:边界碰撞检测

现在会发现你的人物可以轻易的移到屏幕以外,也许你没有发现下落的物体从来就没有被删除,而游戏长时间的运行会消耗掉系统的所有内存。
为了解决以上两个问题我们就来添加对游戏角色的运动约束以及删除下落物体。

2.         第一组黑体代码实现了对游戏角色添加边界,使之不能运行到屏幕之外,第二组黑体代码定义了下落物体的的下边界,当期超越边界的时候,则删除他们。

3.         这两组代码依照游戏规则实现了简单的碰撞检测以及响应机制。

4.         现在,你就可以编译并运行你的工程了,按下F5键或者单击Start Debugging。这时你的游戏角色将不能移除边界,内存泄漏的问题也已经解决。

第五步:矩形碰撞
到现在为止,我们完成了一个游戏的大部分工作。但是这个游戏的关键还没有实现,就是游戏角色如何被击中。作为一个教程,我们简单的用背景颜色的改变来表示是否击中。

 

转载于:https://www.cnblogs.com/315358525/archive/2009/07/13/IOR.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值