Articles of 解决scheme

我应该使用什么图像大小来进行移动跨平台游戏?

我是移动开发新手。 我使用Monogame。 我应该考虑哪些设备屏幕分辨率来定位所有Android,iOS和Windows Phone设备? 假设我们有三种屏幕尺寸,我应该为每个目标分辨率使用不同的图像吗?

如何解决两个矩形拐角的圆的碰撞?

我正在写一个简单的非物理的单圆到多矩形碰撞检测器/parsing器。 对于碰撞检测,我使用了一个非常常见的algorithm ,它工作得很好。 对于碰撞parsing,一旦检测到碰撞,我计算穿透vector,并反向移动相反方向的圆。 再次,它工作得很好。 但是,当两个相邻的对撞机相邻时,在两个碰撞体相遇的地方圆正好向右移动,情况就比较复杂。 这是情况的截图: 白色矩形是矩形对撞机(墙),黄色圆形是圆形对撞机(玩家),洋红色线是从圆心到每个对撞机最近点的vector。 当我在多个矩形上碰撞时,问题就会发生。 如上图所示,顶部的长方形将具有不在整个表面的法线方向上的穿透vector,因此当圆形穿过墙壁时会产生伪影,这取决于我如何处理它。 我已经尝试了很多解决scheme,但都会创建工件。 特别是,使用任何algorithm只select一个碰撞并仅为其求解,根据评估的顺序可能会产生不同的解决scheme,特别是在必须明确select两个碰撞的情况下,如下所示: 仅供参考,这些图表是为了展示自上而下的,而不是竞赛场的侧面图。 有没有一种已知的方法来正确解决这种冲突?

二维平台多个矩形碰撞造成抖动

我在两周前发布了这个问题: 2D平台游戏角落碰撞和我实现了NoobsArePeople2的解决scheme。 问题是,当玩家在两个矩形相交时,他开始抖动。 我不知道如何描述它,所以我制作了一个video: http : //www.youtube.com/watch?v = 2AYUGeuxM0c 在前四秒左右,你可以看到,当他碰到两个互不相关的长方形或相互接触的时候,一切正常,但在剩下的video里,你可以看到当玩家接触到一边时,他开始抖动(请注意,由于fraps,我的游戏运行在四分之一的FPS我正常,所以没有fraps的抖动要快得多) 为了让你知道我的碰撞矩形现在看起来如何,这里是debugging模式(每个矩形是随机着色的) 我有几个algortihms合并到一个矩形(仍然需要做一些工作),但有些根本无法合并。 一个例子是右侧的C对象。 现在它由7个矩形组成(在完成我的algorithm之后将会是3个),当玩家在其侧面滑动时,他开始抖动。 我怀疑问题是在我的重力,但我不知道。 我已经花了5天的时间来解决这个问题,我输了。 下面是我的代码(略有修改): for (int i = 0; i < playerCollisionRectangles.Count; i++) { Vector2 depth = Collision.GetIntersectionDepth(player.PlayerRectangleInWorld, playerCollisionRectangles[i]); if (depth != Vector2.Zero) { float absDepthX = Math.Abs(depth.X); float absDepthY = Math.Abs(depth.Y); // Resolve the collision along the shallow axis. if (absDepthY […]

Direct3D 11:更改全屏分辨率不起作用

在我的应用程序中,我可以使用IDXGISwapChain :: SetFullscreenState在窗口模式和全屏模式之间来回切换。 处理WM_SIZE时,响应中调用IDXGISwapChain :: ResizeBuffers。 这工作正常,进入全屏模式时DXGIselect桌面分辨率。 当我试图改变分辨率,而保持全屏时,问题出现了。 我尝试通过使用IDXGISwapChain :: ResizeTarget更改分辨率。 我试图切换到的模式描述是通过使用IDXGIOutput :: GetDisplayModeList,所以它应该是有效的。 在进行resize时,我会进入全屏幕时发生的通常闪烁,但没有任何改变。 分辨率仍然相同,并没有像selectDXGI输出和大小一样生成WM_SIZE消息。 DXGI最佳实践也包含了大量的信息,但它并没有帮助我。 我在创建交换链时使用了DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH标志,而且我也尝试了使用IDXGIFactory :: MakeWindowAssociation和DXGI_MWA_NO_WINDOW_CHANGES和DXGI_MWA_NO_ALT_ENTER标志无效。 如果我使用低分辨率硬编码要在全屏模式下创建的交换链,我可以看到鼠标光标锯齿变大,这种视觉差异在更改分辨率时不存在。 我可能在这里得到的概念错误? 调用ResizeTarget后,我应该得到一个WM_SIZE消息? 显示模式和后台缓冲区如何关联? 我知道,当前端缓冲区大小发生变化时,后端缓冲区的大小应该匹配,以便根据链接进行翻转而不是连接,所以建议在应用程序获取WM_SIZE消息时进行大小调整。 在我发现的一些类似的问题中,也许有关于这个问题的讨论可能是一个错误,但是他们都只是没有最终答案就死了。 编辑:我试图手动调用OnResize(我的方法实际上调用ResizeBuffers等等)后,我试图更改分辨率和以下警告显示在debugging器(不可见之前): DXGI警告:IDXGISwapChain :: Present:由于应用程序没有正确使用IDXGISwapChain :: ResizeBuffers而导致的全屏演示效率低下,指定DXGI_MODE_DESC在IDXGIOutput :: GetDisplayModeList中不可用,或者不使用DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH.DXGI_SWAP_CHAIN_DESC :: BufferDesc = {800,600, 60,1},R8G8B8A8_UNORM_SRGB,0,0}; DXGI_SWAP_CHAIN_DESC :: SampleDesc = {1,0}; DXGI_SWAP_CHAIN_DESC :: Flags = 0; [其他警告#98:] 新的分辨率(800×600)似乎已设置,但请注意,标志成员是0.它不应该是0x2? 难道这就是决议没有任何作用的原因吗? 这个标志在交换链描述之前被设置在交换链创建之前,所以我不明白它是如何变成0的。 编辑2:在DXGI_SWAP_CHAIN_FLAG文档的底部的一个小小的评论说,ResizeBuffers可以重置或更改标志。 我看看我的代码,那里是:国旗被设置为零(阅读我的书,我必须接受它重用旧国旗或什么的)。 […]

随着油滑,如何改变游戏过程中的分辨率?

我正在开发一个基于瓦片的策略游戏,使用Java和Slick API。 到目前为止这么好,但是我在选项菜单上停顿了一下。 我有计划让用户能够在游戏过程中改变分辨率(毕竟这是很常见的)。 我已经可以改变到全屏,回到窗口,这很简单… //"fullScreenOption" is a checkbox-like button. if (fullScreenOption.isMouseOver(mouseX, mouseY)) { if (input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON)) { fullScreenOption.state = !fullScreenOption.state; container.setFullscreen(fullScreenOption.state); } } 但是,与我以前的看法相反,集装箱class似乎没有任何解决scheme变更function! 这就是情况…我知道这是可能的,但是我不知道该怎么做,也没有责任。 在Slick的例子和教程中,游戏初始化时使用的AppGameContainer类是唯一具有改变我目前find的显示模式function的地方,但是它只在最开始时才使用,而且我还没有find从我的选项菜单回到它的方式。 //This is my implementation of it… public static void main(String[] args) throws SlickException { AppGameContainer app = new AppGameContainer(new Main()); // app.setTargetFrameRate(60); app.setVSync(true); app.setDisplayMode(800, 600, false); app.start(); } 我可以将其定义为Main上的静态全局,但这可能是一个非常糟糕的方法。

AABB和Circle之间的碰撞

我正在为2D游戏引擎编写碰撞系统。 这个想法是不同的系统可以相互作用。 因此,其中一种情况是检查轴alignment边界框与基于半径的圆形碰撞之间的碰撞。 它们都被实现为以相同types的碰撞作出反应,使我得到最小的平移向量。 所以我的做法是将它们组合起来,如果圆圈位于箱子的一个角落外部区域,则用它的边界圆来解释箱子,并检查两个圆圈之间的碰撞,但是如果圆圈位于箱子的侧面外部区域框我用它的边界框来解释圆,并应用AABB碰撞。 提示:这是一个好方法吗?

编码真正的高分辨率显示arrays

我一直负责构建一个实时的“全屏”演示,以在60英寸LED电视机的5x2arrays上运行,换句话说,就是一个20万像素的显示器。 我们有一台机器能够以全分辨率在显示器上运行单个Win7桌面,还有一些相当不错的video卡。 我的问题是:除了我的像素着色器将要做的大量工作,DX10还有什么其他的限制吗?*这将在这里发挥作用,不会在一个更合理的大小的视口? 在下个星期之前,我将无法使用硬件,但是我想写一些我可以用来对系统进行基准testing的东西。 更新 当我使用一束AMD EyeFinity(6个输出)卡片管理单台机器时,为了保证工作顺利进行,“最简单”的方法就是创建一个DX窗口作为窗口跨度显示造成了一些性能问题 – 通过将任务分配到一组机器上,每个机器驱动两台显示器,我也得到了很好的工作。 这非常容易。 对于我testing的XNA应用程序,我添加了一个捕获一些游戏状态(摄像头位置/方向等)的GameComponent,并且UDP在每个帧的本地子网中对其进行垃圾回收。 该组件有一个Mode开关(发送或接收)。 如果处于Receive模式,则捕获UDP数据报并使用来自发件人的信息更新游戏状态。 Send模式只是发送状态数据包,并通过服务/守护进程,导致节点启动或停止客户端应用程序。 任何客户端都可以充当“主”,将客户端切换到Send模式会请求所有其他节点切换到Receive 。 看到人们为了控制而战时会发生什么,这是相当有趣的。 另一个好处是:我创建了一个控制台应用程序,用于处理一系列关键帧状态定义 – 位置,时间等 – 根据需要进行插值,并使用与游戏引擎中使用的代码相同的代码进行发送。 这可以让我轻松地脚本移动,从Web浏览器提交转换等。 总而言之,大约需要50行代码来保持应用程序的多个副本同步运行。 一些额外的复杂性来自为每台机器设置相机位置并纠正一些视角/投影的烦恼,但是其中大部分都归结为每个节点的configuration文件。