XNA入门教程----(二) 移动控制

推荐一款基于XNA的开源游戏引擎《Engine Nine》 一、前沿导读 XNA是微软基于.Net部署的下一代3D/2D游戏开发框架,其实XNA严格来说类似下一代的DirectX,当然不是说XNA会取代DirectX,但是基于XNA我们对于面向XBOX360,WP等系列其他平台的移植成本非常的低(据说基于MONO在linux下XNA也可以运行3D DEMO,有试过的请点意见)。 但是基于XNA的复杂程度我们自然也是可想而知的,所以在这里推荐第一款基于X 阅读详情
 

上一章,我们主要介绍了

何谓XNA

并且做了第一个XNA HelloWorld

本文,将紧接着上文. 继续我们的XNA之旅.

 

上篇的最后,我们通过

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> MouseState ms = Mouse.GetState(); // 获得鼠标相关信息 

 

获得了鼠标的Point位置,让自己的图像显示在鼠标的位置,因此做到了自定义光标的功能.

现在,我们对XNA的控制器作全面阐述

 

XNA的控制器

在XNA的控制器,主要定义在 Microsoft.Xna.Framework.Input下,

分为以下几种

 

  1.  Mouse 鼠标
  2. Keyboard 键盘
  3. GamePad 手柄

 

 在默认模板建立的HelloWorld中,我们会发现

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->   if  (GamePad.GetState(PlayerIndex.One).Buttons.Back  ==  ButtonState.Pressed)
                
this .Exit();

 

 这其实就是判断如果按下了游戏手柄的Back按钮时,自动退出。

  同样,我们可以通过以上Input的相关state来获得相关输入端的操作,如按钮,位置等等。


 一个简单的例子

 

现在,我们尝试在界面中绘制一个简单的 sprite(精灵),并实现鼠标和键盘的同时控制

 

代码
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->   protected   override   void  Update(GameTime gameTime)
        {
            KeyboardState state 
=  Keyboard.GetState();
            
if  (state.IsKeyDown(Keys.Up))
            {
                
this .Position.Y  -=   10 ;
            }
            
if  (state.IsKeyDown(Keys.Down))
            {
                
this .Position.Y  += 10 ;

            }
            
if  (state.IsKeyDown(Keys.Left))
            {
                
this .Position.X  -=   10 ;

            }
            
if  (state.IsKeyDown(Keys.Right))
            {
                
this .Position.X  +=   10 ;

            }
            
base .Update(gameTime);
        }

 

 

通过以上代码,我们实现了对键盘的简单监听。 

这样,当我们按下键盘上下左右后,我们的sprite就随之移动了。

代码
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->    protected   override   void  Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            spriteBatch.Begin();
            spriteBatch.Draw(img,  new  Rectangle(( int )Position.X,( int ) Position.Y,  50 ,  80 ), Color.White);
            spriteBatch.End();
            
base .Draw(gameTime);
        }

 

如何操作鼠标呢?

 根据上面相似的逻辑,我们当然能得到鼠标的当前位置,但是,如果这样做,我们的sprite会直接从原先点瞬间移动到目标点,而没有中间的过渡过程。

 在正常的游戏中,以上逻辑往往比较复杂,中间充满着障碍物,怪物等。因此不可简单的通过point操作。

为了未来的可扩展性,这里我们最终使用a-star算法来处理这个问题。

至于何谓a-star,请关注这里 

这里,我们使用了Franco, Gustavo 写的a-star类库,来算出最短路径。

当然,我们这里的构建的障碍的空的。未来在真实的地图中,我们需要构建出相关的障碍。

首先,我们构建一个空的无障碍的点集用作描绘障碍

代码
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->   private   byte [,] m_matrix;
  m_matrix 
=   new   byte [ 1024 , 1024 ];
            
//  FIXME: in matrix ,the obstacle is 0 else is 1
             for  ( int  y  =   0 ; y  <  m_matrix.GetUpperBound( 1 ); y ++ )
            {
                
for  ( int  x  =   0 ; x  <  m_matrix.GetUpperBound( 0 ); x ++ )
                {
                    m_matrix[x, y] 
=   1 ;
                }
            }

 

 这里,如果有障碍则为0否则为1

代码
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> // 在update中加入鼠标位置的最短路径计算
  MouseState state1  =  Mouse.GetState();
            
if  (state1.LeftButton  ==  ButtonState.Pressed)
            {
                IPathFinder pathFinder 
=   new  PathFinderFast(m_matrix);
                pathFinder.Formula 
=  HeuristicFormula.Manhattan;
                pathFinder.SearchLimit 
=   2000 ;
                m_path 
=  pathFinder.FindPath( new  Vector2(( int ) this .Position.X, ( int ) this .Position.Y),  new  Vector2(state1.X , state1.Y ));
            }
            
if  ( this .m_path  !=   null   &&   this .m_path.Count()  !=   0 )
            {
                
int  index  =   this .m_path.Count()  -   1 ;
                
this .Position  =   new  Vector2( this .m_path[index].X,  this .m_path[index].Y);
                
this .m_path.RemoveAt(index);
                
return ;
            }

 

以上代码,我们先获得了当前鼠标的位置,并计算出当前点到目标点的最短路径。

之后将其存储,这样,如果没有动作我们每次循环便可自动继续进行相关的自动移动了。

 

通过以上代码,我们实现了用鼠标或键盘的简单控制。

 

但是 

或许大家发现了,这里的sprite是单帧的移动并非动画,如何让人物运动起来?请关注下回分解。

 源文件下载

 To Be Continue.... 

 转自http://www.cnblogs.com/edwin1986/archive/2010/01/19/XNA_2_controller.html

太空船模拟项目:XNA游戏开发实战 性能分析是优化应用程序性能的关键步骤。Visual Studio 2010内置性能分析工具,能够帮助开发者识别性能瓶颈。性能分析器: 可以用来检测CPU使用率、内存分配和性能问题。报告: 生成的性能报告详细记录了执行时间和调用次数,帮助开发者理解程序的行为。性能分析器支持多种类型的数据收集和分析,例如使用“采样”方法,可以在程序运行期间定期捕获程序的运行情况,而“探查”方法可以详细记录函数调用的堆栈和调用次数。理解这些高级功能并正确地使用它们,将极大提升软件的质量和效率。 阅读详情

相关推荐

游戏开发:精灵移动与速度控制

本文深入探讨了游戏开发中精灵的移动与速度控制技术。通过设置精灵的速度属性和方法,我们能够实现精灵以特定速度沿着路径移动。文章详细介绍了速度的数学计算,展示了如何在屏幕上平滑移动精灵,以及如何使用正弦和余弦函数让精灵在圆形路径上移动。

weixin_35370061的博客 521

使用.NET和XNA Game Studio Express开发杀手级游戏

【原文地址】 Building killer Games using .NET and XNA Game Studio Express 【原文发表日期】 Tuesday, December 19, 2006 12:36 AM 万一你错过了,微软上个星期发布了 XNA Game Studio Express 1.0 。XNA提供了一个基于.NET 的丰富的开发游戏的框架,支持使用C#和Visua

Scott Guthrie博客中文版 1万+

C#与XNA 4.0实现3D模型动画控制指南

在本章中,我们将探讨如何使用C#语言结合XNA 4.0框架来精确控制3D模型。我们会从基础的模型导入和渲染开始,逐步深入到如何对模型施加精确的控制。C#作为一种高级编程语言,拥有良好的结构和强大的功能,搭配XNA 4.0,开发者可以快速创建出丰富的3D游戏世界。XNA 4.0提供了许多便利的API,简化了3D图形的处理流程,允许开发者把更多精力投入到游戏逻辑和模型控制上。骨骼权重,或称为蒙皮权重(Skin Weights),是指在创建骨骼动画时,一个顶点相对于一个或多个骨骼的影响力的度量。

weixin_42509507的博客 772

使用.NET和XNA Game Studio Express开发杀手级游戏 Scott Guthrie博客中文版

http://blog.youkuaiyun.com/scottgu/archive/2006/12/25/1460296.aspx 

深海狂鲨 945

XNA 入门经典教程

XNA Game Studio Express 是专业跨平台整合型游戏开发套件「XNA Studio」的简化版

XNA中文教程《XNA入门指南》第一章

国内第一本XNA教程中文《XNA入门指南》,经《A Beginners Guild to XNA》原作者 Mike Fleischauer 书面授权中国XNA开发网翻译!书中如有错误请访问www.ChinaXNA.com 或者 www.XNADev.cn

XNA入门教程(一)

何谓XNA:XNA Framework 是建置于 .NET Framework 2.0上,另外还加入了一些专注于游戏开发上类别库,在指定的平台上使程式码重用达之最大效果。XNA Framework 在一个特别为有管理式游戏运行的通用语言执行层(Common Language Runtime)版本上运行。这个执行层支援Windows XP、Windows Vista和XBox 3...

banshu2416的博客 856

XNA中文手册 XNA中文手册

XNA中文手册XNA中文手册XNA中文手册XNA中文手册

XNA入门教程----(三) 简单的动画

继续我们的XNA之旅... 上周,我们简单的介绍了XNA的相关控制器,并且实现了鼠标和键盘对屏幕内的某个Sprite(精灵)进行简单的位置控制. 但是,美中不足的,我们并没有实现Sprite人物的移动动作,即Animation. 现在,我们继续上周所讲的, 实现简单的动画.   关于Animation   对动画有所了解的朋友对于逐帧动画一定不会陌生.其以最简单的形式,将各动画元件相邻

learneryql的专栏 789

python指纹识别算法(亲测代码可用)

python指纹识别算法

2301_76482796的博客 3079

RustFS vs MinIO:深入对比分布式存储的性能、功能与选型指南

RustFS与MinIO是两款热门分布式存储系统,分别针对高性能与通用场景设计。RustFS基于Rust语言,在吞吐量(最高提升46%)、延迟(降低37%)和资源效率(内存占用减少67%)上显著优于MinIO,适合AI训练、金融级应用等高性能需求。MinIO凭借成熟的S3兼容性、云原生集成和企业级功能,更适用于混合云及现有S3生态。许可方面,RustFS采用Apache 2.0,MinIO为AGPLv3。选型建议:优先RustFS应对性能敏感场景,选择MinIO注重生态兼容性,也可考虑混合架构策略。

分布式存储与RustFS的博客 2022

XNA超级玛丽

准备工作  在开始之前,你需要一些必备的开发工具:VS和XNA.以下是本文对应的开发环境VS2010Microsoft XNA Game Studio 4.0  VS相信大家都有,至于版本,以下是各个VS对应的XNA版本,如果你不是用的VS2010,那么你可以下载对应的XNA版本.  XNA Game Studio 2.0(VS2005)  XNA Game Studio 3.0(VS2008) 

LarrySai 1305

保姆级避坑指南:在Ubuntu 22.04上用ROS2 Humble搞定TurtleBot3的SLAM与导航(附5个常见报错解决方案)

本文提供了一份详细的Ubuntu 22.04上使用ROS2 Humble和TurtleBot3进行SLAM建图与导航的避坑指南,涵盖Gazebo启动失败、场景加载问题、环境变量设置、GLIBCXX版本冲突及Nav2参数配置等5个常见报错的解决方案,帮助开发者高效完成机器人导航项目。

weixin_29062823的博客 285

XNA游戏开发之2D游戏

摘要:以XNA为基础的游戏可以利用3D模型为游戏加入动画效果,也可以利用简单的程序技巧将2维图片显示成动画。虽然2维动画相对3维动画来说简单一些,但是制作出来的游戏其趣味性和挑战性也绝不逊色。今天我们就一块学习一下在使用XNA Framework开发2D游戏时的一些基础知识和注意事项。 主要内容: 1.2D游戏动画的基本原理 2.动画素材的准备 3.一个简单的2D动画 一、2D游戏动画的基本原理 在XNA中制作2D动画的过程很像翻卡通小人书,首先绘制好各种角色造型,然后以固定的时间间隔来显示不同

august5291的博客 3562

告别Godot默认编辑器:手把手教你用VSCode配置C#开发环境(附中文注释避坑指南)

本文详细介绍了如何将VSCode配置为Godot引擎的C#开发环境,提升游戏开发效率。从环境准备、扩展配置到解决中文编码问题,提供完整的避坑指南和高级调试技巧,帮助开发者充分利用VSCode的智能补全和调试功能,打造高效工作流。

weixin_30596023的博客 189

Livox激光雷达传感器在Python3中的完整驱动程序:深入剖析OpenPyLivox库的实现和应用

当我们提到激光雷达或激光扫描技术时,Livox激光雷达传感器无疑是业界的佼佼者。尽管Livox提供了基于C++的官方软件和API,但现在,有了OpenPyLivox (OPL) 库,Python开发者们也能够轻松地接入和控制这些高级的激光雷达设备。

qq_38334677的博客 1002

XNA教程(三)—— sprite绘制效率

 作者:clayman仅供个人学习使用,请勿转载,勿用于任何商业用途。由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。欢迎大家和我多多交流。Blog:http://blog.youkuaiyun.com/soilworkclayman_joe@yahoo.com.cn  虽然内容有所变动,但我的xna教程还会继续^_^本文图片和部分文字来自XNA Diaries,参考了其中两篇关于sprite

Clayman的专栏 5697

PowerDesigner 数据库建模使用详解

PowerDesigner 数据库建模使用详解

congge 7081

从修改“Space War Starter Kit”例子学习XNA

最近要忙的事情特别多,有社区的事情,自己也忙的很,有一段时间没研究XNA了,不过XNA仍然是不错的引擎,所以我是不会放弃的,我们XNA爱好者群也有好多热心的群友一直分享着自己的成果,比如“佐罗大侠(QQ:230206268),经常推出自己的视频教程,真是要谢谢他。也希望其他群友加油,其实每个人都分享一点,那每个人都得到无数点。废话少说,下面是教程(完整WORD文档,请到QQ群:26888039下载

XNA游戏研发TEAM 5429

【Bluetooth蓝牙开发】一、开篇词 | 打造全网最详细的Bluetooth开发教程

1、开篇词 2、蓝牙开发入门 3、蓝牙协议栈总览 4、蓝牙协议栈——物理层 5、蓝牙协议栈——链路层 6、蓝牙协议栈——传输层 7、蓝牙协议栈——L2CAP协议 8、蓝牙协议栈——ATT协议 9、蓝牙协议栈——GATT协议 10、蓝牙通信流程分析 11、蓝牙协议栈——Bluez交叉编译 12、蓝牙调试工具汇总

Donge's Blog 1万+

量化交易 米筐 案例:市值因子选股策略

案例:市值因子的选股策略 1.结果 获得超额收益 年化 49% 2. 从股票中选择市值小的股票 选定财务数据筛选 进行每日调仓(多因子选股调仓 周期频率会小一些) 3. 代码 估值有关指标 # 在沪深300股票中,选出市值比较小的10只股票 # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context): # 沪深300组合 stocks = index_components('000300.XSHG') # 沪深3

廷益_飞鸟的博客 2313

Silverlight.XNA(C#)跨平台3D游戏研发手记:(十)3D 场景与控制设计①

模型和骨骼动画仅仅是开启3D游戏的敲门砖,置入基于摄像机的场景设计方能呈现最完美的3D游戏。本节,我们依旧从简单着手,一步步创建基于模型的3D游戏场景。《XNA4.0学习指南(中文)》是一本绝对值得一看的好书,对于3D游戏的基础知识、概念以及简单应用讲解非常全面。比如书中提到关于XNA内置了创建摄像机的方案代码,根据该提示我们便可轻松实现一个名为Camera3D的类:Camera3D摄像机是我们观

4688

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

自学XNA路(二)新手上路-移动背景图片

导入一个图片格式任意。 这里我导入了自己做的一个V.JPG 把文件拉到资源管理器的Content里面然后添加下面代码 Texture2D backgroundTexture; SpriteBatch sprites; protected override void Initialize() { b

heweigeng的专栏 338

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: XNA入门教程----(一)
下一篇: XNA入门教程----(三) 简单的动画
learneryql
博客等级 码龄16年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值