它最初是Reddit Gamemaker Game Jam的一个想法。它是第一次尝试游戏开发,我甚至不知道从哪里开始,何况如何将其集成到Reddit中。最终,我错过了截止日期,但我还是继续下去,因为这个想法太有趣了。
免责声明,我是一个新毕业的cs学生,正骑着马。
注意:游戏结构在文章末尾,如果您愿意跳过,可以直接看。
我有两个函数来构建牌堆和答案牌,一个空的牌对象以及点击事件和一个变量来确定是否是答案牌还是牌堆牌。函数只是将一个空的牌对象作为输入,根据哪个字母来构建sprite名称,例如(“spr_”+a),然后交换每次使用正确的sprite。
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函数总是产生错误,所以我创建了一个map并将sprite名称作为值分配给字母键,这之后我才知道是因为我没有引用、分配或使用它们的游戏。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设计师,因为我的颜色调配和设计选择是可怕的。虽然他交付了优质的设计,但设计远超出了我的能力范围,或者也许它只是感觉不到有趣地在Figma上设计和期望最佳结果。
按钮只是两个不同颜色的矩形,叠加在一起,分别写着字母和点数。最初,我只是制作了一个空的按钮,没有字母和点数写在上面(感谢我的懒惰),然后在运行时根据sprite位置来构建它们。但GameMaker字体显示不清,扭曲到无法阅读的地步。我甚至没有尝试改变牌动态颜色。所以我不得不回去重新设计所有的sprite,包括字母、颜色和字体,每个字母都有一个,这我绝对讨厌。
现在我的多巴胺水平已经上升了,游戏开始看起来很棒了,迭代次数达到345个。
然后我遇到了一个问题,即运行JavaScript脚本,因为我不知道需要使用JS桥来运行它们。这个问题我是在YouTube上找到的视频后才解决的。
此时,我已经到了我设计中最令人畏惧的部分:“生命条”。所以经过一番努力,我决定使用GameMaker的默认生命条,它看起来很好,融入游戏风格。
对于词库,我想我在Gutenberg上找到了一个文件,经过筛选后转换为JSON,才能使其可用。现在我知道我应该实现一个版本控制系统,以便知道哪个文件版本在每次游戏加载时使用以保证向后兼容性。
我的代码可以总是变得更加灵活。
游戏本身由三个房间组成:一个用于实际游戏,另外两个用于游戏结束显示。叠加层无法用于游戏结束分数显示,我不想费劲了,所以我选择了一个简单的方法,即创建一个新房间,它会使我的代码更好,工作量也不会太大。
这是我的游戏流程概要:
游戏从一个空的控制器对象开始,加载词库,并检查玩家是否是挑战者还是创造者。如果是创造者,则启动新一轮,并加载一个随机词,如果是挑战者,则加载Redis数据。
我们还会记录每个字母的数量,包括同义词和反义词,以便知道如何构建牌堆。这样做是为了避免牌堆中出现重复的字母,占用了宝贵的空间。因此,我决定限制答案牌的字母数量为20个。
为什么是20个字母呢?这个问题很简单,朋友。这不是一个拼写比赛,另外还有关于字母分布和频率在单词中的问题。
一旦开始新一轮,牌堆和答案牌的脚本都会运行,构建牌堆和响应点击事件。然后,当计时器耗尽或玩家点击提交按钮时,结束一轮的脚本会运行,计算玩家的分数并保存答案。
它会继续下去,直到最后一轮或玩家的生命条降至零时,游戏结束脚本会运行,保存玩家的分数,并确定是否是创造者还是挑战者。如果是创造者,则询问玩家是否要发布他们的游戏。如果是挑战者,则确定玩家是否赢了、输了还是打平,并显示相应的sprite和玩家最好的答案。
回想起来,现在看起来很简单,但最初我觉得它是一个巨大的任务。
现在,我已经迭代了582次(哈哈,一个缺失的逗号和分号就能做到这一点)。
我给它起了一个名字“Battle Lexicon”(哈哈,这是最好的名字我能想到的,它也是一场战斗来做)。它是一个5轮的词语战斗游戏,使用了scrabble风格的点数系统,玩家使用同义词攻击,使用反义词来治疗。
另外,我可能会发布源码,欢迎大家的反馈。
评论 (0)