Questions tagged «c#»

C#是Microsoft与.NET平台一起创建的一种多范例,托管,强类型,垃圾回收的编程语言。

2
Microsoft XNA Platformer示例,是否正确实施了碰撞检测?
Microsoft提供的示例似乎(从我所看到的)碰撞检测将有一个小错误。当用户与不可通过的图块碰撞时,将计算相交的深度。深度值X和Y中较小的一个用于固定用户的位置,因此它不再与图块碰撞。但是,如果用户沿对角线行驶,这是否可能导致用户无法准确地到达角色首先与图块发生碰撞的位置? 我可能是错的,但这只是我的看法。 private void HandleCollisions() { // Get the player's bounding rectangle and find neighboring tiles. Rectangle bounds = BoundingRectangle; int leftTile = (int)Math.Floor((float)bounds.Left / Tile.Width); int rightTile = (int)Math.Ceiling(((float)bounds.Right / Tile.Width)) - 1; int topTile = (int)Math.Floor((float)bounds.Top / Tile.Height); int bottomTile = (int)Math.Ceiling(((float)bounds.Bottom / Tile.Height)) - 1; // Reset …

2
在基于组件的实体系统中处理脚本化和“本机”组件
我目前正在尝试实现一个基于组件的实体系统,该实体基本上只是一个ID和一些将一组组件捆绑在一起以形成游戏对象的辅助方法。其中的一些目标包括: 组件仅包含状态(例如位置,健康状况,弹药计数)=>逻辑进入“系统”,该系统处理这些组件及其状态(例如PhysicsSystem,RenderSystem等) 我想用纯C#和脚本(Lua)实现组件和系统。基本上,我希望能够直接在Lua中定义全新的组件和系统,而不必重新编译C#源代码。 现在,我正在寻找有关如何高效且一致地处理此问题的想法,因此,例如,无需使用其他语法来访问C#组件或Lua组件。 我当前的方法是使用常规的公共属性实现C#组件,这些属性可能装饰有一些属性,这些属性可以告诉编辑器默认值和内容。然后,我将得到一个C#类“ ScriptComponent”,该类仅在内部包装Lua表,该表由脚本创建并保存该特定组件类型的所有状态。我真的不希望从C#端访问该状态,因为我在编译时不知道可以使用哪些ScriptComponents和哪些属性。尽管如此,编辑器仍需要访问它,但是像下面这样的简单界面就足够了: public ScriptComponent : IComponent { public T GetProperty<T>(string propertyName) {..} public void SetProperty<T>(string propertyName, T value) {..} } 这将简单地访问Lua表并从Lua设置和检索那些属性,并且也可以轻松地将其包含在纯C#组件中(但随后可以通过反射或其他方式使用常规C#属性)。这只能在编辑器中使用,不能用常规的游戏代码使用,因此性能在这里并不重要。这将有必要生成或手写一些组件描述,以记录某些组件类型实际提供的属性,但这不是一个大问题,并且可以实现足够的自动化。 但是,如何从Lua端访问组件?如果我调用类似的东西,getComponentsFromEntity(ENTITY_ID)我可能只会获得一堆本地C#组件(包括“ ScriptComponent”)作为用户数据。从包装的Lua表访问值将导致我调用该GetProperty<T>(..)方法,而不是像其他C#组件那样直接访问属性。 也许编写一个getComponentsFromEntity()只能从Lua调用的特殊方法,该方法会将所有本机C#组件作为用户数据返回,但“ ScriptComponent”除外,它将返回包装后的表。但是会有其他与组件相关的方法,我真的不想复制所有这些方法,无论是从C#代码还是从Lua脚本调用。 最终目标将是处理所有类型的组件相同,而在本机组件和Lua组件之间(尤其是从Lua方面)不区分特殊情况的语法。例如,我希望能够编写如下的Lua脚本: entity = getEntity(1); nativeComponent = getComponent(entity, "SomeNativeComponent") scriptComponent = getComponent(entity, "SomeScriptComponent") nativeComponent.NativeProperty = 5 scriptComponent.ScriptedProperty = 3 该脚本不必关心它实际上获得了哪种组件,我想使用与C#端相同的方法来检索,添加或删除组件。 也许有一些将脚本与实体系统集成在一起的示例实现?

2
如何建立一个世界玩家库存系统?
我遇到了一个尝试在XNA内实施清单系统的问题(这并不重要,可以是任何平台),但是到目前为止。这是我要解决的问题: 我如何才能从世界上获得一件物品(想想当您杀死一个怪物时,它会掉落护甲)并将其放入玩家的库存中吗? 如果库存只是物品清单,从技术上讲,如何在没有上课的情况下将世代钢剑带入玩家的库存中? 我目前有一个项目结构,其中包含一个唯一的十六进制值,一个有多少项目的计数(用于可堆叠对象,如箭头)和一个用于在库存中进行渲染的纹理,以及一些其他不重要的属性(名称,说明等) 。 如果我必须修改现有的项目类以容纳世界位置以及碰撞检测(这不希望该项目掉落到地球上),那将是一个糟糕的设计。 感谢您的考虑!
11 xna  c#  2d 

5
空间散列和四叉树的2D空间分区替代方案
我一直在尝试在游戏中实现空间分区算法,但是空间散列和四叉树都不是我想要的。 我的级别大小不应该有限制(只有Int32限制)。我需要一个不需要“水平宽度”和“水平高度”的空间分区算法。 我有许多移动的物理对象。我需要算法足够快以支持500多个对象。 还有其他选择吗?

5
事件驱动系统中的嵌套输入
我正在使用具有事件和委托的基于事件的输入处理系统。一个例子: InputHander.AddEvent(Keys.LeftArrow, player.MoveLeft); //Very simplified code 但是,我开始怀疑如何处理“嵌套”输入。例如,在《半条命2》(或其他任何真正的Source游戏)中,您可以使用拾取物品E。拾取物品后,您不能使用射击Left Mouse,而是扔掉物体。您仍然可以跳下去Space。 (我是说嵌套输入是您按某个键的地方,可以更改的操作。不是菜单。) 这三种情况是: 能够像以前一样做同样的动作(例如跳跃) 无法执行相同的操作(例如射击) 完全执行其他操作(例如在NetHack中,按开门键表示您不移动,但选择打开门的方向) 我最初的想法是在收到输入后才进行更改: Register input 'A' to function 'Activate Secret Cloak Mode' In 'Secret Cloak Mode' function: Unregister input 'Fire' Unregister input 'Sprint' ... Register input 'Uncloak' ... 这会遭受大量的耦合,重复的代码和其他不良的设计标志。 我猜另一个选择是维护某种输入状态系统-也许是寄存器函数的另一个委托将大量的寄存器/注销重构到更干净的位置(在输入系统上具有某种堆栈)或可能是什么数组保留,不保留。 我确定这里有人一定遇到了这个问题。您如何解决的? tl; dr如何处理事件系统中另一个特定输入之后收到的特定输入?


1
如何在SDL.NET/Tao.SDL中获得8位表面的调色板?
我希望在可能的情况下或(更可能是)使用Tao.SDL在SDL.NET中获得8位表面的调色板。这是因为我想直接与调色板进行调色板交换,而不是像将32位表面那样将表面放在一起以替换颜色来替换颜色。 我已经获得了SDL_Surface和SDL_PixelFormat,但是当我以相同的方式获取调色板时,却得到了System.ExecutionEngineException: private Tao.Sdl.Sdl.SDL_Palette GetPalette(Surface surf) { // Get surface. Tao.Sdl.Sdl.SDL_Surface sdlSurface = (Tao.Sdl.Sdl.SDL_Surface)System.Runtime.InteropServices.Marshal.PtrToStructure(surf.Handle, typeof(Tao.Sdl.Sdl.SDL_Surface)); // Get pixel format. Tao.Sdl.Sdl.SDL_PixelFormat pixelFormat = (Tao.Sdl.Sdl.SDL_PixelFormat)System.Runtime.InteropServices.Marshal.PtrToStructure(sdlSurface.format, typeof(Tao.Sdl.Sdl.SDL_PixelFormat)); // Execution exception here. Tao.Sdl.Sdl.SDL_Palette palette = (Tao.Sdl.Sdl.SDL_Palette)System.Runtime.InteropServices.Marshal.PtrToStructure(pixelFormat.palette, typeof(Tao.Sdl.Sdl.SDL_Palette)); return palette; } 当我使用不安全的代码获取调色板时,出现了编译时错误:“无法获取其地址,获取其大小或声明一个指向托管类型的指针('Tao.Sdl.Sdl.SDL_Palette')”。 我获取调色板的不安全代码是这样的: unsafe { Tao.Sdl.Sdl.SDL_Palette* pal = (Tao.Sdl.Sdl.SDL_Palette*)pixelFormat.palette; } 根据我的阅读,在这种情况下,托管类型是结构内部具有某种引用作为字段的情况。SDL_Palette结构碰巧有一个SDL_Color的数组,所以我假设这是引起问题的引用类型。但是我仍然不确定如何解决该问题以获得底层调色板。 因此,如果有人知道如何从8位表面获取调色板,无论是通过安全代码还是不安全代码,都将不胜感激。
11 c#  image  palette 

5
XNA框架是否适合服务器端编程?
我希望创建一个基于文本的MUD,因此XNA框架的许多元素似乎都适合我的需求。尤其是诸如一般的游戏循环,网络等之类的东西。看起来XNA与具有UI和音频的交互式环境紧密耦合,因此我不确定这是否是正确的方法。 自己重新创建这些类型的方面,尝试将XNA框架适应我的需要会更容易,还是针对此类工作有更好的框架?
11 c#  xna 

3
将Vector3转换为Vector2的最有效方法
将Vector3转换为Vector2的最有效,最快的方法是什么? 铸件: Vector2 vector2 = (Vector2)vector3; 初始化一个新的Vector2: Vector2 vector2 = new Vector2(vector3.x, vector3.y); 还是我不知道另一种方法?
11 unity  c#  performance 

1
在Unity中更改对象的精灵
我想在hero(object)的脚本代码中添加更改其sprite的可能性。 因此,播放器按下了空格键,该精灵变成了已经添加到项目中的另一个精灵。 您可以提供一个示例代码来做到这一点吗?
11 c#  2d  unity  sprites 

3
等距碰撞检测
我在尝试检测两个等距图块的冲突时遇到了一些问题。 我尝试在图块上的每个点之间绘制线,然后检查线截距,但是这行不通(可能是由于公式错误) 经过一段时间的研究,我相信我正在考虑很多,而且必须有一种更简单的方法。 我不是在寻找代码,只是一些建议以最佳方式实现重叠检测

4
如何有效检查点是否在旋转的矩形内?
我一方面要出于优化的目的,另一方面出于学习的目的,我敢问:如何使用C#或C ++ 最有效地检查2D点P是否在2D旋转的矩形内XYZW? 当前,我正在做的是使用《实时碰撞检测》一书中的“三角形中的点”算法,并运行两次(对于组成矩形的两个三角形,例如XYZ和XZW): bool PointInTriangle(Vector2 A, Vector2 B, Vector2 C, Vector2 P) { // Compute vectors Vector2 v0 = C - A; Vector2 v1 = B - A; Vector2 v2 = P - A; // Compute dot products float dot00 = Vector2.Dot(v0, v0); float dot01 = Vector2.Dot(v0, v1); float …

2
我可以使用哪种转向行为或逻辑来使手机包围其他设备?
我在游戏中使用寻路功能,将暴徒引向其他玩家(以追赶他们)。这样可以使它们超越播放器,但我希望它们在到达目的地之前稍稍停下来(因此,选择倒数第二个节点效果很好)。 但是,当多个暴徒在追赶手机时,它们有时会“堆叠在彼此之上”。避免这种情况的最佳方法是什么?我不想将这些小怪当作不透明和被遮挡的对象(因为它们不是,您可以穿过它们),但我希望这些小怪具有某种结构感。 例: 想象一下,每条蛇都将自己引向我,并且应该包围“ Setsuna”。请注意,两条蛇都选择了叉我吗?这不是严格的要求;即使稍微偏移也可以。但是他们应该“包围” Setsuna。

4
有没有允许我在Linux上用C#编写游戏的框架?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为Game Development Stack Exchange 的主题。 6年前关闭。 我正在寻找类似XNA的替代产品-我不在乎它是2D还是3D引擎。这不是因为我不喜欢Windows或反Microsoft。这是因为我喜欢运行Linux,并且完全在Linux中运行代码(对于C#,我显然使用Mono),并且根本没有任何硬件可以实际支持XNA编程,仅因为我的显卡已经使用了6年。我也没有用于DirectX 10的Windows 7 / Vista CD。 因此,对于游戏开发,我有点陷入困境。但是,我非常喜欢C#,因此不愿意将其作为一种语言删除。 有什么我可以做的吗?
10 xna  c# 

3
为什么要在PBBG上使用C#上的PHP?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Game Development Stack Exchange 的主题。 2年前关闭。 我是C#开发人员,想启动一个业余项目,构建一个基于浏览器的持久性游戏(PBBG)。我使用C#,MSSQL和Angular,并认为我也将这些技术用于我的业余项目。 当我开始搜索“做与不做”和“技巧”时,我意识到很多项目都使用PHP,而实际上我并没有发现任何使用C#的PBBG,我觉得这很奇怪。似乎我正在使用的堆栈(C#,MSSQL,Angular)可能适合PBBG。 我能想到的不使用C#的唯一原因是Visual Studio的高昂价格以及它不是开源的事实。 还有其他原因吗,或者我只是不好找使用C#的项目?还是可能我只是在工作上表现不好而没有意识到此堆栈对PBBG不利?

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.