声明:如下文章创作版权归 上海八中物理组 所有,此处仅为收藏及共享之用,转载请按如下方式显示标明原文出处,以示尊重!!

原文出处:http://shiba.hpe.sh.cn/jiaoyanzu/wuli/showArticle.aspx?articleId=320&classId=4

本章我们将开始制作编辑器。首先在解决方案中添加一个新项目。不过,这次我们添加的是“Windows Forms”项目。这会自动创建使用Windows窗体时必要的引用。这些窗体几乎是所有的Windows应用程序的基础。他们拥有一些窗口大小,标题,工具栏按钮等属性,一个窗体是诸如按钮,滑动条,文本框等对象的容器,这些对象被称为“控件”,而自定义控件可以从“Control”继承。

现在创建了你的项目,进入解决方案资源管理器然后单击Form1,你应该会在设计窗口看到这个窗体,并可以编辑您的窗体和控件。窗体中的控件不会回应点击,输入等,但你可以通过点击并打开属性窗口建立自己的处理程序。控件能够提供的事件也可以通过点击属性列表上方工具栏中的“闪电”使用。要处理事件句柄,只需双击事件名称这样就会切换到代码窗口,在那你可以编写窗体或控件的代码,这一步也可以通过右击“查看代码”实现。而代码视图中也有“设计视图”选项。关于属性编辑器的一个重要的提示:在设计视图窗口中设置的属性和添加的控件会自动生成代码。如果您按一下解决方案资源管理器中该文件旁边的[ + ],你会发现实际上有两个文件:一个是你可以编辑的代码文件:“ClassName.cs”,另一个是自动生成的,该文件的名称是“ClassName.Designer.cs”。

看一下第一个文件,您会看到控件是一个“partial”类,这仅意味着这个类是分开放在多个文件中的。如果看一下自动生成的代码,你会看到大多数设置属性的和创建实例的工作是在“InitializeComponent()”方法中。看一下自己输入的代码,当你创建一个窗体时(在项目创建时发生)一部分代码已近自动生成了,默认Form1类的构造函数调用了InitializeComponent()方法。你通常应该让这个方法第一个被调用,否则窗体控件可能不会正确地被创建。您不应该改变自动生成的代码,它会在属性改变或添加控件时自动重建。如果你编辑这个文件往往会将设计窗体弄得一团糟,因为建立设计窗体依赖于这个文件。总之,只编辑你的自己编写的文件。

设计器的最后部分是工具箱。如果您看不到它,可从“查看”菜单打开。如果您打开这个窗口会看到一个Microsoft所提供的所有标准控件的列表。您可以通过右击并选择“选择项...”添加更多的控件,只要将其拖放到正在编辑的窗体或控件上,程序就会自动添加并生成代码。添加控件也可以在手写文件中进行,与我们以前在类中声明的方式相同。要改变名称只需改变“Name”属性。现在您应该知道如何使用设计器了。接下来的第一件事是让窗体变得大一些。移动光标到窗口的右下方并调整到一个合理的尺寸,至少1024×768。你可以在属性窗口看到现在的尺寸。通过更改“Text”属性将默认的“Form1”改成其他名称。这将是游戏编辑器的主窗口,我命名为“Innovation Engine Editor”。

现在,我们的窗体已经建立了,我们需要将XNA渲染到我们的窗体。首先添加以下引用(References>Add Reference):Microsoft.Xna.Framework, Microsoft.Xna.Framework.Game,并找到:InnovationEngine.dll。现在我们可以渲染控件了。但XNA仁慈地将这种做法变得相当困难(说笑而已),所以我们必须先做一些事情。

我们需要建立绘制XNA所需的图形设备及相关服务,因为这里我们不能使用Game类。幸运的是,在Xna Creators Club有一个示例展示了如何做。下面大部分代码将借鉴这个范例,但我们必须使我们的控件能够绘制表面,并处理GameTime和GraphicsDevice。下面是微软编写的文件,将其添加到项目中。

GraphicsDeviceControl&GraphicsDeviceService.rar

现在我们将创建一个新的控件:添加>“新建项目”>用户控件,命名为RenderControl。代码如下所示:

using System.Diagnostics; using System.Windows.Forms; using Innovation; using Microsoft.Xna.Framework; namespace InnovationEditor { public partial class RenderControl : GraphicsDeviceControl { // Simulate the GameTime ourselves because we don't have Game GameTime gameTime; // Elapsed and total time for the GameTime Stopwatch elapsedTime = new Stopwatch(); Stopwatch totalTime = new Stopwatch(); // Timer to keep track of refreshes Timer timer; // Camera, Keyboard, and Mouse will be handled here. They are // public and static so they can be used anywhere public static FPSCamera Camera; public static KeyboardDevice Keyboard; public static MouseDevice Mouse; public RenderControl() { // Run pre-generated control code InitializeComponent(); // Start the timer keeping track of total elapsed time totalTime.Start(); // Hook the mouse down event for the mousedevice, so the control // will be selected when clicked on. This avoids problems with // mouse and keyboard camera commands affecting other controls on // the form this.MouseDown += new MouseEventHandler(RenderControl_MouseDown); } // Select control on mouse down void RenderControl_MouseDown(object sender, MouseEventArgs e) { this.Select(); } // Initialize the Control protected override void Initialize() { // Set up the engine Engine.SetupEngine(this.GraphicsServices); // Set up the frame update timer timer = new Timer(); // Lock framerate to 40 so we can keep performance up timer.Interval = (int)((1f / 40f) * 1000); // Hook timer's tick so we can refresh the view on cue timer.Tick += new System.EventHandler(timer_Tick); timer.Start(); // Setup the camera and move it to a good position, and make it a service Camera = new FPSCamera(); Camera.RotateTranslate(new Vector3(0, 0, 0), new Vector3(128, 15, 300)); Engine.Services.AddService(typeof(Camera), Camera); // Setup the keyboard and mouse, and allow the cursor to move Keyboard = new KeyboardDevice(); Mouse = new MouseDevice(); Mouse.ResetMouseAfterUpdate = false; } // Timer's tick causes the view to refresh void timer_Tick(object sender, System.EventArgs e) { // Invalidate everything so the whole control refreshes this.Invalidate(); // Force the view update this.Update(); } // Draw the scene protected override void Draw() { // Update GameTime and update the engine UpdateGameTime(); Engine.Update(gameTime); // Update GameTime again and draw the scene UpdateGameTime(); Engine.Draw(gameTime, ComponentType.All); } // Updates the GameTime object instead of relying on Game void UpdateGameTime() { // Recreate the GameTime with the current values gameTime = new GameTime(totalTime.Elapsed, totalTime.Elapsed, elapsedTime.Elapsed, elapsedTime.Elapsed); // Restart the elapsed timer that keeps track of time between frames elapsedTime.Reset(); elapsedTime.Start(); } } }

现在,只需回到主窗体,并从工具箱中拖动一个新的RenderControl到panel中。如果看不到RenderControl控件,您可能需要再次编译该项目。现在运行项目,您会看到熟悉的XNA游戏初始状态,一个空白的蓝色屏幕。没有其他东西,但至少工作正常!

如果您想测试,可以在构造函数中创建一些组件,您可以看到游戏引擎像一个普通游戏一样正常运行。

====================================

以下资源来自Xna Creators Club:

WinFormsGraphicsSample_4_0.zip

WinFormsGraphicsSample_ARCHIVE_3_1.zip

Size: 0.04MB
====================================

Xna游戏编辑器开发(WinForm内嵌Xna)相关推荐

  1. PC游戏中用CEF3制作内嵌浏览器

    因为项目需要,需要将游戏手机助手中的朋友圈给移植到PC游戏中,而以前游戏中的内嵌浏览器采用的是IE6内核,满足不了我们的需求,于是决定把Cef3内嵌到游戏中,在完成正常工作之余,利用闲散时间不断地查找 ...

  2. iphone开发UITable内嵌不同风格Table

    在iphone开发中使用Table的时候,由于Table有的风格UITableViewStylePlain或者UITableViewStyleGrouped一旦指定,便无法修改.但是在使用的过程中,总 ...

  3. winform内嵌浏览器的2种实现方式

    可使用WebBrowser或axWebBrowser实现winform窗体内嵌浏览器 一 使用axWebBrowser打开浏览器 1.新建个winform项目 2.添加axWebBrowser控件 打 ...

  4. XNA游戏开发之滚动背景

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

  5. 《XNA游戏开发》简介

    一.XNA简介 XNA是基于DirectX的游戏开发环境. 以C# 为开发语言 以 .NET Framework 为基础.并加入游戏应用所需之函式库所构成的 XNA Framework 可开发XNA ...

  6. XNA游戏开发之字符篇

    摘要: 游戏中开发不同于一般应用程序的开发,它更注重于界面美观,我们需要在游戏界面设计中花费大量的时间以便使它看起来更炫.更酷,当然这其中就少不了游戏中的字符文本,那么如何制作出漂亮的游戏文本呢?今天 ...

  7. XNA游戏开发之(六)——保存游戏数据

    [原创]Alex 游戏过程中,通常需要存储游戏状态.在下次启动游戏时,重新载入游戏,继续游戏. 实现过程非常简单,首先建立一个结构体定义需要保存的游戏参数,然后通过XmlSerializer类将其保存 ...

  8. XNA 游戏 运行时编辑器

    最近在写游戏时发现随着代码量和资源数量的加大,编译速度越来越来慢...而且游戏编程中需要 多次调整的数据有比较多(比如各种移动速度,攻击硬直之类,不可能一次指定正确..),而每次改一个 数据就要重新编 ...

  9. xnawindowsphCocos2d-x for XNA游戏引擎全面支持WP7

    近日,开源社区cocos2d-x.org针对微软移动操作系统WindowsPhone7平台发布了一款新的游戏引擎,并正式命名为cocos2d-xforXNA.从此,开发者无需学习XNA绘图接口就可采用 ...

最新文章

  1. Lumion模型库 Unique Pro Lumion Library 2021
  2. 大型局域网二层三层结构比较
  3. 为什么说中国式报表特殊-5.4 填报
  4. infor wms 中英文对照_【融合·君豪】新君豪中英文学校第十周食谱
  5. 1.1.3 以Self Host方式寄宿Web API
  6. scrapyd远程连接配置
  7. 昂贵的聘礼 - poj 1062 (Dijkstra+枚举)
  8. kubenerte启动_老司机和你深聊Kubenertes 资源分配之 Request 和 Limit 解析
  9. Geoserver 发布 shp文件
  10. Pascal VOC 2007和2012数据集下载地址(不需国外,速度依旧让你感动)
  11. 计算机导论第二版清华大学答案,计算机导论(第2版)课后习题答案【清华大学出版社】(13页)-原创力文档...
  12. 2021年9月电子学会图形化四级编程题解析含答案:成语接龙
  13. UC,浏览器,不愧是全球使用量最大的第三方手机浏览器!
  14. matlab中rand函数
  15. optionnally mysql_关于Tomcat与MySQL连接池问题的解析!
  16. mysql根据经纬度查询附件门店
  17. mysql 体重 类型 身高_用身高和体重数据进行分类实验
  18. 小小靖Java成长日记02
  19. 第二十二章 : 格式化输出
  20. 名编辑电子杂志大师教程 | 怎样给电子画册设置目录?

热门文章

  1. <select> 表单元素
  2. OpenGL 坐标变换(1)
  3. css的white-space属性导致了空格问题——查看十六进制发现2020变成了c2a0
  4. 【李宏毅2020 ML/DL】P77 Generative Adversarial Network | Theory behind GAN
  5. 【汇编语言与计算机系统结构笔记17】MIPS 汇编初步
  6. java常见面试题及答案 1-10(基础篇)
  7. 苹果8p吃鸡服务器没有响应,今天绝地求生更新之后进不去了,一进开始界面就游戏未响应:为什么绝地求生更新完进不去...
  8. sublime php快捷键,sublime快捷键
  9. EDA实验课课程笔记(五)——NC-verilog的介绍与使用(一)
  10. 十进制转5421BCD(测试文件及modelsim.do文件的模板)——补充篇