各位玩家,我是雅科夫,游戏开发者。你们可能已经玩过我的前项目:Dom RusalokLoretta,和Anoxia Station。目前,我正在开发一个新游戲----Bonereader。最近,我一直在思考游戏平衡问题,以便分享我的经验,反思开发过程以及提供一些对其他开发者的有价值的建议。

[Bonereader是一个使用扔骰子机制的扑克式游戏。在被电椅执行死刑并进入黄泉后殿(Carlos CASTANEDA和Cormac McCarthy的小說中受影響的概念),您需要用扑克或骰子与多种灵魂共演一番。这可能让您获得另一次生命重启的机会。

核心机制是骨骼抢先赛(yatzy)。我与兄弟朋友儿时常常进行过该游戏的版本。在完成Anoxia Station的工作时,我也被Baltaro吸引了过去,并迫切需要创作一个新的概念。这就是我回想起抢先赛的理由。

[这是我和兄弟在玩时所使用的筹码图纸。]

在说我之前,我是一名演医,缺乏系统的编程知识,只能编程一门语言——GML。如果我在GitHub上发现了一个干净利落的解决方案,我会 “借用”并重写它。现在,我确信无法遇到编码任务,而且如果遇到,我的AI助手Claude也能帮到我。

唯一不擅长的编程是网络编程——因为我只需要。除了解决这问题之外,我的最大限制是无法使用3D——并且我的想象力也受到了一些限制。

内核

我这个项目有三个核心对象:obj_diceobj_combinationobj_controller(控制全局游戏状态,我可以轻松地在玩家和电脑中进行交互。

[[如上图,您可以选择多个启动筹码组合,每个组合包含一些筹码和一堆骰子。您的目标是在有限的游戏进度中达到规定的目标分数。似乎简单?事实并非如此...)(https://preview.redd.it/po4naa21dczg1.png?width=2557&format=png&auto=webp&s=01c37a15b61bc4d48cf6969457262f574ddc87b3]
黄泉后殿中,您可能会遇见许多孤魂野鬼,它们可能已经失去了人形。

在黄泉之湖中,每个玩家都获得四回合,最后一回合则是由随机产生的 “omen ”(符号化的BUG)所决定的。

玩家每次掷骰子时,还会有随机的事件添加到筹码组合中,它们也可能是有用的、混乱的、或不完全确定的事件。

代码

将筹码的有效分数计算为:

function _check_card_effect_to_final_score(add_to_score_all, card_level) {
var final_score = add_to_score_all;
var temp_mult = 1;
var temp_bonus = 0;
var basedice = Math.floor(global.dice_slot1 + global.dice_slot2 + global.dice_slot3 + global.dice_slot4 + global.dice_slot5 + global.dice_slot6);
var base_score = basedice;
var item_bonus_score = global.item_bonus_score;
var item_bonus_mult = global.item_bonus_mult;

在计算了基本积分后,我们需要考虑其中的诅咒(如果有的话)。

if (ENEMY_EFFECT_CARD_HAND_CURSE) {
final_score = Math.max(0, final_score - (100 * eff_power));
}

我们还需要考虑永久增益(奖牌)。

if (global.GET_BONUS_TATTOO_ODD_BONUS) {
var countodd = 0;
var dice = [global.dice_slot1, global.dice_slot2, global.dice_slot3, global.dice_slot4, global.dice_slot5];
for (var i = 0; i < 5; i++) {
if (dice[i] % 2 == 1) {
countodd += tattoo_odd_bonus;
}}
temp_mult += countodd;
}

if (global.GET_BONUS_TATTOO_EVEN_BONUS) {
var counteven = 0;
var dice = [global.dice_slot1, global.dice_slot2, global.dice_slot3, global.dice_slot4, global.dice_slot5];
for (var i = 0; i < 5; i++) {
if (dice[i] != 0 && dice[i] % 2 == 0) {
counteven += tattoo_even_bonus;
}}
temp_mult += counteven;
}

// 终极计算
var result = (final_score + temp_bonus) * temp_mult;

简而言之,我们计算骰子值之和,根据筹码级别加上乘数。

在计算过程中,我们也会考虑到角色和永久增益。

https://preview.redd.it/xgpwpzcjeczg1.png?width=2559&format=png&auto=webp&s=3de0ebdf5db4dfd40ebe4b1284a76da2de3d2233

角色和永久增益也会在计算筹码加成时使用相同的规则:

if (sprite_index == spr_item_golden_tooth) {
audio_play_sound(snd_item_golden_tooth, 0, false, global.SOUNDS_VOLUME_MAX)
add_bonus_per_dice_value(6, 10);
ACTIVATED = true;
}

平衡

由于我只能一个人开发,因此没有用来维护游戏平衡的电子表格(除了 localize 的电子表格之外)和文档。平衡值,我都存储在_Balance的脚本文件中(GameMaker 之前称为脚本)。在这一点上,我会将所有要计算的重要值都记录下来:筹码的基础值、购买/出售价格和其他各方面。

游戲具有两个不同的模式:故事模式和roguelike模式。故事模式经过了更多考虑,从而更加平衡。但是,roguelike模式依赖于随机事件,而故事模式则是有序的。

玩家的级别是从1到6的序列。每个级别有一个最小分数,当玩家达到该分数时,级别提升,每个级别都有一个固定的分数,但也有一些随机的分数因素。

这个方式对于玩家来说,是一种很有挑战性的游戏,因为只有在某些具体条件下,玩家才能够赢得最后胜利。

使用GM Studio的几强大建议

使用GM Studio开发游戏是一个很好的选择,因为GM Studio自身的功能和性能比较好。要获得最佳的体验,需要进行一些配置。这些设置将使得你更加高效的编程以及开发游戲。

在使用GM Studio开发游戏时,最需要注意的是如何优化游戲的性能。要高效的开发游戏,推荐采用以下方式:

  1. 确保 GM Studio 的版本是最新的。

  2. 使用GM Studio的性能优化选项。

  3. 缩小场景的大小。

  4. 使用GM Studio 中自带的贴图和效果来节省系统资源。

  5. 使用贴图尺寸相等的精灵组成,可以减少渲染负载。

关于GM Studio的选项和功能。可以通过在GM Studio的配置中查看和设置的相关选项,来获取优质的性能,减少内存消耗。

最后,注意:在选项的配置过程中,一定要考虑到您的系统配置以及运行的环境。

此外,在 GM Studio 的编辑器中使用键盘快捷键可以大大提高编程效率。例如,可以使用 Ctrl + Shift + 空格 快捷键来快速完成变量名、对象名和函数名的自动补全。

此外。GM Studio 还提供了 GameMaker Language (GML) 语言的支持,可以让您编写自定义的脚本来实现各种逻辑和功能。GML 语言非常方便和易于理解,可以让您快速编写出功能丰富的脚本。

总的来说,GM Studio 是一个非常强大的工具,可以大大提高您的编程效率和开发游戏的效率。

在使用GM Studio开发游戲时,这里有一些常用的GM Studio选项和快捷键: