Questions tagged «xna»

XNA是Microsoft的一种游戏框架,允许部署Windows,Windows Phone和Xbox 360。

3
为什么Farseer 2.x将临时人员存储为成员而不是堆栈中?(。净)
更新:此问题涉及Farseer2.x。较新的3.x似乎没有这样做。 目前,我在广泛使用Farseer Physics Engine,并且我注意到它似乎将许多临时值类型存储为类的成员,而不是像人们期望的那样存储在堆栈中。 这是来自Body该类的示例: private Vector2 _worldPositionTemp = Vector2.Zero; private Matrix _bodyMatrixTemp = Matrix.Identity; private Matrix _rotationMatrixTemp = Matrix.Identity; private Matrix _translationMatrixTemp = Matrix.Identity; public void GetBodyMatrix(out Matrix bodyMatrix) { Matrix.CreateTranslation(position.X, position.Y, 0, out _translationMatrixTemp); Matrix.CreateRotationZ(rotation, out _rotationMatrixTemp); Matrix.Multiply(ref _rotationMatrixTemp, ref _translationMatrixTemp, out bodyMatrix); } public Vector2 GetWorldPosition(Vector2 localPosition) …

2
体素面爬行(简化网格,可能使用贪婪)
编辑:这只是出于我自己的学习经验,并不是出于性能原因而问这个问题。 这是关于Minecraft类地形引擎的。我以块的形式存储块(以块的形式存储16x256x16块)。生成块时,我使用多种过程技术来设置地形和放置对象。生成时,我为整个块(是否有实体)保留一个1D数组,并为实体块保留一个单独的1D数组。 生成后,我遍历实体块以检查它们的邻居,以便仅生成没有实体邻居的块面。我将要生成的面孔存储在自己的列表中(这是6个列表,每个可能的面孔/正常面孔一个)。渲染块时,我渲染相机当前块中的所有列表,而所有其他块中仅渲染面向相机的列表。通过将所有6个列表存储在一个缓冲区中来完成此操作,然后只需更改绘制的范围即可。 结合使用2D地图集和Andrew Russell提出的这个小技巧,我想将相似的面孔完全融合在一起。也就是说,如果它们在相同的列表中(相同的标准),彼此相邻,具有相同的光照水平等。我知道我仍然会以矩形结尾,但是这样可以轻松地将我的顶点数减少50%如果我的估计正确的话,还是更好。 我的假设是将6个列表中的每个列表按其所在的轴排序,然后再按其他两个轴排序(块顶部的列表按其Y值,X,Z排序)。 仅此一项,我就可以很容易地合并面带,但我希望尽可能地合并多个面带。我已经阅读了这个贪婪的网格划分算法,但是在理解它时遇到了很多麻烦。 所以,我的问题是:要按照描述的那样进行人脸合并(忽略对动态地形/照明是否是个坏主意),也许有一种算法更易于实现吗?我也很乐意接受一个答案,它以一种更简单的方式(链接或解释)引导我完成贪婪算法。 我不介意如果它更容易实现,甚至比仅做剥离要好一点,性能都会略有下降。我担心大多数算法都将注意力集中在三角形而不是正方形上,并以我的方式使用2D地图集,我不知道我可以根据当前的技能来实现某些三角形。 PS:我已经对每个块都进行了截锥体剔除,并且如上所述,我也剔除了实体块之间的面。我还没有遮挡剔除,可能永远不会。 *编辑:我实现了自己的小技巧,可能有一个名字,但是我只是简单地浏览了我的6个列表,这些列表按照它们所靠的轴,其次是块类型,然后是照明级别进行了排序。我遍历它们,同时创建新的矩形并同时进行扩展(偏向某个轴)。绝对不是最佳选择,但确实非常快,并且确实使我的顶点数平均降低了近50%。Byte56的评论是我认为是真正答案的壁橱,但我不能选择它作为答案/赏金。 这是在生成完整的初始地形后无需进行任何优化的情况下处理此问题的快速简便的方法。假定给定的所有正方形都是相同的图像,光照水平,法线等。每种颜色都是我要渲染的不同四边形。根据我的列表的排序方式,这是一种非常简单/快速的方法。

2
从Rectangle.Intersects()获取碰撞详细信息
我有一个Breakout游戏,在该游戏中,有时会通过以下方式检测到球和桨之间的碰撞: // Ball class rectangle.Intersects(paddle.Rectangle); 有什么办法可以获取当前碰撞的确切坐标或有关碰撞的任何详细信息XNA API? 我考虑做一些基本的计算,例如比较碰撞时每个物体的精确坐标。它看起来像这样: // Ball class if((rectangle.X - paddle.Rectangle.X) < (paddle.Rectangle.Width / 2)) // Collision happened on the left side else // Collision happened on the right side 但是我不确定这是正确的方法。 你们对我可能要使用的引擎有任何提示吗?甚至使用这种方法的良好编码习惯?

5
精灵渲染速度模糊
在为游戏增加速度之后,我感觉我的纹理在抽搐。我以为只是我的眼睛,直到最终在屏幕截图中捕获了它: 左边的是我的游戏中呈现的内容;右边的是粘贴的原始精灵。(这是Photoshop的屏幕截图,放大了6倍。) 请注意,边缘是混叠的-看起来几乎像是亚像素渲染。实际上,如果我没有强迫我的精灵(位置和速度为整数)使用整数值进行绘制,我会发誓MonoGame使用浮点值进行绘制。但事实并非如此。 这些事情看起来模糊的原因可能是什么?没有施加速度就不会发生这种情况。 确切地说,我的SpriteComponent班级有一个Vector2 Position领域。当我致电时Draw,我实际上是使用new Vector2((int)Math.Round(this.Position.X), (int)Math.Round(this.Position.Y))该职位。 我之前有个bug,即使静止的物体也会抖动-这是由于我使用了直线Position向量,而不是将值四舍五入到ints。如果我使用Floor/ Ceiling而不是圆形,则精灵会下沉/悬停(两种方式各有一个像素差异),但仍会模糊。

2
服务器端输入
当前在我的游戏中,客户端不过是渲染器。当输入状态更改时,客户端将数据包发送到服务器,并像对待输入一样处理播放器,但是服务器保留最终决定权。 除了一个大问题:掉落边缘,这通常效果很好。基本上,如果玩家正朝着一条边走,比如说一个悬崖,并且在走出边缘之前就停下来了,有时是一秒钟之后,他将被传送到边缘之外。这是因为在服务器处理信息后发送了“我停止按W”数据包。 这是一个滞后图,可以帮助您理解我的意思:http : //i.imgur.com/Prr8K.png 我可以每帧发送一个“ W Pressed”数据包供服务器处理,但这似乎是带宽成本很高的解决方案。 任何帮助表示赞赏!

1
gluLookAt如何工作?
据我了解, gluLookAt( eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x, up_y, up_z ); 等效于: glRotatef(B, 0.0, 0.0, 1.0); glRotatef(A, wx, wy, wz); glTranslatef(-eye_x, -eye_y, -eye_z); 但是当我打印出ModelView矩阵时,对的调用glTranslatef()似乎无法正常工作。这是代码片段: #include <stdlib.h> #include <stdio.h> #include <GL/glut.h> #include <iomanip> #include <iostream> #include <string> using namespace std; static const int Rx = 0; static const int Ry …

4
保持两个物体之间的旋转
在我的XNA游戏中,我有两个碰撞的对象。当第一个物体与另一个物体碰撞时,它可以锁定在其上并在整个世界中移动。我这里的数学有问题(数学不是我的强项)。目前,我将第二个对象闩锁放在第一个对象闩锁上并随其移动,但是我无法使其保持其原始方向。因此,如果对象朝上,则应相对于与原始项目一起旋转的方向保持该方向。 关于如何最好地实现这一目标的任何提示?
9 xna  rotation 

1
Xbox指拨杆用于旋转精灵,基本公式使其以90度的间隔“粘”或“粘”!您如何顺利旋转?
我正在使用一个非常基本的公式来计算我的精灵(例如太空船)应基于Xbox控制器指尖所面对的角度,即您使用指尖来旋转飞船。 在我的主要更新方法中: shuttleAngle = (float) Math.Atan2(newGamePadState.ThumbSticks.Right.X, newGamePadState.ThumbSticks.Right.Y); 在我的主要绘制方法中: spriteBatch.Draw(shuttle, shuttleCoords, sourceRectangle, Color.White, shuttleAngle, origin, 1.0f, SpriteEffects.None, 1); 如您所见,它非常简单,我从指尖获取当前弧度并将其存储在浮子中shuttleAngle,然后将其用作旋转角度参数(以弧度为单位)以绘制往复运动。 由于某些原因,当我旋转Sprint时,它在0、90、180和270度的角度感觉发粘。它想以这些角度解决。这并不能像在使用类似机制的游戏中那样给我流畅自然的旋转。PS:我的Xbox控制器很好!
9 xna  c#  sprites  rotation  gamepad 

3
如何分解精灵表
我有很多Spritesheets格式不佳,我想分解它们,或分解成许多小图像,每个Sprites一个。如果可以,我可以使用自定义纹理打包器工具来构建游戏资源。 我的开发工具是针对Windows的XNA和C#。如何分解图像?

4
使用全屏四边形对渲染目标进行完美像素渲染
将一堆值渲染到rendertarget时遇到一些麻烦。这些值永远不会在我想要它们的确切范围内。基本上,我使用全屏四边形和像素着色器渲染到我的rendertarget纹理,然后打算将纹理坐标用作着色器中某些计算的基础。四边形的纹理坐标范围从左上角的(0,0)到右下角的(1,1)...问题是,插值后,这些值没有像这样到达像素着色器。 一个示例: 我渲染为4x4纹理,在这种情况下,着色器仅在红色和绿色通道中输出纹理坐标(u,v): return float4(texCoord.rg, 0, 1); 我要摆脱的是一种纹理,其中左上角的像素是RGB(0,0,0),因此是黑色,右上角的像素是RGB(255,0,0),因此是明亮的红色,左下角的像素为RGB(0,255,0)-亮绿色。 但是,相反,我在这里得到此: (直四边形渲染,无校正) 左上方的像素是黑色,但在其他角落我只能得到相对深红色和深绿色。它们的RGB值为(191,0,0)和(0,191,0)。我强烈怀疑它与四边形的采样位置有关:左上像素正确地对四边形的左上角进行采样,并获得(0,0)作为UV坐标,但其他角点像素未从中采样四边形的其他角。我已经在左图中说明了这一点,蓝色框代表四边形,白色点代表上采样坐标。 现在,我知道在Direct3D9中渲染屏幕对齐的四边形时应将半像素偏移应用于坐标。让我们看看我从中得到什么样的结果: (以DX9的半像素偏移量渲染的四进制) 红色和绿色变亮,但仍然不正确:223是我在红色或绿色通道上获得的最大值。但是现在,我什至没有纯黑色,而是带有RGB(32,32,0)的深黄灰色! 我真正需要的是这种渲染: (目标渲染,减小的四边形尺寸) 与第一个图形相比,看起来我必须将四边形的右边界和底边界恰好向左移动一个像素。然后,像素的右列和底行都应正确地从四边形的边界正确获取UV坐标: VertexPositionTexture[] quad = new VertexPositionTexture[] { new VertexPositionTexture(new Vector3(-1.0f, 1.0f, 1f), new Vector2(0,0)), new VertexPositionTexture(new Vector3(1.0f - pixelSize.X, 1.0f, 1f), new Vector2(1,0)), new VertexPositionTexture(new Vector3(-1.0f, -1.0f + pixelSize.Y, 1f), new Vector2(0,1)), new VertexPositionTexture(new …

4
使用XNA ContentPipeline在没有完整XNA GS的计算机上导出文件
我的游戏使用内容管道在运行时加载spriteSheet。游戏的美术师将修改后的Spritesheet发送给我,然后在计算机中进行构建并向他发送了更新的项目。因此,我正在寻找一种在他的计算机中生成xnb文件的方法(这是内容管道的输出),而无需他安装完整的XNA Game studio。 1)我不希望我的艺术家安装VS + Xna(我知道有VS的免费版本,但是一旦我们向团队中添加更多人,它将无法扩展)。2)我对在Xbox中运行此编辑器/工具不感兴趣,因此只能使用Windows解决方案。3)我知道MSBuild选项,但它们需要完整的XNA 我研究了Shawn的博客,发现使用Msbuild Sample的选项或XNA 4.0中的新选项在这里看起来很有希望,但似乎有相同的限制:需要安装完整的XNA GS,因为ContentPipeline不属于XNA redist。 那么有人找到了解决方法吗?

2
Lua与Python作为XNA / C#平台的脚本语言的优缺点是什么?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我正在考虑将一种古老的想法付诸实践。该游戏的核心点是游戏环境和对象的功能自定义的可能级别(例如修改太空船武器的行为)。为此,游戏需要编写脚本。我也不打算将其商业化,这对我来说只是一个有趣的编程挑战。 由于我主要是.NET专家,因此我将在游戏本身中使用XNA / C#。对于脚本,我考虑使用Python或Lua。我以前有使用Python的经验,没有反对它的语言。另一方面,Lua对我来说几乎是全新的,除了我在这里和那里所做的一些魔兽世界插件的小改动之外,它看起来很有希望。所以这是我的问题: Lua与Python作为XNA / C#平台的脚本语言的优缺点是什么? XNA / C#中的其中之一是否更容易使用?与XNA / C#一起使用时,其中之一具有某些特定的优点或缺点吗?为什么要为XNA / C#推荐一个?
9 xna  c#  scripting 

3
针对多个正方形的基于图块的高效碰撞检测?
目前,我正在自己开发一款基于图块的游戏(想想Terraria,但不要太幻想了(我认为这是一个词?如果不是,抱歉)。 无论如何,我目前有碰撞检测功能(甚至适用于极端情况!),这对我来说是一大进步。看到一个精灵没有穿过一个块,这让我非常高兴。但是后来我有了基准测试的想法。馊主意。 1000平方,没问题。10,000平方,对于3个字符来说有点滞后。100,000平方(真是巨大的地图),无法显示3个字符。 我遇到的问题是,我什至不想考虑与玩家,角色,物品等距离太远的块,但我不想不断地将这些块装入内存。 到目前为止,这是我的算法,请随时批评。 foreach (Block in level) { if (distance from block to player > a specified amount) ignore this block; else { get the intersection depth between the two bounding boxes if (depth of intersection != Zero-vector) { check y size vs x size resolve on smallest …

2
太阳运动功能?
因此,考虑到将太阳精灵设置在地平线上(x = 0,y = worldheight / 2),我试图设计一个使太阳升起然后掉落的函数。 最好的方法是使用sin函数,但我不知道如何使用它。 如果使用y = sin(x),则对于完整的曲线,x的范围必须在0到pi之间,而对于X的速度必须恒定。 有什么想法或建议吗? 编辑:谢谢大家!

4
我应该使用什么技术来促进XNA GameComponents之间(或游戏中任何类型的组件之间)的通信?
我从第一个“适当的”游戏项目开始,并且不可避免地遇到障碍,试图决定XNA中的游戏组件应该如何通信。 从以前的(Java)GUI编程事件来看,处理程序和侦听器似乎是前进的道路。因此,我将拥有某种类型的事件总线,该事件总线可以接受事件注册,并可以订阅这些事件的类,并由处理程序来处理它们。例如(伪代码): class SpriteManager Update(){ if(player.collidesWith(enemy) // create new 'PlayerCollisionEvent' } class HUDManager onPlayerCollisionEvent(){ // Update the HUD (reduce lives etc) } 但是,我不确定完全完成此操作所需的代码设置(在C#中)。是什么跟踪事件(某种公共汽车?),它的结构如何? 在游戏服务上似乎也有很多提及,您可以在Game.cs主类中注册一个GameComponent,然后从引用了主要“ Game”对象的代码中的任何位置获取它。我已经使用SpriteBatch对象尝试了此操作,这看起来非常简单..但是,我看不到它像事件模型那样灵活。 以敌人死亡时为例。我们要更新游戏分数。使用服务,我可以获得对在Game1中创建并作为服务添加的StateManager对象的引用,然后将“得分”设置为新值。我认为“ onEnemyDeath”事件可以由多个类以不同的方式处理,但是由相关“敌人死亡检测”部分中的一行代码启动,比单独转换每个必需的GameComponent然后调用任何东西更好。方法是必需的。 还是这些次等策略比其他策略好? 我意识到这和游戏通信范例一样,在一定程度上是我对C#的不充分了解,但是我真的很想弄清楚这一基本知识。 更新资料 看过服务时,我不太相信它的细节-它基本上是在传递一个全局变量(据我了解)。 更新2 看过有关事件处理和测试示例代码的基础教程之后,看来事件将是我所讨论的逻辑选择。但我在所看到的示例中使用的却很少。有一些明显的原因为什么不应该这样做?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.