GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

192 信息 1091 成员
游戏开发工具 GameMaker Studio 2 的讨论小组

RPG_Basic(1):BASIC MOVEMENT AND COLLISIONS(基础移动和碰撞)

Linpean 2017-10-24

本系列是油管上的HeartBeast[Beginner] Make an RPG课程的中文笔记,主要形式是截图的方式进行步骤上的说明。面向对象:GameMaker新手,以学习一门脚本编程语言,制作一个RPG游戏为目标的爱好者。


本节主要内容:

  • 创建项目
  • 创建精灵
  • 创建对象
  • 创建房间
  • 开启物理引擎效果
  • 将对象设置在房间某个位置
  • 设置碰撞盒
  • 使用键盘按键检测事件控制角色移动

基本概念 

以下内容在官方帮助文档中,有更明晰和合理的解释,有疑问和错漏请参考帮助文档进行理解。

  • 精灵Sprite:它们可以有独立的屏幕坐标、帧率、周期等等,在最终渲染时,它们会与背景等一起被合成为你看到的每一帧画面,它之所以被称为精灵,是因为Sprite单词含义为“精灵,鬼怪”,简单而言,可以理解成有动画的图片(和GIF动图的效果类似),更详细的内容请参考知乎
  • 对象Object:可以简单的理解成模版,学术化的语言,将其称为“现实事物的抽象,类”,但针对具体的游戏开发而言,举例如怪物模版,角色对象都是对象。
  • 实例Instance:对象的一个现实例子,例如狗是对象,那么一只叫做Ryne的狗就是实例,通常在GMS2中对象是指在资源树上创建的Object对象,而实例是指在游戏运行时,以Object为模版,在游戏中实际的实例,这些实例具有一部分在Object定义的属性,如血量,速度等,但它是动态变化的,会受到其他的影响
  • 房间Room:一般指的是游戏场景,游戏中角色所处的环境,分为多个种类层级(Layer),在表现上分为背景层,前景层,实例层。

创建项目:

命名项目名称为RPG Basics


选择储存文件的路径



设置项目参数


设置游戏运行帧数为30.



创建精灵

右键点击位于界面最左边的资源树,然后在呼出的二级面板,点击CreateSprite(创建精灵)即可创建新的


创建人物精灵,命名为spr_player


设置大小为32*32


点击Edit进入编辑图片


当我们临时没有美术资源时,可以利用Fill tool填充工具,将图片全部填充成蓝色,暂时替代一个美术资源来用


使用同样的方法,创建墙体精灵,命名为spr_wall,填充其颜色为黑色。


当我们有外部的美术资源,就在先在资源树创建精灵,不编辑和填充颜色,然后双击精灵,在弹出的界面点击import输入外部的图片为精灵



创建对象

同样的操作,在资源树里Create Object,创建玩家对象

双击对象,在弹出的界面,将其对象的Sprite精灵设置为spr_player

以同样的操作,创建墙体对象,obj_wall


创建房间

创建房间,命名为rm_one


在属性设置里面(双击房间,在默认视图的左下角),设置房间大小为640(width)*360(Height)


拖入房间对象

双击房间,在弹出的视图中,选中实例层(instance)


按住对象,拖动鼠标,单个拖入对象,像下图一样。

  •     黑色方块:墙体
  •     绿色小人:角色

这里有两个快捷操作

    

  • 批量拖入(按住alt,可以单击房间连续拖入)
  • 删除(选中,按住键盘Delete键,或者右键,在弹出的界面上点击delete )
  • 批量删除(按住shift选取对象,可以进行批量选中)


运行游戏

点击左上的类似播放的按钮,可以运行游戏


可以看到如下效果,黑色墙体中间,有一个蓝色的小人



修改房间物理属性

点击资源树上的房间(一般创建项目后,会默认创建一个room),然后选中这个房间的物理属性,勾选enable Physics


将其Gravity_y修改为0,即Y方向没有力的影响,这样开启物理引擎影响的对象就会往下坠了。因为我们实际需求的是一个2D平面俯视图的效果。



设置对象的物理属性

 在资源树上,选中对象obj_player,然后依次开启物理效果,然后修改碰撞盒形状为BOX,再匹配碰撞盒和精灵图片的位置。

实际上很多碰撞盒,不会和精灵图片完全吻合,比如上图中的碰撞盒只设置在下半身,想象在实际生活中,地面障碍可能与人发生碰撞的部位,就是脚部而已,所以类似的,在设置碰撞盒,从实际需求出发来设置碰撞盒的大小和形状。


按照同样的方法,设置obj_wall的物理属性和碰撞盒(这里要全覆盖)

需要注意的一点是,我们需要将墙体设置的密度(Density)设置为0,这意味着墙体是无限重的,能达到任意物体都无法移动它的效果(在房间开启物理效果的前提下)


 


创建移动代码

在资源树双击obj_player对象,在弹出的面板,点击Add Event,添加键盘输入检测事。这个事件能检测到键盘的左方向键被按下,这时,控制的角色向水平方向右侧移动4个像素,即向左行走,这个事件每帧都会检测,所以每帧都会发生移动(+ 4个像素距离)


同样的,添加其他三个方向键的检测事件,并且如下对应

phy_position_x -= 4;(左)
phy_position_y -= 4;(上)
phy_position_y += 4;(下)

运行游戏即可看到效果。

Image title

创建墙体碰撞

上个动图可以看到角色是可以穿过墙体的,所以需要为了obj_player创建和obj_wall的创建事件。

在碰撞事件中,不用书写任何代码,仅仅加上注释即可,但这声明了,obj_play和obj_wall是发生碰撞的。



修正物理旋转

运行游戏后,能看到角色在移动时,会被移动,为了修正这个问题,在obj_player对象的Create事件中,加入代码即可修复

 phy_fixed_rotation = true;

Image title




QA

  1. QA1:phy_position_x和x有什么区别?
  2. QA2:添加collision事件,又不书写代码这是为什么。  

附录(蓝色标识已完成):

相关参考资料:

近期喜欢的会员

 
Tang 2021-02-16

physics_position_x使用后没反应,用x就行了,这是为什么?physics_position_x在F1文档里也找不到。

 
Tang 2021-02-16

RogerCTang 乌龙了

 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册