是否有可能获得当前的桌面屏幕分辨率?
我的XNA游戏中有一些小的设置,其中一个是屏幕分辨率.如果它大于当前桌面分辨率支持,我想要做的是屏幕分辨率选项.
我正在研究一个简单的碰撞检测演示,它只包含一堆在窗口中弹跳的物体.(目标是在不丢帧的情况下查看游戏可以同时处理多少个对象.)
存在重力,因此物体要么移动要么与墙壁碰撞.
天真的解决方案是O(n ^ 2):
foreach Collidable c1:
foreach Collidable c2:
checkCollision(c1, c2);
Run Code Online (Sandbox Code Playgroud)
这很糟糕.所以我设置了CollisionCell对象,它维护有关屏幕一部分的信息.这个想法是每个Collidable只需要检查其单元格中的其他对象.使用60像素×60像素的电池,这几乎可以提高10倍,但我想进一步推进.
分析器已经发现,代码将50%的时间花在每个单元用于获取其内容的函数中.这里是:
// all the objects in this cell
public ICollection<GameObject> Containing
{
get
{
ICollection<GameObject> containing = new HashSet<GameObject>();
foreach (GameObject obj in engine.GameObjects) {
// 20% of processor time spent in this conditional
if (obj.Position.X >= bounds.X &&
obj.Position.X < bounds.X + bounds.Width &&
obj.Position.Y >= bounds.Y &&
obj.Position.Y < bounds.Y + bounds.Height) {
containing.Add(obj);
}
}
return containing;
}
} …Run Code Online (Sandbox Code Playgroud) 我对我正在制作的XNA游戏有疑问,但它也是未来游戏的一般问题.我正在制作Pong游戏而且我不确切知道要在哪里更新,所以我会更好地解释我的意思.我有一个类Game,Paddle和Ball,例如,我想验证球与屏幕限制或桨之间的碰撞,但我遇到了两种方法来做到这一点:
更高级别的方法 - 将桨和球属性公开,并在Game.Update上检查碰撞?
低级方法 - 我提供我需要的每个信息(屏幕限制和拨片信息)到球类(通过参数,或在公共公共静态类)和Ball.Update我检查碰撞?
我想我的问题以更通用的方式是:
对象是否需要知道如何更新和绘制自己,甚至是从某种程度上提供给它们的更高级别的依赖项?
要么
最好在Game.Update或Game.Draw中使用更高级别处理它,还是使用Managers来简化代码?
我认为这是一个适用于每个游戏的游戏逻辑模型问题.我不知道我的问题是否清楚,如果没有,请随意提问.
任何人都可以给我一些建议或意见
我需要找到一张照片中的物体从一个位置移动到另一个位置的多少(实际上我需要计算相机在两个图像之间移动了多少但是因为物体将保持静止并且只是在其Y轴上旋转我认为移动图像会更容易).与此示例几乎相同,但并不那么复杂.

因此,我拍摄了rubiks立方体的第一张照片,并根据此处的示例在立方体上选择4个点
图像是Texture2D,蓝色圆圈表示用户选择的立方体正面的4个点.这4个点存储在列表中,下一个图像被加载,如下所示
用户再次必须选择与之前相同的面部的4个点(白色面部).然后将这4个点存储到新列表中.
所以现在我有两个列表,我需要计算"整个前脸"从图像1移动(旋转/缩放/平移)到图像2的程度,如下所示

但更重要的是,我需要用3D来计算这个运动!因此,对于第一个图像,我假设z分量= 0.例如,我假设图像1的左上角=例如(10,10,0).
有没有一种方法可以"假设"如果图像2的面部以某种方式旋转/缩放/平移,可以在3D空间中移动?因此,如果图像2的左上角位于图像1(起始图像)左上角的右侧,则摄像机必须向右移动.同样会增加或减少积分?至于旋转,我可以计算图像1点之间的角度和图像2点之间的角度,并以某种方式计算相机旋转了多少?
对于我的代码,我在想这样的事情?
// Image 1 coordinates for the front face
// Assume z = 0
cube1 = new List<Vector3>();
cube.Add(new Vector3(10, 10, 0));
cube.Add(new Vector3(20, 10, 0));
cube.Add(new Vector3(10, 20, 0));
cube.Add(new Vector3(20, 20, 0));
// Get image 2 coordinates
cube2 = new List<Vector3>();
cube.Add(new Vector3(newX, newY, ?)); // Keep Z = 0?
cube.Add(new Vector3(newX, newY, ?));
cube.Add(new Vector3(newX, newY, ?));
cube.Add(new Vector3(newX, newY, ?));
Run Code Online (Sandbox Code Playgroud)
向左或向右移动只计算每个点移动了多少
//Translation
Matrix translating = Matrix.CreateTranslation(new Vector3(amountMovedX, …Run Code Online (Sandbox Code Playgroud) 你好,Stackoverflow.
最近,当我在Visual Studio 2010中进行编程时,我遇到了VS在尝试构建时锁定bin/Debug /(ProjectName).exe文件的问题,并在尝试构建项目后给出了以下错误10倍:
无法将文件"obj\x86\Debug\TileEngine.exe"复制到"bin\x86\Debug\TileEngine.exe".该进程无法访问文件'bin\x86\Debug\TileEngine.exe',因为它正由另一个进程使用.
当我编辑源然后尝试调试时出现问题.我已经检查过使用不同的程序,使用该文件的唯一程序是Visual Studio.
如果我在尝试构建之前等待大约10分钟,它似乎工作正常,但是当尝试不同的事情时,在尝试某些事情之前需要等待10分钟并不好.
我在这个网站上以及我在Google上找到的所有地方都尝试了不同的解决方案.
在Stackoverflow上的一些不同的问题中,我发现了一个解决方案是你进入Project Properties > Build Events,然后在预构建事件命令行中添加:
if exist "$(TargetPath).locked" del "$(TargetPath).locked"
if not exist "$(TargetPath).locked" move "$(TargetPath)" "$(TargetPath).locked"
Run Code Online (Sandbox Code Playgroud)
这使我有可能比平时更多地构建项目,但是当再次编辑代码然后构建时,出现了同样的错误.
注意:尝试构建版本而不是调试版本似乎打破了预构建脚本,并且它以代码"1"退出,这似乎使VS无法正确构建.删除预构建脚本使其再次像"正常"一样工作,但仍然有相同的错误.
这是我发现的另一个解决方案,但是对我来说也没有用,所以我认为Visual Studio已经拥有所需的所有权限并且以管理员身份运行实际上没有任何区别.
在这个问题中,Visual Studio构建失败:无法将exe文件从obj\debug复制到bin\debug,我找到了另一个解决方案,包括AssemblyVersion在Properties\AssemblyInfo.cs文件中更改"2.0.0.0".然而,这对我没有任何影响.
根据互联网上的不同答案,Visual Studio显然使用构建的项目可执行文件来渲染UserControl设计器(?).在我的情况下,这可能不是它,因为我主要使用XNA而且它不使用UserControl设计器.
这可能是我未能正确实施的解决方案.我只是想,如果这是解决方案,我怎么没有被要求这样做.我假设XNA卸载了通过Content管道加载的所有内容,因此这个解决方案不会"真正有意义".
如果有人能够在这个问题上传播一些亮点,那真的很棒,因为它阻止我编程任何东西,因为我不喜欢等待10分钟因为我做了2秒钟的改变每时每刻.
我用这个在Visual Studio 2012中使用我的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提供了一个非常丰富的线索链接.
我正在使用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) 这是一些背景知识.我正在开发类似"崩溃"的游戏.积木填满了底部,当所有十二个区块都被填满后,他们会向上推进到比赛场地.我有一个名为(intNextSpawn)的计数器,它不仅告诉何时"推高"下一行,还计算图形的向量.当块被推高时,它重置为0.
我在屏幕上添加了一些调试文本,试着看看发生了什么,但我似乎无法找到问题所在.看起来它似乎仍在增加计数器,同时试图随机化应该出现的块(事情不按顺序行事).我最终获得了"空白"块,并且在测试时会产生一些非常棘手的效果.当提升速度时,它会变得更糟.
我愿意发布任何可能有用的其他代码.以下是可能发生这种情况的两个主要方块.有没有什么我可能做错了或者有一种方法可以防止这种情况发生(如果这是它正在做的事情)?
任何帮助将不胜感激.
编辑...第一个代码块位于"更新"方法中
// Calculate time between spawning bricks
float spawnTick = fltSpawnSpeed * fltSpawnSpeedModifier;
fltSpawn += elapsed;
if (fltSpawn > spawnTick)
{
// Fetch a new random block.
poNextLayer[intNextSpawn] = RandomSpawn();
// Increment counter
intNextSpawn++;
// Max index reached
if (intNextSpawn == 12)
{
// Push the line up. Returns true if lines go over the top.
if (PushLine())
{
gmStateNew = GameState.GameOver;
gmStateOld = GameState.Playing;
}
// Game still in play.
else
{
// Reset spawn …Run Code Online (Sandbox Code Playgroud) c# ×10
xna ×10
xna-4.0 ×2
.net ×1
2d ×1
3d ×1
architecture ×1
debugging ×1
desktop ×1
optimization ×1
performance ×1
resolution ×1
screen ×1