Construct 3:制作入门小游戏

Construct 3:制作入门小游戏

什么是Construct 3

Construct 3是面向非专业人士、少儿可视化 游戏编程工具和技术,本质上是轻量级游戏引擎,通过表格式编程实现游戏逻辑。

为什么选择Construct 3

Construct 3完全在浏览器上运行,十分适合轻量级小游戏的开发,加上事件表(可视化编程)带来的编程效率大幅提高,使其适合作为游戏制作入门的练手引擎。

Construct 3官方网址

Construct 3科技树(目录):

  1. 前置科技(新手教程)
  2. 一级科技(2048)
  3. 二级科技(?)

前置科技:新手教程

首先上来跟着教程走,创建项目、双击添加对象实例(划重点:添加的实际上有两个东西,分别是对象和实例,这个后面会探讨),在事件表里添加事件编写各种情况下的逻辑。

新手教程结束后不要急着马上上手,你可以留在当前项目下继续修修改改,一方面熟悉制作流程,另一方面也能逐步培养写代码的兴趣(

比如这是我魔改后的新手项目:

部分事件表

场景布置

实机画面

这里我添加了怪物血量、怪物攻击力、人物血量以及简略显示和人物攻击力等。 这里是一些特性:

  • 每秒钟,系统会判断怪物数量是否到达上限,若未到达上限,怪物会在玩家一定范围外随机位置处生成。
  • 怪物有血条以及攻击力,攻击力又分为首次攻击伤害以及持续伤害。
  • 怪物拥有索敌范围,玩家进入该范围内时怪物会直接奔玩家而来。
  • 玩家击杀怪物后,一方面会掉落增强玩家攻击力的道具,另一方面还会提高怪物的索敌范围、移动速度、攻击力以及怪物数量上限。
  • 系统会根据玩家的累计击杀数以及怪物的强度动态调整分数的积累速度。

好了,想必到这里你已经迫不及待了吧,我知道你很急,但你先别急,这里还有补充的知识点:

  1. 在每个事件 的右下角可以选择添加子事件 以及注释
  1. 子事件 的添加中,可以声明局部变量

一级科技:如何使用Construct 3构建年轻人的第一款2048

为了养成良好的习惯,任何事情在开始前都需要一份规划。越早在规划上确定事项,越能规避后期的风险。因此首先确定2048的底层游戏逻辑:

  • 玩家操控盘子中的数字块,相同的数字会合并得到更大的数字
  • 若玩家最终合并出2048的数字块,游戏胜利
  • 若玩家最终耗尽了空间,且未合并出2048的数字块,游戏失败

由于是轻量级小游戏,因此小游戏核心逻辑十分简单:

  • 读取键盘输入确定所有数字块的移动方向
  • 遍历每个数字块并移动,直到每个数字块不能再移动为止
  • 若数字块能与移动方向上的紧邻的数字块合并,则在移动方向上更远的数字块上生成新的合并后的数字块,并销毁原来的两个数字块
  • 若所有数字块均无法移动且无法合并则结束本轮移动,进行当前游戏状态(输/继续/赢)的判定

为此我们先准备好所有场景的美术素材:

  • 1 ~ 2048数字块共12张图片,分辨率72×72像素
  • 游戏背景一张(由Stable Diffusion生成)

是不是有一种毛骨悚然的感觉?有就对了!什么?你问为什么这么毛骨悚然的地方为什么要安排一个御姐?当然是我也不知道啦)

现在可以切换至事件表编写游戏逻辑: 很多新手在这里时都会感到茫然无措,即使是明确了游戏逻辑也是如此。实际上不要忘记了:这是可视化编程! 可视化编程与代码式编程不同的地方在于:可以很轻易地将事件逻辑拖动到不同位置,因此不妨先将立马能想到的、必须包含的逻辑先列出来:

  • 处理键盘按下
  • 数字块的生成
  • 数字块的移动
  • 判断是否胜利

因此我们将上述逻辑对应的事件依次罗列出来:

然后我们按照游戏逻辑的时间顺序展开:生成新数字块->移动数字块->判断是否胜利(这顺序不是必须的,但必须是能让你的思路保持清晰的)

随机生成数字块

考虑一个数字块的生成条件:一块空的、未被占用的位置,用0表示未占用的格子,1表示已占用的格子,然后用一个4×4的矩阵来表示:

0 1 0 0
0 0 0 0
1 0 1 1
0 0 1 1

在不失一般性的情况下,我们希望新的数字块可以在任何空位置上生成。为此我们可以用一个全局变量blockStates 记录所有格子的状态,再使用局部变量emptyCount 统计场上剩余的空格数量,并生成一个在[1, emptyCount]范围内的随机数expectPos ,然后再声明一个局部变量curCount 记录已经遇到过的空格数量,按照先列后行的顺序遍历整张表,每遇到一个空格就令curCount+1即可:

请注意:此处使用了一个全局的字符串变量用于储存blockState,并使用一个i从0循环到15,依次取出blockState的第i个字符进行判断,其实就是模拟数组的操作 (坐标为(x, y)的格子对应blockStates的第x + y×4个字符,若你已经有了编程基础,相信这部分对你不是很难,若没有相关基础,则可以想象一个依次将表格的下一行添加到本行的末尾的过程,最终就能将一张二维表"压缩"成一张一维表)。

编程时要养成写好一个模块就测试的好习惯,这里我暂时添加了一个通过空格添加新的数字块的功能用于测试,然后运行,看看能不能成功填满所有空位:

数字块的移动

效果不错,接着来捋一捋移动数字块的逻辑:

  • 读取键盘输入,确定移动方向。
  • 将矩阵按照移动方向分为4条道。
  • 确定当前移动的数字块的逻辑坐标,从而算出需要移动的数字块的坐标。
  • 判断数字块是否能够移动、是否需要合并。

这里我遇到了巨大的危机:已知一个数字块的坐标,我们该如何拿到这个数字块的对象呢?

第一时间想到的是将所有的数字块添加至同一个家族,通过遍历这个家族的所有对象从而获得我们需要的对象 (当然,这部分就是要付费版本了,所以有没有像我这样的穷鬼也能做的方法呢?)

可是如何获得原来的数字块对象呢?呼呼,我们没法在事件表里直接写出对应的逻辑,但是我们可以让一个代理者代替我们执行!例子就是在新手教程中,子弹在击中怪物时能够获得获得怪物对象并将其销毁,(这种思想的本质是让系统内的每个成员只完成自己的简单工作,最终合起来就能得到一个井然有序的、智能的系统) 我们这里要做的就是创建一个"推手",它碰到数字块时会使数字块往我们设置的方向移动,然后为每个数字块遇到与自身相同的数字块时,就在被碰撞的数字块处生成一个新的数字块的事件即可。

先通过键盘输入确定数字块的移动方向: 解释一下:这里的addC以及addR是列增量行增量,将通过它代表所有数字块的移动方向。

移动数字块的部分分为4个函数:moveBlocks, moveBlock, moves以及clearBlocks

是不是已经晕了?别害怕,让我们一个一个来看:

函数moveBlocks用于生成一个位置序列,这个位置序列是数字块推手将要遍历的。为什么要专门用一个函数用于生成位置序列?以一个一维表作为例子进行说明:

假设某条道的数字块是这样的:1 - 1 - 1 - 1 我们希望不论是向左或是向右移动,最终的结果都是这样的:2 - 2,而不是1 - 2 - 1或其他。

一种方法是将这4个数字沿着移动方向依次标号为1、2、3、4(例如向右移动就是从左向右依次编号)。按照以下位置顺序,依次移动对应位置的数字块就能得到我们想要的结果:3 - 2 - 1 - 3 - 2 - 3。不论我们如何改变移动方向,我们只需要确保数字块推手在单条道内能够按照以上顺序进行移动,就能实现数字块的移动效果。不过当然,这里只是基本的理论,具体还要考虑移动方向对数字范围的影响,这方面可以使用一个状态表 对不同的情况进行简化 (可惜这里位置太小了,写不下相关过程,笑) ,得到的最终结果是这样的:

函数moveBlock则是对是否能够移动一个数字进行进一步的判断,需要判断的内容包括:

  • 移动后是否超出边界范围
  • 移动方向上是否存在阻挡
  • 是否能够与相同数字块进行合并

前两条还很好理解,但是最后一条是什么呢?实际上在上面的移动顺序中,实际上最后的结果是 4 而非 2-2,这是因为数字1两两配对之后产生的一对2再次合并,因此我们需要引入新的全局变量canMerge ,要求新产生的数字块此状态为0,在下一轮移动(指新的键盘输入)前才改为1,只有canMerge为1的数字块能够被合并。得到的结果:

这里只写了数字1~8的逻辑,一方面是因为后续的数字块逻辑都是相同的,另一方面也是因为受到了行数的限制。可以看到,每个数字只在下一个位置为空,或者下一个位置的数字块与自身相同时才会移动,在合并的部分调用了clearBlocks的函数,这是因为在创建了新的数字块之后,我们还需将原来的数字块进行销毁:

最后的函数move是最简单的,却也是整个过程中最重要的,因为它负责全局变量的更新,即使我们的数字块显示有错误,但只要在后台的数据还是正确的,那我们也算成功了95% (此处伏笔)

判断是否胜利

最后是判断输赢的函数judgeVictory,哎呀,比起前面的真是十分滴简单~: 小tips:跳转到场景1可以快速重置。

最终效果

可以看到确实数字块的显示是有点小问题的哈哈(旧的数字块没有成功被销毁)

Never gonna give you up, never gonna make you cry, never gonna say goodbye, never gonna tell a lie, and hurt you~

fin

相关推荐
嚣张农民16 小时前
推荐3个实用的760°全景框架
前端·vue.js·程序员
梓羽玩Python16 小时前
推荐一款用了5年的全能下载神器:Motrix!全平台支持,不限速下载网盘文件就靠它!
程序员·开源·github
梓羽玩Python17 小时前
这款一站式AI体验平台值得收藏起来!GPT-4o、GPT-4o Mini、Claude 3.5 Sonnet免费使用!
人工智能·程序员·设计
前端宝哥1 天前
10 个超赞的开发者工具,助你轻松提升效率
前端·程序员
XinZong1 天前
【VSCode插件推荐】想准时下班,你需要codemoss的帮助,分享AI写代码的愉快体验,附详细安装教程
前端·程序员
Goboy2 天前
0帧起步:3分钟打造个人博客,让技术成长与职业发展齐头并进
程序员·开源·操作系统
JaxNext2 天前
不选总统选配色,这一票投给 CSS logo
前端·css·程序员
程序员鱼皮3 天前
刚毕业,去做边缘业务,还有救吗?
计算机·程序员·互联网·求职·简历
WujieLi3 天前
独立开发沉思录周刊:vol18.AI 正在成为无处不在的基础设施
程序员·设计·创业
_祝你今天愉快4 天前
重学Android:从位运算到二进制表示(零)
算法·程序员