Articles of C ++

为多维数据集创建一个地图编辑器

我被告知我应该创建一个地图编辑器,而不是硬编码我的地图的所有网格。 这听起来像一个有趣的项目,从长远来看会让事情变得更容易,但我甚至不知道从哪里开始。 这将是非常简单的,3个立方体types,一个1000×1000网格,并能够堆叠立方体在彼此之上。 将地图导出到我可以在我的游戏中使用的东西将是一个问题。 同时为编辑器创建用户界面将是我完全新的东西。 有没有可以帮助这个的任何链接?

防止小型快速物体的隧道效应

我正在和朋友做一个基本的射击游戏,我遇到了一个问题。 我有点知道解决scheme,但我不能实施它。 这是我用XNA / MonoGame制作的第一款游戏,我也不太喜欢c#。 所以我的问题是子弹和敌人之间的碰撞检测。 有时候子弹穿过敌人,有时候会打到。 问题似乎在我的碰撞检测代码,因为它只检测我的数组列表中的一个项目。 这个( 扫描testing )可能是某人建议的解决scheme,但对我来说看起来太复杂了。 这可能是如此简单的修复,但就像我说我只是不知道如何做到这一点。 我会发布我的代码,并希望有人可以帮助。 谢谢! 这是我的主要类别,它应该消除死亡的敌人: foreach (enemy enem in enemies) { enem.Update(graphics.GraphicsDevice); } LoadEnemies(); foreach (bullet bull in bullets) { bull.Update(); } //WSAD movement if (Keyboard.GetState().IsKeyDown(Keys.D)) { charRect.X += 6; } if (Keyboard.GetState().IsKeyDown(Keys.A)) { charRect.X -= 6; } if (Keyboard.GetState().IsKeyDown(Keys.W)) { charRect.Y -= 6; } […]

在彼此顶部绘制的立方体

在我之前的问题后面 : 限制绘制调用的数量 我已经降低了我的平局只有58帧! 但现在我有另一个问题。 我有2500个立方体都在相同的位置绘制。 我不知道为什么。 在我以前的问题所做的一切工作正常。 这是我绘制的方法,绘制我的大块。 public void Draw(BasicEffect effect, ThirdPersonCam cam) { device.SetVertexBuffer(vertexBuffer); device.Indices = indexBuffer; foreach (EffectPass pass in effect.CurrentTechnique.Passes) { no++; pass.Apply(); effect.VertexColorEnabled = false; effect.TextureEnabled = true; effect.Texture = grass; Matrix center = Matrix.CreateTranslation(new Vector3(-0.5f, -0.5f, -0.5f)); Matrix scale = Matrix.CreateScale(1f); Matrix translate = Matrix.CreateTranslation(cubePosition); effect.World = center […]

使用索引和顶点的纹理

我已经写在纸上,并试图了解如何创建每个立方体的三角形,但我无法正确地在我的立方体上绘制我的纹理。 我不知道这是我的立方体的每个面的纹理坐标,还是从我的顶点创建立方体的顺序,但是我只能看到正确的两面,其余的都是灰色的。 private void SetUpFrontFace(Vector3 cubeInChunkPosition, List<VertexPositionTexture> vertices) { vertices.Add(new VertexPositionTexture(cubeInChunkPosition + new Vector3(0, 0, 0), new Vector2(0, 1))); vertices.Add(new VertexPositionTexture(cubeInChunkPosition + new Vector3(0, 1, 0), new Vector2(0, 0))); vertices.Add(new VertexPositionTexture(cubeInChunkPosition + new Vector3(1, 1, 0), new Vector2(1, 0))); vertices.Add(new VertexPositionTexture(cubeInChunkPosition + new Vector3(1, 0, 0), new Vector2(1, 1))); } private void SetUpBackFace(Vector3 cubeInChunkPosition, List<VertexPositionTexture> […]

作为方法加载纹理

我想在我需要的时候加载纹理,所以我需要一个方法来实现。 LoadTexture(string fileName) 我只使用那个参数,但是我会在方法中放什么? 到目前为止,我只是在启动时加载了类似的内容 content.Load<Texture2D>("blah"); 但是我想从启动时加载所有内容,只在需要的时候加载内容。 编辑:为了解释我要去什么,我会给更多的细节。 说我有一大块块50x50x50。 这些大部分都不会被绘制,所以加载没有绘制的立方体的纹理是没有意义的。 这就是为什么我需要一个方法,可以在需要为多维数据集加载纹理时调用。 而不是加载6个纹理125000立方体的6面,我减less了负载量只有可见的立方体。

分开绘制调用

接下来我想在我的游戏中实现的是截锥体扑杀。 我遇到的问题是创建一个绘制方法,我可以检查我绘制的顶点缓冲区中的哪些立方体。 我想要做的是循环我的列表“立方体”,并检查立方体具有的每个边界框。 我之前做过这个,当时每个立方体都有一个单独的顶点缓冲区,但是现在当我用一大块立方体尝试它时,会使我的电脑崩溃。 我知道为什么发生这种情况,所以我不会麻烦解释它。 cubes.Add(new Cube.Grass(device, new Vector3(x, map[x, z] – y, z), grass)); cubeBoundingBox(some Vector3s here); 因此,使用这两行代码将多维数据集添加到列表中,并根据框的位置和大小创建一个边界框。 我相信有一个更好的方法来做到这一点。 public void DrawMap(GameTime gameTime) { ContainmentType CurrentContainmentType = ContainmentType.Disjoint; foreach (Cube block in cube.cubes) { CurrentContainmentType = cam.frustum.Contains(cube.cubeBoundingBox); //some more stuff here if (CurrentContainmentType != ContainmentType.Disjoint) { cube.Draw(effect); } 这是我几乎工作的旧方法。 但现在我已经将所有的多维数据集存储在一个顶点缓冲区中,这是行不通的。 我有点迷路了 我怎么能通过我的列表“立方体”中的所有立方体,以检查是否需要扑杀? 或者,制作一个边界框列表并循环这个列表会更有意义吗?

了解VAO并向VAO添加不同的arrays

我真的很困惑你做什么。 我可以做他们,但是我有这个问题。 假设你有几个方块,比如说1000个方块。 现在我可以为每个1000平方做一个VAO,然后做一些循环来渲染所有的方块。 我也可以使用着色器来移动正方形。 然而,是否有可能把所有1,000个方格放在一个VAO中。 问题是我要创建一个体素游戏。 所以我需要渲染约10000个立方体。 然而,即使我现在正在做200个格子,游戏也会滞后很多。 float points[] = { 0.0f, 0.0f, 0.0f, 0.3f, 0.0f, 0.0f, 0.3f, 0.3f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.3f, 0.0f, 0.3f, 0.3f, 0.0f }; float colours[] = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }; […]

我应该使用抽象类还是函数指针来实现组件通知?

我想创建一个基于组件的游戏引擎,其中包含完成这些工作的子系统,实体只是一个组件列表(加上位置和旋转,因为每个对象都有),数据。 另外,我希望子系统为实体创建组件(实体具有组件types列表,子系统创建它们)。 如果一个实体被添加到世界上,子系统必须被通知。 我认为最好的方式是观察者模式:我的场景管理员通知每个子系统。 这是我卡住的地方。 当场景管理器通知时,应该是一个带有句柄消息的函数指针或抽象系统类吗? 在第一种情况下,我怎样才能得到这个工作variables的参数? 这个抽象类的方法不是我最喜欢的,我觉得函数指针可能会更好。 考虑这种情况:我的位置组件将从位置系统编辑,所以我的系统或我的组件必须通知渲染系统。 鉴于我的上述要求,我该如何处理这些通知?

什么是logging分组协议的有效方法?

我正在和一些兴趣爱好项目的开发者合作,我们有很多不同的API。 什么是一些stream行的方法来创建潜在请求的文档,什么可以被期望返回? 有没有什么奇特的自动生成工具呢?

什么是更新物理帧速率的正确方法?

我在互联网上search,最终阅读了一篇建议文章, “修复你的Timestep!” 。 按照这篇文章,我提出了一个更新的方法,但是我仍然有问题。 每当我实例化更多的对象,在我的场景中,我的物理交互速度要慢得多。 我已经修复了其他子系统,他们在更新过程中浪费了周期,而且我已经跟踪了我的物理性能下降到这一点。 我认为我更新物理的方式是不对的,因为我为我的Box2D引擎使用了1.0 / 60.0的固定时间。 我在更新过程中犯的错误是什么? 什么是更新物理帧速率的正确方法? 这是我的代码: void Core::Update() { // Input this->cInput->Update(); // Physics this->cPhysics->Update(); // Keep frame rate static const double desiredTime = 1.0 / 60.0; static double currentTime = (double)(GetTickCount()); static double accumulator = 0.0; double newTime = (double)(GetTickCount()); double frameTime = newTime – currentTime; if(frameTime > […]