RPG_Basic(1):BASIC MOVEMENT AND COLLISIONS(基础移动和碰撞)
本系列是油管上的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;(下)
运行游戏即可看到效果。
创建墙体碰撞
上个动图可以看到角色是可以穿过墙体的,所以需要为了obj_player创建和obj_wall的创建事件。
在碰撞事件中,不用书写任何代码,仅仅加上注释即可,但这声明了,obj_play和obj_wall是发生碰撞的。
修正物理旋转
运行游戏后,能看到角色在移动时,会被移动,为了修正这个问题,在obj_player对象的Create事件中,加入代码即可修复
phy_fixed_rotation = true;
QA
- QA1:phy_position_x和x有什么区别?
- QA2:添加collision事件,又不书写代码这是为什么。
附录(蓝色标识已完成):
- 1.BASIC MOVEMENT AND COLLISIONS(基础移动和碰撞)
- 2.STEP EVENT + VIEWS(步事件和视图)
- 3.VARIABLES AND CHARACTER SPRITES(变量和人物精灵)
- 4.DRAW EVENT, BACKGROUNDS, SCRIPTS, AND STATES(绘制事件,背景,脚本,状态)
- 5.SMOOTH VIEW MOVEMENT(平滑的移动视图)6.BETTER PLAYER MOVEMENT(优化角色移动)
- 7.GAMEPAD INPUT(手柄输入)
- 8.DASH STATE(冲锋状态)
- 9.ADDING ENEMIES, DEPTH, AND INHERITANCE(增加敌人,理解深度和继承)
- 10.PLAYER ATTACK STATE(攻击状态)
- 11.HITBOXES AND KNOCKBACK(受击盒和击退)
- 12.BETTER CHARACTER SPRITE CONTROL(角色精灵控制优化)
- 13.ADDING ENEMY STATES(怪物状态机)
- 14.ENEMIES THAT ATTACK(怪物攻击)
- 15.ADDING STATS FOR THE PLAYER(人物状态)
- 16.LEVEL UP!(升级)
- 17.LIMIT DASH AND FIX A BUG(冲锋限制、修复BUG)
- 18.FIXED ENEMY MOVEMENT(修复怪物移动)
- 19.MOVING BETWEEN ROOMS(场景切换)
- 20.ENEMY LOOT DROP(怪物掉落)
- 21.FIXED ENEMY MOVEMENT(修复怪物移动)
- 22.DIALOG(对话)
- 23.IMPROVED DIALOG(对话优化)
- 24.PAUSE MENU(暂停)
- RPG_Basic(25): 储存游戏的简单方式
- RPG_Basic(26): 读取存档的简单方式
- RPG_Basic(27): 发射炮弹Projectiles
- RPG_Basic(28): 优化人物控制
- RPG_Basic(29): 优化AI
- RPG_Basic(30): 简单的音效
相关参考资料:
- GMS官方说明文档
- [Beginner] Make an RPG--HeartBeast
- GameMaker: Studio 中文教程--青铜的幻想
- GMS2官方中文教程系列--顺子
- yoyogames官网--GameMaker Studio下载和注册
RogerCTang 乌龙了
physics_position_x使用后没反应,用x就行了,这是为什么?physics_position_x在F1文档里也找不到。