我的战舰0基础游戏制作入门1(滚雪球)
创建一个新游戏
首先点击右上角的按钮切换到沙盒模式
点击这里创建一个新游戏
给新游戏起名字叫“滚雪球”
制作机械
现在我们的游戏里面还没有内容,点击“导入文件” ,选择“机械”
这里是我们的机械列表,由于我们还没创建任何的机械,双击第一个格子即可,给导入的机械命名为“球”
双击刚刚导入的机械文件
这里是我们的机械编辑器,拖动可以旋转视角,鼠标滚轮滚动可以缩放视角,按住鼠标中键可以平移视角。
画面中有一个叫做“核心”的立方体,每个机械都有一个核心用来作为拼装零件的起点,现在我们来看下面的零件分类界面
选择“装饰物”分类中的“近未来分类”中的“白色球体”,将球体拖动到“核心”上方
拖出来的效果如下
在左侧的“零件属性面板”我们可以看到有“缩放”滑动条
将缩放拖动到3.0
点击向下的“绿色箭头”
输入“0.35”并确定
这样球体就移动到中心位置了
雪球我们就做好了,点击右上角的“关闭按钮”离开机械编辑器
创建地图
接下来我们再点击一次“导入文件”并选择“地图”
这里是我们的地图列表,由于我们还没创建任何的地图,随便点击一个格子即可,给导入的地图命名为“雪地”
双击刚刚导入的“雪地”地图
这里是我们的地图编辑器,拖动可以旋转视角,鼠标滚轮滚动可以缩放视角,按住鼠标中键可以平移视角。
下方是我们的零件分类,点击其中的“地图零件”分类,将“机械产生器”拖动到地面上
效果如下
接来下我们要给这个机械产生器起的好记的名字,在选中“机械产生器”的状态下左侧的“零件属性面板”中可以看到有个“别名”可以输入
在这里输入“雪球”
然后点击左下角的“机械[无]”这个按钮
这里打开了我们的游戏目录,可以看到我们刚才做好的球。双击选择它
选择成功后你可以看到选中的机械悬浮在了“机械产生器”的上方
第一行代码
然后我们点击地面上一开始就有的蓝色方块,它叫做“逻辑方块”,游戏里面用来写入一些控制游戏整体逻辑的代码
点击它的“零件属性面板”上面的“逻辑按钮”
这里是这个零件的逻辑面板,最左侧是各种事件列表,现在我们希望在玩家进入游戏时自动产生一个雪球,所以我们要点击“玩家加入房间”这个事件
这里就是我们的代码编辑器,上方彩色的按钮是我们的代码分类,现
在我们拖动“地图”这个按钮到下面空白处,注意是拖动而不是点击
这里是和地图有关的代码分类,点击“机械”分类
这里是和机械有关的代码,选择“产生玩家机械”这个代码
这里是给产生的“机械变量”起名字,我们先不需要起名字,所以直接关闭这个界面即可
现在我们就有了第一行代码,他的作用是产生一个玩家可以控制的机械,这里就是我们之前做的雪球,这个代码的名字后面有很多黑色的小格子,叫做“参数”,作用是告诉这个代码如何运行,比如具体在什么位置,产生具体哪个玩家控制的,哪个名字的机械。
首先我们要告诉它要产生的是我们刚才创造的“雪球”这个机械,点击“机械产生器别名”后面的黑色格子
选择“直接赋值”
这里输入我们刚才给那个“机械产生器”起的别名:“雪球”
接下来告诉他这个机械是属于刚加入游戏的这个玩家的,点击玩家参数后面的黑色格子
这里直接选择“玩家 $player”这个变量就可以了
这个变量其实是我们这个代码中自带的参数,我们刚才是在“玩家加入房间”这个事件中添加的代码
,所以游戏会自动给我们的代码加上一个参数用来表示是具体哪个玩家加入了游戏房间
接下来点击“坐标”参数后面的黑色格子,并选择“直接赋值”
在这里输入(0,3,0)这样三个数字。其中XYZ对应的数字分别代表水平方向,上下方向,前后方向的位置,(0,3,0)就代表了在地图中心点正上方3米的位置。这样的三个数字的组合的名字叫做向量,也就是有方向的量。
这样我们的第一行代码就完成了
我们点击右上角的关闭按钮离开代码编辑器回到地图界面,点击一下地面空白处
点击上方的
测试按钮来测试一下我们的代码你会看到有个球从天上掉到了地面
点击右上角的关闭按钮,点击离开房间,回到编辑器。
运动
现在我们来让这个球动起来,点击机械产生器,并点击它的“逻辑按钮”
可以看到机械产生器对应的事件和“逻辑方块”的不一样,因为蓝色的“逻辑方块”是用来控制整个游戏的逻辑,而“机械产生器”是用来控制单个机械的。
为了控制球的运动,最简单的方式就是当键盘按键按住时让球一直移动,所以我们要不停的判断按键是否按住了,这种需要循环不断运行的代码,我们需要放在“每帧循环”事件里面,点击“每帧循环”
在代码编辑器中我们需要添加能判断键盘是否按下的代码
我们将“功能调用”按钮拖动下来
选择“系统”分类中的“键盘鼠标”分类
选择“是否按住按键”这个代码
这里可以发现生成的代码名称左侧有个黄色的方框,上面类型是“布尔值”,这个黄色方框叫做返回值,它是这行代码运行的结果,如果某个键盘按键被按住了,这个布尔值的内容就是“真”、否则就是“假”,而现在这个布尔值的名字还是空的,为了在后面的代码中使用这个布尔值来判断球是否需要滚动,我们需要先给它起个名字
这里我们点击“输入新名称”
,给这个布尔值起名叫做“按住左”
加下来我们还需要告诉这个代码需要判断具体哪个按键,每个键盘上的按键都有自己的“键值”
这里我们用ASDW 4个键用来控制球的前后左右移动,我们这里先点击键值后面的黑色格子后选择A
当按住A键不放时我们要让球滚动起来,我们先拖动“如果”按钮到第1行后面
这里点击“选择布尔值”,并选择我们刚添加的名字叫做“按住左”的变量
效果如下
接下来要给球一个推动力,拖动“当前零件”按钮到第2行后面
可以看到这里有很多的功能可以选择,向下拖动找到“物理分类”
选择里面的“推力”代码
可以看到“推力”这个代码是属于“核心”这个零件的,它有两个参数“向量 力”和“选项类型”,我们先点击“向量 力”后面的方框,
并输入1,0,0,这里的向量前面我们用来产生机械的坐标向量不同,这个向量表示的水平方向,单位为1的一个箭头方向,也叫方向向量。
这样我们的3行代码就完成了,1-3行的意义是,
1:判断A键有没有按住,如果按住了,让变量“按住左”等于“真”,否则等于“假”
2:如果变量“按住左”的值是“真”,那么执行有绿线的第3行,否则跳过有绿线的部分,执行第4行
3:给核心这个零件一个水平方向,大小为1的推力
现在可以关闭代码编辑器,点击一下地面空白处,然后点击上方的“测试按钮”进入测试
现在按住A键,球开始滚动了
但是现在有个问题,摄像机会不停的变化方向,这是因为默认的摄像机会随着目标翻滚,这不是我们想要的,我们点击右上角关闭按钮回到编辑器模式
摄像机
我们再回到机械产生器的逻辑界面,点击刚才写的3行代码
拖动“系统按钮”到第一行前面
选择“系统”分类中的“摄像机”分类,并选择“设置摄像机目标和角度”这个代码
这里我们希望摄像机一直盯着球看,所以我们要得到球的位置,拖动“当前零件”按钮到第一行前面
选择“坐标”这个代码
选择“输入新名称”,将名字设置为“球位置”
点击第2行的“目标点”参数,并选择“球位置”这个变量
点击“角度”这个参数,选择“直接赋值”,并写入0,45,0
最后点击“距离”参数,选择“直接赋值”,输入“10”
现在这两行代码的意义为:
1:得到核心位置
2:将摄像机的目标位置设置为核心位置,仰角45度,距离10米
再回到测试模式,可以发现摄像机不会翻滚了
接下来我们要用同样的方式给SDW几个按键也设置好对应的移动功能,回到刚才的代码编辑器
可以发现3-5行的代码其实只要复制出来,修改一下里面的参数就可以用来做其他按钮的按下移动了,我们点击右侧的快捷菜单按钮
,选择“复制多行”
点击选择3-5行后,点击“确定选择”按钮
接下来点击最后一行右侧的快捷菜单按钮
选择“黏贴代码到后面”
第6-8行就是黏贴出来的代码,但是我们发现第4行的如果下面的绿线影响了下面所有行的逻辑,这会导致只有按住了A键的时候,第6-8行才会运行,这显然不是我们想要的,这时只要点击一下第6行前面的绿色竖线
这样第6行开始的代码就移动到外面来了,也就是第4行的如果语句不管是否成立,都不会影响第6行的运行
现在将第6行的键值改为D
然后点击第6行返回值的名字
,点击“删除名称”,这里要注意,不能点击“修改名称”,因为这样会导致前面第3行的变量名也一起改变
删除了名字后,再次点击第6行的返回值,就可以给他起新名字了,选择“输入新名称”,输入“按住右”
再点击第7行的变量名,改为“按住右”
将第8行的推力向量也改为反向的-1,0,0
这样,A和D两个键的控制代码就写完了,可以检查下是否写对了
以此类推,再复制6-8行的代码,分别实现W和S键的逻辑,最终的效果如下
当然如果讨厌重复劳动,也可以直接复制完整的代码,首先复制下面的代码内容(从begincode到endcode要完整复制)
begincodeV1;
name:方法1;
1:Vector3 球位置=act 1.this.getPosition();
2:=fun camera.setpos(var 球位置:Vector3 0,45,0:Float 10:Float 0.5);
3:Bool 按住左=fun keyboard.keyHeld2(Enum 45);
4:if fun create.bool(var 按住左);
5: =act 1.this.addForce(Vector3 1,0,0:Enum 0);
6:Bool 按住右=fun keyboard.keyHeld2(Enum 48);
7:if fun create.bool(var 按住右);
8: =act 1.this.addForce(Vector3 -1,0,0:Enum 0);
9:Bool 按住上=fun keyboard.keyHeld2(Enum 67);
10:if fun create.bool(var 按住上);
11: =act 1.this.addForce(Vector3 0,0,-1:Enum 0);
12:Bool 按住下=fun keyboard.keyHeld2(Enum 63);
13:if fun create.bool(var 按住下);
14: =act 1.this.addForce(Vector3 0,0,1:Enum 0);
endcode
然后点击左上角的黏贴按钮就可以将代码完整的复制进来了
点击复制按钮
也可以将自己的代码复制成文本,黏贴到其他地方接下来再进入测试,就可以使用ASDW 4个按键控制小球移动了
敌人
加下来我们添加一些敌人作为可以攻击的目标,首先点击下方的“地图零件”分类
,再拖动一个机械产生器出来,别名设置为“敌人”
点击“机械[无]”按钮,还是选择“球”这个机械
接下来我们希望游戏一开始就会产生10个这样的敌人,选择蓝色的“逻辑方块”,点击逻辑按钮,这次我们在“启动”这个事件中添加代码
进入代码编辑器后,首先我们拖动“功能调用”按钮下来,选择里面的“创建变量”分类
,选择“小数”这个代码。
,变量名称叫做i
拖动“循环”按钮到最后一行
,选择“小数计算”分类中的小于
小于符号前面的参数选择变量i,后面的变量输入10
拖动“地图”按钮到最后一行
选择“机械”分类中的“产生AI机械”代码
,返回值不需要起名字,直接关闭窗口即可
其中“产生器别名”参数输入前面起的“敌人”这个名字,坐标输入5,5,0
最后拖动“功能调用”按钮到最后一行,选择“小数计算”分类中的“加”这个代码
填写参数后效果如下:
这样就实现了连续生成10次AI机械的功能,每一行的功能分别是:
1:将变量i的值设置为0,
2:当变量i小于10的时候反复执行下面红色竖线部分的3-4行的代码
3:在5,5,0这个位置生成一个名字叫“敌人”的机械
4:将i的大小增加1
这样当第3-4行重复运行了10次后,代码再次来到第2行时,i的值等于10,不满足小于10的条件,代码自动跳过3-4行,现在可以进入测试看下效果
天上自动落下了10个不受玩家控制的球,你可以控制自己的小球去撞击它们,接下来我们要增加吃掉AI小球变大的功能
撞击事件
回到地图编辑器,选择“雪球”这个别名的“机械产生器”,并点击逻辑按钮,可以看到我们之前已经在“每帧循环”事件里面添加了14行代码用来控制小球的移动,现在我们希望当球撞击到敌人时会变大,现在点击“被撞击”事件
这个事件的参数较多,包括的发生撞击的对象,力量大小,速度,类型等,这里我们希望每次撞击后,球的大小都比最开始大20%,首先我们拖动“功能调用”按钮到下面,并选择“小数计算”分类中的“加”代码
效果如下,这样每次撞击时,缩放整个变量都会增加0.2
拖动“当前零件”按钮到最后,选择“所在机械”代码
接下来拖动“变量功能”按钮到最后一行
选择“机械”这个变量
,里面有很多功能,拖动到下面,选择其中的“缩放”代码
,其中“比例”参数选择“缩放”变量
现在进入测试,你会发现球落地时突然变小了,连续碰撞敌人的球时会变大,这是因为“缩放”这个变量最开始是0,所以第一次碰撞后,缩放等于0.2,机械默认大小为1,看起来就是落地时突然变小了,那怎么能让“缩放”变量在一开始等于1呢,我们回到“雪球”这个机械产生器的逻辑界面。
容易想到我们可以在“机械启动”这个事件中将“缩放”变量设置成1,点击“机械启动”事件,拖动“功能调用/创建变量/小数”到下面,并将变量名设置为“缩放”
,这时如果你尝试进入测试,发现小球还是在接触地面后变小了,这时因为不同事件中的的代码之间的变量是分离的,即使两边的变量名都是“缩放”,他们之间也是不同的变量。全局变量
我们可以回到逻辑面板,可以发现最右侧有个“全局变量”分类
点击“全局变量”,选择“小数”类型
,参数的名字写“缩放”,而“输入描述信息界面”可以点确定跳过即可
这样“缩放”变量就变成这个零件内部的所有代码都可以访问的全局变量了
再次打开“机械启动”事件中的代码,会发现变量的类型前面多了“全局:小数”
,打开“被撞击事件”中的代码,会发现“缩放”作为参数的地方,字的颜色也从白色变为了绿色
再次进入测试,可以发现小球没有再变小了,但是落到地面的瞬间球也会变大,这是因为碰撞地面也会进入“被撞击”事件,我们需要排除掉撞击地面的情况,只处理撞击敌人小球。
接下来再回到“雪球”这个“机械产生器”的“被撞击”事件的代码中,我们需要判断撞击的类型,拖动“如果”按钮到第1行前面,
,选择“变量功能”
分类中的“$type”这个变量
的“相等”代码
然后点击“选项”这个参数,修改为“零件”类型
代码如下,再次进入测试后,球落到地面时就不会变大了
接下来我们还需要在撞击到敌人小球时让对方消失,以实现吃掉的效果,拖动“变量功能/$attacker/得到机械”代码到最后,并将得到的机械变量命名为“ai”
再拖动“变量功能/ai/删除”方法到最后,5,6两行的功能是:
5:得到撞击到的零件所在的ai机械
6:删除ai机械(延迟参数可以用来等待一定的秒数后才删除)
现在进入测试可以“吃掉”敌人并变大了,但是吃掉了敌人后我们希望产生新的敌人补充。
自定义方法
我们需要回到蓝色的“逻辑方块”的逻辑界面,可以看到上面有个“自定义方法”分类,点击它,进入代码编辑器
这里我们要修改一下代码的名称,改为“添加AI”
拖动“地图/机械/产生AI机械”方法,并设置好参数
下面我们将蓝色的“逻辑方块”的别名改为“主机”
然后回到“雪球”这个“机械产生器”的“被撞击”事件的代码中,拖动“当前零件”到最后一行
,选择“调用地图方法”这个代码
参数填写“主机.添加AI”,代码如下
其中“主机”就是我们刚才给蓝色的“逻辑方块”起的名字,“添加AI”就是我们刚才在“逻辑方块”中编写的自定义方法的名字,这样我们就可以在机械中调用地图中的功能了,再次进入测试,会发现每吃一个球,都会掉一个新的球下来
到这里,一个最简单的单机小游戏就做好了,下一章会讲解如何将这个小游戏改进为一个可以多人联机的大球吃小球游戏