它最初是一款Reddit Gamemaker Game Jam的想法。第一次尝试开发游戏,甚至不知道从哪里开始,何况如何将其整合到Reddit中。我最终错过了截止日期,但仍然继续前进,因为这个想法太有趣了。

免责声明,我是刚毕业的计算机科学专业的学生。

注意:游戏结构在文章末尾,所以如果您想跳过可以直接看?

我有两个函数来构建牌堆的图块和答案图块,以及一个空的图块对象,具有用于图块和点击事件的变量。函数只是将一个空的图块对象作为参数,并根据字母生成正确的图像名称,例如 ("spr_" +a),然后交换每个字母的正确图像。

var _t = instance_create_layer(500, 500, "Instances", obj_tile);

t.letter = "a";

t.source = "deck";

t.sprite_index = asset_get_index("spr_a");

是的,我很懒。

asset_get_index 函数总是会产生错误,所以我创建了一个字典,并将图像名称作为值分配给字母键,这些字母键后来我才知道是因为我没有引用、分配或使用它们,所以GameMaker认为我没有使用它们。

global.spr_map = {

a: spr_a, b: spr_b, c: spr_c, d: spr_d, e: spr_e,

f: spr_f, g: spr_g, h: spr_h, i: spr_i, j: spr_j,

k: spr_k, l: spr_l, m: spr_m, n: spr_n, o: spr_o,

p: spr_p, q: spr_q, r: spr_r, s: spr_s, t: spr_t,

u: spr_u, v: spr_v, w: spr_w, x: spr_x, y: spr_y,

z: spr_z

};

var _t = instance_create_layer(tx, ty, "TilesDeck", obj_tile);

t.sprite_index = global.spr_map[$ string_lower(tiles_unique[i])];

t.source = "deck";

t.letter = tiles_unique[i];

t.li = ord(string_lower(tiles_unique[i])) - ord("a");

此外,我遇到了一个问题,即清除答案图块和牌堆图块,因为我不想在新一轮中显示旧的图块,并且会出现内存问题。所以我选择了简单的方法,将它们都放在一个新图层上,只需销毁一次图层即可。

然后我去了...

鼓点...

"Dafont"。

我花了几个小时或几天时间寻找合适的字体,因为我想要一个具有中世纪风格、斩首和现代风格的字体。最后,我不得不在Fiverr上支付给一个设计师来设计UI,因为我的颜色方案和设计选择都是可怕的。虽然他交付了优秀的质量,但设计却超出了我的范围,或许它只是不适合我设计的风格。

按钮是两个颜色不同的矩形叠加在一起,附有字母和分数。最初,我只是制作了一个空的按钮,没有字母和分数写在上面,并且通过在图像位置相对的方式来在运行时生成它们。但是GameMaker的字体显示非常不规则,扭曲到不可读的程度。所以我不得不回去重新设计所有的图像,附上字母、颜色和字体,这真的是我讨厌的事情。

现在我的多巴胺水平很高,因为它开始看起来很棒了,经过了345个迭代。

然后我遇到了一个问题,即在GML中运行JavaScript,因为我不知道需要使用JS桥来运行它们。通过在YouTube上浏览视频后,我才得知这一点。

此时,我正处于我设计中的最令人恐惧的部分:"健康条"。所以经过一番周折,我决定使用GameMaker的默认健康条,它看起来很不错,并且与游戏风格很好融合。

对于词汇表,我想我在Gutenberg上找到了一个文件,并且通过过滤和转换为JSON来使其可用。现在我知道我应该实现一个版本控制系统来知道哪个文件版本应该用于每次游戏启动以便于向后兼容。

我的代码总是可以改进的。

整个游戏由三个房间组成:一个用于游戏本身和两个用于游戏结束显示。覆盖层和图层没有效果,因为我不想在游戏结束时显示分数,所以我选择了另一个房间来使我的代码更好看,并且它很容易实现。

这是我的游戏流程:

游戏从一个空的控制器对象开始,加载词汇表,并且检查玩家是挑战者还是创造者。然后它进入开始一轮,并且如果是创造者,则加载一个随机词汇,但如果是挑战者,则加载创建者的Redis数据。

我们还记录了每个字母的出现次数(包括同义词和反义词)来知道如何构建牌堆图块。这样做是为了避免在牌堆图块中出现相同的字母,以节省空间。因此,我限制了答案图块的字母数量为20个。

为什么是20个字母呢?朋友, 这不是一个拼写比赛,而且也与字母在单词中的分布或频率有关。

开始一轮后,牌堆图块脚本和答案图块脚本都运行,以构建图块并响应点击事件。

然后,计时器结束或玩家点击提交后,结束一轮脚本运行,计算玩家的得分并保存答案。

这样继续,直到最后一轮或玩家的健康条降至零,游戏结束脚本运行,保存分数并记录是否是创造者,或者是挑战者,根据情况显示不同的图像并显示玩家的最佳表现。

回顾起来,它看起来很简单,但最初它对我来说是一个巨大的挑战。

现在,我已经迭代了582次(哈哈,一个缺失的逗号和分号可以做多少事)。

我把它命名为“Battle Lexicon”(哈哈,这是我能想到的最好的名字,而且它的制作过程也很辛苦)。它是一款5轮的词汇战游戏,使用了扫雷式的得分系统,玩家使用同义词攻击,使用反义词治疗。

另外,我可能会发布源代码,欢迎您的反馈,尊敬的Reddit用户。