所以我试图使用 javafx (类似于Hearthstone)制作CCG类型的游戏,我想知道是否有一个类是非常糟糕的想法每张卡片,因为我做了一些研究,大多数粉丝制作的Hearthstone纸牌游戏都使用JSON来获取卡片对象。例如,如果游戏中只有4张名称为
的牌查克诺里斯
我有4个类,分别是名字。现在我虽然这是必要的,因为每张卡都有自己的行为,这意味着一张牌在召唤时可能会做一些事情,在这种情况下,我有一个被调用该行动的方法,而其他人可能有其他方法或根本没有。
现在你可以说,如果你在游戏中有100张牌,那么课程的数量也会变大(而且这只是卡片包,因为我使用的是MVC模型,如果没有我意识到,这个项目真的很大。)
其他一些信息:
此外,如果我没有为每张卡片上课,我如何实例化一张新的特定卡片以添加到该播放器的手中?是否有一个不同的解决方案#34;类丰富"问题,这实际上会影响游戏运行时的性能,甚至是jar文件中的空间吗?
如果有人可以回答我的问题或任何形式的帮助,我将非常感激。
答案 0 :(得分:1)
拥有数千个课程不会以任何明显的方式影响绩效。您甚至可以提前预编译它们或缓存它们。
也就是说,许多游戏引擎使用实体组件方法来表示游戏实体,并将效果保持为不同的功能。 通过这种方式,您可以结合使用单一继承无法实现的不同效果卡。
以下是描述该方法的链接。
https://en.wikipedia.org/wiki/Entity%E2%80%93component%E2%80%93system
你可以逐渐适应这一点。 例如,您的卡可能只是一种实体。
class Card {
int mana;
String name;
Effect[] effects;
Trigger[] triggers;
}
效果可能是作用于游戏区和当前卡片的代码片段。
interface Effect {
void affect(Playfield pf);
}
触发器可以是与卡相关的事件侦听器。 即当对手打牌时,可能会触发一个触发器。
等
答案 1 :(得分:0)
我不是这个领域的专家,但我认为虽然你的方法可行,但它可能会使可维护性和扩展性变得更加困难。
您可以尝试的另一种方法是将卡的特征存储在数据库(或某种属性文件)中。在这种情况下,您只需要一个公共Card
类,并从数据库加载其值。
class Card {
int id;
String name;
int cost;
int speed;
OnSummonEffect summonEffect;
}
interface OnSummonEffect { ... }
abstract class StatBoostEffect implements OnSummonEffect { ... }
class AttackBoostEffect extends StatBoostEffect { ... }
卡表
CardID Name Cost Speed SummonEffect
1 DragonMaster 5 10 com.foo.bar.AttackBoostEffect
2 Vulcan 3 12 com.foo.bar.SomeSummonEffect
虽然保存类名可能听起来不太优雅(并且它可能有其自身的副作用),但这种方法可以轻松添加新内容。
添加新的卡片类型只是向数据库表中添加一个新条目,并可能添加新的"效果"上课到项目。如果您决定将某些属性(或添加新属性)更改为卡,则只需在数据库表中添加/更改列,然后再添加/更改单个Card
类。如果您为每种卡类型创建了一个类,则必须更改基卡,然后更改每个卡类。