Tag: 2d

在计算2D空间中两点之间的对角线交点时如何确定+/-符号?

这是另一个问题的分支,与Keith Randall对问题的回答有关。 请快速查看图像,看看下面的function是做什么的。 简而言之,如果x2 != x1和y2 != y1则2D网格上的任何两个点都将具有两个对角交点。 我实现了以下function,但无法弄清楚如何确定从哪个单元中减去delta以及添加到哪个单元。 因此,对于某些坐标,结果是准确的,而对于其他坐标,它们是相反的。 // This class is the same as [Point] except // it uses BigInteger instead of Int32 types. public class Cell { System.Numerics.BigInteger X = 0; System.Numerics.BigInteger Y = 0; } public List GetIntersections (Cell c1, Cell c2) { List cells = new List(); System.Numerics.BigInteger delta […]

如何在2D游戏中计算SCREEN到WORLD位置

我有这个课,我用它在我的2D游戏中绘制精灵: using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Audio; namespace Namespace { /// /// Found this brilliant code at. /// http://adambruenderman.wordpress.com/2011/04/05/create-a-2d-camera-in-xna-gs-4-0/ /// public class CCamera2d { private const float zoomUpperLimit = 1.3f; private const float zoomLowerLimit = .85f; private float _zoom; private Matrix _transform; private Vector2 _pos; private float _rotation; private int _viewportWidth; private int _viewportHeight; private […]

将2dtexture从库存拖到游戏中

好吧,所以我正在制作移动2D游戏。 您可以在游戏中从广告资源中拖出矩形或圆圈。 我希望如何设置:当我将库存中的一个项目拖入游戏时,在顶部或右侧是具有对象/纹理的库存。 然后它从库存中删除该项目。 之后,商品库存将全部向上移动1个。 这样第一个插槽就被占用了。 我怎么做这个工作? 请有人帮我思考或给我一些例子吗? 提前致谢!

XNA 2D鼠标选择

我正在使用XNA开发一个简单的2D实时策略游戏。 现在我已经达到了我需要能够单击一个单元或建筑物的精灵并且能够引用与该精灵相关联的对象的点。 根据我过去三天所做的研究,我发现了许多关于如何在3D中进行“鼠标拾取”的参考资料,这似乎不适用于我的情况。 我知道另一种方法是简单地在世界中拥有一个包含所有“可选”对象的数组,当玩家点击一个精灵时,它会根据数组中所有对象的位置检查鼠标位置。 我对这种方法的问题是,如果单位和建筑物的数量增加到更大的数量,它会变得相当慢。 (它似乎也不是很优雅)所以我还能做些什么呢? (请注意,我还研究了使用哈希表将对象与精灵位置相关联的想法,并使用二维数组,其中数组中的每个位置代表世界上的一个像素。再一次,它们似乎相当笨重的做事方式。)

C#XNA 2D轨迹效果优化

目前,作为我游戏中的一种线索效果,我每5帧就有一个精灵的半透明纹理副本被添加到一个List 的路径中。 这些轨迹的alpha值每帧递减,绘制函数遍历列表并绘制每个纹理。 一旦它们达到0 alpha,它们就会从List 中删除。 结果是移动实体背后的一个很好的小尾迹效果。 问题是大约100多个实体,帧速率开始急剧下降。 所有的跟踪纹理来自同一个精灵表,所以我不认为它是批处理问题。 我描述了代码,并且在FPS下降峰值期间CPU强度较低然后它处于正常FPS,所以我认为这意味着它的GPU限制? 有没有办法更有效地实现这种效果? 下面是使用的通用代码: // fade alpha m_alpha -= (int)(gameTime.ElapsedGameTime.TotalMilliseconds / 10.0f); // draw if (m_alpha > 0) { // p is used to alter RGB of the trails color (m_tint) depending on alpha value float p = (float)m_alpha/255.0f; Color blend = new Color((int)(m_tint.R*p), (int)(m_tint.G*p), (int)(m_tint.B*p), m_alpha); […]

使用WPF绘制图像网格

我正在尝试使用WPF绘制图像/图标网格。 网格尺寸会有所不同,但通常为10×10到​​200×200。 用户应该能够单击单元格,并且某些单元格需要每秒更新(更改图像)10-20次。 网格应该能够在所有四个方向上增长和缩小,并且它应该能够切换到它所代表的3D结构的不同“切片”。 我的目标是找到一种适当有效的方法,根据这些要求绘制网格。 我当前的实现使用WPF Grid 。 我在运行时生成行和列定义,并使用Line (对于网格线)和Border (对于单元格,因为它们当前只是打开/关闭)在相应的行/列处填充网格。 ( Line对象一直跨越。) 在扩展网格时(按住Num6),我发现在每次操作时绘制的速度都太慢,所以我修改它只是为每个增长列添加一个新的ColumnDefinition , Line和Border对象集。 这解决了我的增长问题,也可以使用类似的策略来快速缩小。 为了在模拟中更新单个单元格,我可以简单地存储对单元格对象的引用并更改显示的图像。 甚至可以通过仅更新单元格内容而不是重建整个网格来改进到新的Z级别。 但是,在我完成所有这些优化之前,我遇到了另一个问题。 每当我将鼠标hover在网格上时(即使在慢速/正常速度下),应用程序的CPU使用率也会激增。 我从网格的子元素中删除了所有事件处理程序,但这没有任何效果。 最后,控制CPU使用的唯一方法是为Grid设置IsHitTestVisible = false 。 (为Grid每个子元素设置它都没有做任何事!) 我相信使用单独的控件来构建我的网格对于这个应用来说过于密集和不合适,并且使用WPF的2D绘图机制可能更有效。 不过,我是WPF的初学者,所以我正在寻求如何最好地实现这一目标的建议。 从我读过的内容来看,我可能会使用DrawingGroup将每个单元格的图像组合成一个图像以供显示。 然后,我可以为整个图像使用单击事件处理程序,并通过鼠标位置计算单击的单元格的坐标。 但这似乎很混乱,我只是不知道是否有更好的方法。 思考? 更新1: 我接受了朋友的建议并转而使用带有Rectangle的Canvas用于每个单元格。 当我第一次绘制网格时,我将对所有Rectangle引用存储在一个二维数组中,然后当我更新网格内容时,我只是访问这些引用。 private void UpdateGrid() { for (int x = simGrid.Bounds.Lower.X; x <= simGrid.Bounds.Upper.X; x++) { for (int y = simGrid.Bounds.Lower.Y; […]

将壁序列表转换为相干多边形的算法

我有一对成对点描述多边形的点列表,如下所示: 是正方形。 请注意,每对点描述一条线,因此我们的方块由线组成 < > < > < > < > 然而,我必须绘制这些多边形,当所讨论的点都正确有序并且没有孔时,这些多边形可以正常工作。 不幸的是,当输入类似时,这有时会出错 并且生成的多边形很奇怪或者有多边形几个洞 在这些情况下,使用drawpoly(点)绘制这些多边形的初始事情是行不通的。 这是在c#中,输入实际上是List ,其中GeoData包含2个点(以及一些其他misq数据)。 对于输出,我正在考虑制作一个List和一个List>,其中第一组点是外线,第二个列是孔,这会起作用吗? 我确实需要对多边形进行一些额外的计算,然后只绘制,但我认为使用特殊的孔列表将是最简单的。 这是一个例子: 左边是我目前右边的输入。

如何在XNA中逐个像素地绘制?

我正在尝试使用XNA逐个像素地在屏幕上绘图,但是我遇到了资源问题。 我认为最好的方法是使用1个纹理来更新每一帧,但是我无法更新它。 这是我到目前为止所做的,就像测试一样: Texture2D canvas; Rectangle tracedSize; UInt32[] pixels; protected override void Initialize() { tracedSize = GraphicsDevice.PresentationParameters.Bounds; canvas = new Texture2D(GraphicsDevice, tracedSize.Width, tracedSize.Height, false, SurfaceFormat.Color); pixels = new UInt32[tracedSize.Width * tracedSize.Height]; base.Initialize(); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); pixels[100] = 0xFF00FF00; canvas.SetData(pixels, 0, tracedSize.Width * tracedSize.Height); spriteBatch.Begin(); spriteBatch.Draw(canvas, new Rectangle(0, 0, tracedSize.Width, tracedSize.Height), […]

不使用XNA或其他第三方库的2d Sprite动画

我想创建一个简单的游戏,类似于RPG Maker可以创建的游戏。 我目前主要关注的是一个教程,它可以指导我如何在不使用XNA或任何其他特定库的情况下完成它。 理想的是一步一步的教程或一个易于理解的好例子。 我的目标是独立完成,并了解整个过程如何与彼此相关的动画元素相关。 我已经使用一个简单的教程构建了一个简单的蛇游戏,但它没有动画动画,这是我接下来要学习的主要内容。 编辑: 到目前为止,我发现的所有教程都使用第三方库。 我确实遇到过这个链接 ,但我正在寻找不包含XNA的东西。

c# – 如何将点移动给定距离d(并获得新坐标)

嗨,我想知道是否有任何有效的方法来计算点的坐标(从它的原始位置移动距离d)。 假设我有一个点P(0.3,0.5),我需要随距离d移动该点随机方向。 到目前为止,我通过随机选择新的x和y坐标来做到这一点,我正在检查新旧点之间的距离是否等于d。 我确实意识到这样做不太有效。 你会怎么做?