Tag: xna

C#脚本语言

这是一个有点奇怪的问题。 我想提供一种脚本语言来修改我为XNA构建的游戏。 如果我将这些游戏用于PC,那么我就可以使用C#文件,在运行时编译(使用reflection.emit )作为脚本,这很好 – 一个很简单的方法来修改游戏。 但是,.net紧凑框架(这是xbox提供的)不支持reflection.emit,那么如何编写一个考虑到这一点的脚本语言呢? 有没有任何项目已经这样做了 是否有任何好的资源来启动我自己的项目来执行此操作 什么是最好的语言选择? 这适用于游戏脚本,因此它可以是一种相当小的语言,只要它非常高效且易于实现解释器

为XNA游戏添加类似输入框的控件

我希望我的游戏具有正常的文本输入,但使用纯XNA似乎非常不愉快。 之前我发现这段代码让我在游戏周围使用MessageBox ,安全地暂停执行并显示一条消息: [DllImport(“user32.dll”, CharSet = CharSet.Auto)] public static extern uint MessageBox(IntPtr hWnd, String text, String caption, uint type); 是否有类似的东西可以为我的游戏添加InputBoxfunction,最好不要打断(暂停)游戏?

游戏架构

我对我正在制作的XNA游戏有疑问,但它也是未来游戏的一般性问题。 我正在制作Pong游戏而且我不确切知道要在哪里更新,所以我会更好地解释我的意思。 我有一个类Game,Paddle和Ball,例如,我想validation球与屏幕限制或桨之间的碰撞,但我遇到了两种方法来做到这一点: 更高级别的方法 – 将桨和球属性公开,并在Game.Update上检查碰撞? 低级方法 – 我提供我需要的每个信息(屏幕限制和拨片信息)到球类(通过参数,或在公共公共静态类)和Ball.Update我检查碰撞? 我想我的问题以更通用的方式是: 对象是否需要知道如何更新和绘制自己,甚至是从某种程度上提供给它们的更高级别的依赖项? 要么 最好在Game.Update或Game.Draw中使用更高级别处理它,还是使用Managers来简化代码? 我认为这是一个适用于每个游戏的游戏逻辑模型问题。 我不知道我的问题是否清楚,如果没有,请随意提问。

使用XmlSerializer序列化整数数组

我正在尝试通过XmlSerializer为我正在研究的XNA项目序列化一个多维的整数数组时遇到问题。 我可以毫不费力地序列化我的所有其他数据(布尔,字符串,甚至颜色等)。 我也看到很多人声称XmlSerializer本身也会处理(单维)整数数组。 是否有关于多维数组的限制,或者是否还有其他问题? 这是相关的代码: int[,,] scoredata = scores; // Populated with data elsewhere filename = Path.Combine(container.Path, “scoredata.sav”); stream = File.Open(filename, FileMode.Create); serializer = new XmlSerializer(typeof(int[,,])); serializer.Serialize(stream, scoredata); // This line throws the exception. stream.Close(); 我收到的exception是“System.Xml.dll中发生类型’System.InvalidOperationException’的未处理exception。生成XML文档时出错。” 我也尝试将这个数组用作结构中的成员变量(我存储了所有其他玩家数据),但是当我这样做的时候我得到同样的exception,这让我相信它不是简单的语法错误或类似的东西。 我是否需要重新构建我的代码以通过单维数组进行序列化,或者我有什么东西可以忽略? 提前致谢!

强制数组的垃圾收集,C#

我有一个问题,其中一对三维数组分配了大量的内存,程序有时需要用更大/更小的内容替换它们并抛出OutOfMemoryException。 示例:有5个分配的96MBarrays(200x200x200,每个条目中有12个字节的数据),程序需要用210x210x210(111MB)替换它们。 它以类似于这样的方式实现: array1 = new Vector3[210,210,210]; 其中array1-array5与先前使用的字段相同。 这应该将旧数组设置为垃圾收集的候选者,但看起来GC不能足够快地运行并在分配新数组之前分配旧数组 – 这会导致OOM – 而如果它们在新分配之前释放,则空间应该是足够。 我正在寻找的是一种做这样的事情的方法: GC.Collect(array1) // this would set the reference to null and free the memory array1 = new Vector3[210,210,210]; 我不确定完整的垃圾收集是否是一个好主意,因为该代码可能(在某些情况下)需要经常执行。 有没有正确的方法呢?

如何使用XNA调整窗口大小

我知道这个问题之前已被问过很多次了。 但是,经过一个多小时的谷歌搜索,我发现的所有解决方案基本上都是一样的。 每个人都说,为了在XNA中调整窗口大小,您只需在Game1类的Initiate()方法中添加以下代码行(或这些代码行的一些细微变化): //A lot of people say that the ApplyChanges() call is not necessary, //and equally as many say that it is. graphics.IsFullScreen = false; graphics.PreferredBackBufferWidth = 800; graphics.PreferredBackBufferHeight = 600; graphics.ApplyChanges(); 这对我不起作用。 代码编译并运行,但绝对没有任何变化。 我一直在搜索GraphicsDevice和GraphicsDeviceManager类的文档,但我一直无法找到任何信息表明我需要做除上述之外的任何事情。 我也很相信我的显卡已经足够了(ATI HD 5870),虽然看起来XNA显卡兼容性上的wiki条目还没有更新一段时间。 我在Windows 7上运行,使用上面的显卡,Visual C#2010 Express和最新版本的XNA。 所以我只是希望有人可以帮我找到搞砸的地方。 我将在下面发布我的整个Game1类(我将其重命名为MainApp)。 如果有人想看到任何其他被调用的类,请问我会发布它们。 public class MainApp : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch […]

资产未找到XNA

我是XNA的新手,我开始遵循在屏幕上绘制图像的教程。 我能够将我的图像移动到Content文件夹中,但是当我尝试在我的代码中使用它时,无法找到它。 我正在使用资产名称而我无法找到我做错的事情。 教程使用XNA 3.0,我使用的是Visual Studio 2010,不确定是否重要。 这是我的代码 public class Game1 : Microsoft.Xna.Framework.Game { Vector2 mPosition = new Vector2(0, 0); Texture2D mSpriteTexture; GraphicsDeviceManager graphics; SpriteBatch spriteBatch; public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = “Content”; } protected override void Initialize() { base.Initialize(); } protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); mSpriteTexture = […]

将Kinect ColorImageFrame转换为Bitmap

我在XNA上使用Kinect(Microsoft SDK)。 我想使用GRATF进行标记识别 如何将Kinect AForge.Imaging.UnmanagedImage的数据转换为可以使用GRATF处理它们的System.Drawing.Bitmap或AForge.Imaging.UnmanagedImage? void kinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e) { Bitmap bitmap = null; ColorImageFrame frame = e.OpenColorImageFrame(); byte[] buffer = new byte[frame.PixelDataLength]; frame.CopyPixelData(buffer); // how to convert the data in buffer to a bitmap? var glyphs = recognizer.FindGlyphs(bitmap); … }