好的,基本上我希望能够检索键盘文本.就像将文本输入文本字段或其他内容一样.我只是为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提供了一个非常丰富的线索链接.
我不太明白是什么使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#线性代数很慢"的方便参考.我会试着找另一个.
我试图使用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#2010和XNA 4.0编写游戏.我希望它是一个好游戏,而不是一些"只是另一个废话",所以我的目标之一是良好的帧率.为此,我想问你一些建议,无论是XNA相关还是C#相关 - 我能做些什么来加速我的代码,从而提高FPS.
这是我发现的一些东西:
arrayinsted list<>会大大提高性能,以防你想要访问大量数据(甚至很多:拥有20000个项目的数组给出了近200%的FPS列表的180%.for而不是foreach 将提高性能.在相同的20000元素上,它就像5-10%的差异.drawuserprimitives而不是Model上课.(不知道是否只有4.0,或者3.1也有这样的性能问题)好吧,所以长话短说,请在这里发表一些好的建议,这样我/我们就可以做出好的,快速的,优化的游戏;)
提前致谢:Zéiksz
我有一个列表(称为Within),它包含类型的对象GameObject.
GameObject是许多其他人的父类,包括Dog和Ball.我想创建一个方法,如果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) 第二次编译项目时,我收到以下错误消息.我必须关闭VS 2010并在重新加载时进行编译.如果我做出改变,那么问题就会出现.
"无法复制文件"obj\x86\Debug\MyFile.dll".无法对打开用户映射部分的文件执行请求的操作."
我刚刚回到游戏开发阶段,我对XNA印象非常深刻.我唯一的问题是我想要一个基于免费社区的2D游戏引擎,以便我可以利用社区的力量.有没有人知道目前正在支持的XNA 2d游戏引擎还是我必须自己编写一个?
我不知道这是一个奇怪的问题,但我怎么能在iPhone/iTouch上运行用XNA制作的游戏?应该使用哪些步骤/工具(现有的或想象的......)?
注意:目标是避免修改现有的C#代码
更新:
如果我理解正确,我必须能够:
1)在Mono上运行我的XNA代码(monoxna或SilverSprite,承诺?)
2)在iPhone上运行Mono(MonoTouch)
Windows游戏库和类库之间有什么区别?是否只是通过包含XNA框架开始?
此外,Windows/Xbox360/Zune游戏库之间的差异在哪里?他们似乎都从相同的参考文献(Microsoft.Xna.Framework,Microsoft.Xna.Framework.Game)开始.
我计划发布一个开源(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?