Articles of 重构

如何在纸牌游戏中管理(放置)卡片和套牌的实例?

这个问题听起来非常具体,但是我的意思是,一般来说,当涉及到一个卡片游戏(一个用于玩家1,一个用于玩家2,…)时,你如何管理类似卡片游戏的东西,以及将卡片集中在Card ? 具体来说,在我的情况下 – 使用Java – 我得到了一些静态数据卡(图像,值显示在其上),以及一些数据,这取决于谁拥有卡在他们的甲板上,或者在板上的位置,每种types的卡。 现在我得到了这些卡的例子,像他们的价值观 Card DOG = new Card(image, a, b, …); Card SHEEP = new Card(image, a, b, …); Card PIG = new Card(image, a, b, …); 静态地在Card 。 也许这已经是错误的做法呢? 我现在如何管理套牌和东西,因为我需要在这些图纸之后的具体实例,但是适合于它们的使用,无论是在甲板上,还是在手边或船上,… 我得到的第一个想法是有像Card.createInstance东西,但是这是做了什么? 我或多或less地要求这样做的最佳做法。

Unity在RPG游戏中存储许多物品

我想问一下存储数据的最佳方法,这些数据表示关于指定对象的信息。 在发生问题之前,我想找一个更好的方式在我的RPG游戏中存储某个地方的物品,我有一个很丑的阶级,那就是定义装甲,武器等。 [System.Serializable] public class Item { public string name; public int cost; public float weaponRange; public string imagePath; //starting from Resources public ItemType itemType; public enum ItemType { Item, Armor, Weapon }; public enum WeaponType { None, ShortSecant, LongSecant, Blunt, Prickly, Bow }; public enum ArmorType { None, Cuirass, Helmet, Boots }; public WeaponType […]

我怎样才能重构枚举,使其仍然可以在检查员?

我正在尝试使用枚举,以便在检查器中可用。 此代码工作: public ArmorTypeEnum ArmorType; public enum ArmorTypeEnum { Light, Medium, Heavy }; 如何可以重构成一个单一的线? 如何使ArmorTypeEnum专用,同时保持ArmorType公共?

派生类中的inheritance属性仅引用基类

[背景]我正在Unity开发一款游戏,并想成为一名游戏经理。 像许多例子一样,它使用了Singletrondevise模式。 但是我有几个其他的经理,都使用了Singletron模式,所以我决定做一个Singletron基类,让所有的管理者从中派生出来。 当试图在Game Manager派生类中的一个方法中访问在Base Class中声明的Instance属性时,Instance属性引用Singletron基类,这是预期的。 但这不是我需要的行为。 我试图寻找替代品,但每次我find一个可能的解决scheme,我必须在派生类中声明成员variables/属性,并将不需要一个单一的基类。 我也寻找了一些通用的替代方法(Singletron <T>),但是如何在不需要另一个脚本的情况下使用这些替代方法并不清楚,因为Game Manager应该是管理游戏的对象。 我可以使用类似于根游戏对象的东西来创建管理者是实例,但感觉像是一个丑陋而不雅的解决scheme。 管理人员都是编码的,这个重构可以改善代码的维护。 [来自Singletron基类的代码] public abstract class Singletron : MonoBehaviour { public static Singletron Instance { get; protected set; } protected virtual void Awake () { if (Instance == null) { Instance = this; } else { Destroy (gameObject); } DontDestroyOnLoad (gameObject); } } [Game […]

处理使用交互中不同的库存项目

嘿在那里我的同事程序员。 寻找一个潜在的臭味代码问题的一点点input(我正准备在Code Review SE上发布这个代码,让我知道如果这是更合适的地方)。 在查看一些关于设置一个像库存和使用基于组件的系统的答案之后,我想出了一个创建项目的格式,这里有几个例子。 Entity potion = new Entity("Potion", new Item(100,50), new Healing(75,0)); Entity elixer = new Entity("Elixer", new Item(50, 25), new TempStatIncrease(0,5,…)); 这里是涉及的类。 Entity Class IComponent[] components string name IComponent Interface ComponentType componentType Item Class : IComponent int purchasePrice int resaleValue TempStatIncrease Class : IComponent int strength; int agility; … Healing Class : […]

什么时候修改项目是一个好的方面?

我目前正在进行一个项目。 前一段时间,我意识到我已经完成了自己的目标,但是我添加的代码和原型越多,我越觉得没有回头。 例如,我所实施的一些数据结构,方法和架构部分可以变得更高效且可重用。 但是这需要几乎从头开始重构。 所以我想知道,一旦我意识到这个项目存在缺陷或者是我应该完成所有的原型,然后创建一个最终的,干净的版本,重新编译一个项目是不是一个好的决定? 我觉得我是一个独立的开发者。 提前致谢。

用多边形处理二维碰撞检测,而不是两个正方形/多边形,会更有效率吗?

我正在研发一款2D游戏引擎,我正试图尽可能提高碰撞检测的效率。 我注意到的一件事是我有一个矩形碰撞对撞机,一个形状(多边形)对撞机和一个圆形对撞机。 它会更有效率(无论是开发时间或运行时间)只有一个形状碰撞器,而不是拥有这一切和其他一切? 我觉得会在后端优化我的代码,但在运行时会影响我的游戏呢? 我应该关心这个,因为3D游戏一般有几万个多边形?

我怎样才能将“攻击冷却时间”重构为“攻击速度”?

我正在构建一个游戏,玩家的角色可以攻击坏人,反之亦然。 我用“攻击冷却”的概念来构建这个概念,因为我不希望单位能够在每一个单一的框架上互相攻击。 我想要在这两次攻击之间有一些延迟。 这大致是如何工作的: if unit.ticksUntilAttack <= 0 unit.attack(target) unit.ticksUntilAttack = unit.attackCooldown unit.ticksUntilAttack = unit.ticksUntilAttack – 1 我也有一个页面,显示角色的属性,并将其列为“Attack Cooldown”。 我向我的朋友展示,他说:“你为什么不把它改名为'Attack Speed'? 我解释说,这不是你攻击的速度,因为“越小越好”。 我们都同意,“攻击速度”是一个更为标准的方式来expression这个概念,我应该改变他的建议。 对我来说,问题是“攻击冷却”是一个更直观的方式来编写解决scheme。 我想知道是否有一些“技巧”来重构当前的代码。 我在想这样的事情: if unit.attackSpeedAccumulator >= SUM_NEEDED_TO_ATTACK //a constant that's the same for every unit unit.attack(target) unit.attackSpeedAccumulator = 0 unit.attackSpeedAccumulator = unit.attackSpeedAccumulator + unit.attackSpeed 有没有更聪明的方法来做到这一点?

*调用* =(或* =调用*)比写单独的函数(用于math库)慢?

我有一些向量类的算术函数看起来像这样: template<typename T, typename U> auto operator*(const Vector3<T>& lhs, const Vector3<U>& rhs) { return Vector3<decltype(lhs.x*rhs.x)>( lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z ); } template<typename T, typename U> Vector3<T>& operator*=(Vector3<T>& lhs, const Vector3<U>& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; lhs.z *= rhs.z; return lhs; } 我想做一些清理,以删除重复的代码。 基本上,我想转换所有的operator*函数来调用operator*=函数: template<typename T, typename U> […]

什么时候考虑performance是最好的时机?

我来自软件开发背景。 在软件开发周期中,我们只关注function和工作产品。 在开发的最后,我们开始优化代码并提高性能。 现在的问题是,我们是否需要考虑游戏开发中每一行代码的性能? 这样做,我觉得我们错过了devise模式和干净的代码。 我想知道游戏开发行业是否有最佳实践方法?