标签: xna

XNA - 键盘文本输入

好的,基本上我希望能够检索键盘文本.就像将文本输入文本字段或其他内容一样.我只是为Windows编写游戏.我忽略了使用Guide.BeginShowKeyboardInput,因为它打破了自包含游戏的感觉,而且指南总是显示XBOX按钮的事实对我来说也不合适.是的,这是最简单的方法,但我不喜欢它.

接下来我尝试使用System.Windows.Forms.NativeWindow.我创建了一个继承自它的类,并将其传递给了Games窗口句柄,实现了WndProc函数来捕获WM_CHAR(或WM_KEYDOWN),尽管WndProc被调用了其他消息,WM_CHAR和WM_KEYDOWN从未这样做过.所以我不得不放弃这个想法,此外,我还引用了整个Windows窗体,这意味着不必要的内存占用空间.

所以我的最后一个想法是创建一个Thread级别的低级键盘钩子.到目前为止,这是最成功的.我收到WM_KEYDOWN消息,(还没试过WM_CHAR)将虚拟键码与Win32函数MapVirtualKey一起转换为char.我收到了我的文字!(我现在只是用Debug.Write打印)

但是有几个问题.好像我有大写锁定,并且没有响应的移位键.(当然不是,它只是每个键只有一个虚拟键代码,所以只翻译它有一个输出)并且它增加了开销,因为它将自己附加到Windows Hook列表并且没有我那么快d喜欢它,但缓慢可能更多是由于Debug.Write.

有没有其他人接近这个并解决它,而不必求助于屏幕键盘?还是有人有进一步的想法让我尝试?

提前致谢.

吉米问的问题

也许我不理解这个问题,但为什么你不能使用XNA Keyboard和KeyboardState类?

我的评论:

这是因为虽然您可以读取键状态,但您无法访问键入的文本以及用户键入的方式.

所以让我进一步澄清一下.我想实现能够从用户读取文本输入,就好像他们在文本框中键入是Windows.键盘和KeyboardState类获取所有键的状态,但我必须将每个键和组合映射到它的字符表示.当用户不使用与我特别使用的符号相同的键盘语言时(我的双引号是shift + 2,而美国键盘在返回键附近的某处),这就会失败.


似乎我的窗口挂钩是要走的路,只是我没有得到WM_CHAR的原因是因为XNA消息泵不做翻译消息.

每当我收到WM _KEYDOWN消息时添加TranslateMessage 意味着我得到了WM_CHAR消息,然后我用它在我的MessageHuff类中触发了一个字符类型的事件,我的KeyboardBuffer类已订阅了该事件,然后将其缓冲到文本缓冲区:D(或StringBuilder,但结果是一样的)

所以我按照自己的意愿工作.

非常感谢Jimmy提供了一个非常丰富的线索链接.

.net c# xna

15
推荐指数
2
解决办法
2万
查看次数

为什么.NET中的矩阵乘法如此之慢?

我不太明白是什么使C#/ .NET(甚至Java)中的矩阵乘法变得如此之慢.

看一下这个基准测试(来源):试图找到更新的基准测试.

Java vs C#vs C++细分http://img411.imageshack.us/img411/9324/perf.gif

C#的整数和双重性能非常接近用MSVC++编译的C++.双精度为87%,32位整数为99%.非常好,我会说.但接下来看矩阵乘法.差距扩大到C#的速度约为19%.这是一个非常大的差异,我不明白.矩阵乘法只是一堆简单的数学运算.怎么这么慢?它不应该与等量的简单浮点或整数运算一样快吗?

这尤其是游戏和XNA的关注点,其中矩阵和矢量性能对物理引擎等事物至关重要.前一段时间,Mono通过一些漂亮的矢量和矩阵类增加了对SIMD指令的支持.它缩小了差距,使Mono比手写的C++更快,尽管没有C++与SIMD一样快.(来源)

矩阵乘法比较http://img237.imageshack.us/img237/2788/resultse.png

这里发生了什么?

编辑:仔细观察,我误读了第二张图.C#看起来非常接近.第一个基准测试只是做了可怕的错误吗?对不起,我错过了第一个基准测试的版本号.我抓住它作为我总是听到的"C#线性代数很慢"的方便参考.我会试着找另一个.

.net c# performance xna matrix-multiplication

15
推荐指数
3
解决办法
9172
查看次数

使用SpriteBatch在XNA中绘制矩形

我试图使用spritebatch在XNA中绘制一个矩形形状.我有以下代码:

        Texture2D rect = new Texture2D(graphics.GraphicsDevice, 80, 30);
        Vector2 coor = new Vector2(10, 20);
        spriteBatch.Draw(rect, coor, Color.Chocolate);
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,它没有任何吸引力.知道什么是错的吗?谢谢!

c# xna draw

15
推荐指数
3
解决办法
5万
查看次数

XNA游戏性能

我正在使用C#2010和XNA 4.0编写游戏.我希望它是一个好游戏,而不是一些"只是另一个废话",所以我的目标之一是良好的帧率.为此,我想问你一些建议,无论是XNA相关还是C#相关 - 我能做些什么来加速我的代码,从而提高FPS.

这是我发现的一些东西:

  • (c#)使用arrayinsted list<>会大大提高性能,以防你想要访问大量数据(甚至很多:拥有20000个项目的数组给出了近200%的FPS列表的180%.
  • (c#)使用for而不是foreach 将提高性能.在相同的20000元素上,它就像5-10%的差异.
  • (xna和c#)调用方法会降低性能,因此当我将代码分散到调用其他方法等的方法中时,一切都非常酷且面向对象,每次调用的成本为1-3 FPS.
  • (xna)更新与绘制:当我将代码放入update()和draw()时,性能没有差别,所以如果你不在乎,你不必在update()下放一些方法而不是保持一切都在draw()希望更好的FPS.
  • (xna)不知道它是我还是4.0,但当你加载一个带有大量纹理的.X和相当复杂的网格时,需要很多时间来加载.我不得不编写自己的.X加载器和网格/模型渲染器,因为XNA开始为每个三角形加载纹理,无论前一个三角形是否具有相同的纹理.即使编写我自己的缓存纹理的内容加载器也不是解决方案,因为它仍然被使用了很多次.如果你做了一些漂亮而蓬松的东西我建议使用drawuserprimitives而不是Model上课.(不知道是否只有4.0,或者3.1也有这样的性能问题)
  • (xna和c#)尽量避免在绘图时使用"new".我在网上看到了一些代码,什么是复制/粘贴在一起并且有"basicEffect = new BasicEffect(graphicsDevice);" draw()中的这种丑陋,更糟糕的是:在draw()中的迭代中.这会扼杀性能.而不是在"游戏"或静态类中有一个这样的类.这也适用于其他"临时对象":丑陋,但我认为最好创建一些全局的东西并注意使用它然后制作一个漂亮而蓬松的代码,因为垃圾收集器会使我们的游戏.

好吧,所以长话短说,请在这里发表一些好的建议,这样我/我们就可以做出好的,快速的,优化的游戏;)

提前致谢:Zéiksz

c# performance xna xna-4.0

15
推荐指数
3
解决办法
7979
查看次数

如何检查List是否包含某种类型的对象?C#

我有一个列表(称为Within),它包含类型的对象GameObject. GameObject是许多其他人的父类,包括DogBall.我想创建一个方法,如果Within包含任何类型的对象,则返回true Ball,但我不知道如何执行此操作.

我已经尝试使用Count<>,Any<>,Find<>和C#中提供了一些其他的方法,但我不能让他们的工作.

public bool DetectBall(List<GameObject> Within)
{
    //if Within contains any object of type ball:
    {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# xna

15
推荐指数
2
解决办法
1万
查看次数

编译XNA项目时,无法执行请求的操作错误

第二次编译项目时,我收到以下错误消息.我必须关闭VS 2010并在重新加载时进行编译.如果我做出改变,那么问题就会出现.

"无法复制文件"obj\x86\Debug\MyFile.dll".无法对打开用户映射部分的文件执行请求的操作."

c# msbuild xna compiler-errors visual-studio-2010

15
推荐指数
2
解决办法
6530
查看次数

XNA 2D游戏引擎

我刚刚回到游戏开发阶段,我对XNA印象非常深刻.我唯一的问题是我想要一个基于免费社区的2D游戏引擎,以便我可以利用社区的力量.有没有人知道目前正在支持的XNA 2d游戏引擎还是我必须自己编写一个?

xna 2d

14
推荐指数
2
解决办法
2万
查看次数

iPhone上的XNA

我不知道这是一个奇怪的问题,但我怎么能在iPhone/iTouch上运行用XNA制作的游戏?应该使用哪些步骤/工具(现有的或想象的......)?

注意:目标是避免修改现有的C#代码

更新:
如果我理解正确,我必须能够:
1)在Mono上运行我的XNA代码(monoxnaSilverSprite,承诺?)
2)在iPhone上运行Mono(MonoTouch)

.net c# iphone clr xna

14
推荐指数
4
解决办法
7203
查看次数

Windows游戏库和类库之间有什么区别?

Windows游戏库类库之间有什么区别?是否只是通过包含XNA框架开始?

此外,Windows/Xbox360/Zune游戏库之间的差异在哪里?他们似乎都从相同的参考文献(Microsoft.Xna.Framework,Microsoft.Xna.Framework.Game)开始.

c# xna

14
推荐指数
1
解决办法
1825
查看次数

多目标.NET库的最佳实践

我计划发布一个开源(MIT).NET库,但也包括DLL,以方便人们使他们不必自己编译所有内容.

我的库在它引用的类型中非常简单,唯一真正的依赖似乎是.NET 3.0或更高版本(因为它指的是Func<T>等等).

我希望我的库可以被多个目标使用,包括.NET 4.0服务器,.NET 3.5服务器,Windows Phone 7 Silverlight,普通Silverlight,XNA(电话),XNA(Windows)和XNA(XBox 360).

我确保不使用我所针对的平台上没有的任何类型,例如HashSet<T>在Windows Phone 7上不可用,所以我没有使用它.

我是否需要为这些目标制作不同的项目,因此需要多个DLL,或者是否有某种方法可以为它们生成一个共同的DLL?

.net silverlight xna windows-phone-7

14
推荐指数
1
解决办法
1133
查看次数