使用GameMaker中用于碰撞检测的脚本小记

在GameMaker的中文论坛精华例子里面下了一个关于跳跃的gmk,说是关于跳跃,但是里面实现了所有动作游戏角色的移动/跳跃(还有二段跳)/爬墙的逻辑。界面如下:

其中游戏核心是角色object的step_event中的200多行脚本。

原代码如下:

switch (state){
case 0:{//地面if(keyboard_check_pressed(vk_left)){//向左移动sprite_index=sp_l;}else if(keyboard_check_pressed(vk_right)){//向右移动sprite_index=sp_r;}else if(keyboard_check_released(vk_left) || keyboard_check_released(vk_right)){//停止移动sprite_index=sp0;}if(keyboard_check_pressed(ord('Z'))){//按下跳state=1;sprite_index=sp_u;gravity_direction=270;gravity=1;vspeed=-16;}else if(instance_position(x-15,y+1,ob_land)<0 && instance_position(x+15,y+1,ob_land)<0){//落下state=2;gravity_direction=270;gravity=1;sprite_index=sp_d;}break;
}
case 1:{//跳起test=collision_rectangle(x-15,y-37+vspeed,x+15,y-20,ob_bottom,false,false);//撞到顶if(test!=noone ){y=test.y+27;vspeed=0;state=2;sprite_index=sp_d;}else if(keyboard_check_released(ord('Z')) || vspeed>=0 ){//松开或速度为0vspeed=0;state=2;sprite_index=sp_d;}break;
}
case 2:{//落下test=collision_rectangle(x-15,y,x+15,y+vspeed,ob_land,false,false);if(keyboard_check_pressed(ord('Z'))){//按下跳state=3;sprite_index=sp_u;vspeed=-12;}else if(test!=noone){//撞到地面image_speed=7;y=test.y-1;vspeed=0;gravity=0;state=0;sprite_index=sp0;}break;
}
case 3:{//二段跳起test=collision_rectangle(x-15,y-37+vspeed,x+15,y-20,ob_bottom,false,false);if(test!=noone ){//撞到顶y=test.y+27;vspeed=0;state=4;sprite_index=sp_d;}else if(keyboard_check_released(ord('Z')) || vspeed>=0 ){//松开或速度为0vspeed=0;state=4;sprite_index=sp_d;}break;
}
case 4:{//二段落下test=collision_rectangle(x-15,y,x+15,y+vspeed,ob_land,false,false);//撞到地面if(test!=noone){image_speed=7;y=test.y-1;vspeed=0;gravity=0;state=0;sprite_index=sp0;}break;
}
case 5:{//沿墙左滑下if(keyboard_check_pressed(ord('Z'))){//按下跳沿墙边跳起state=1;vspeed=-16;gravity=1;sprite_index=sp_u;x+=40;}if(keyboard_check_released(vk_left)){//松开左,落下state=2;gravity=1;sprite_index=sp_d;x+=20;}else{test=collision_rectangle(x,y-10,x+29,y+20+vspeed,ob_land,false,false);//撞到地面if(test!=noone){sprite_index=sp0;image_speed=7;y=test.y-1;x=x+20;vspeed=0;gravity=0;state=0;}}break;
}
case 6:{//沿墙右滑下if(keyboard_check_pressed(ord('Z'))){//按下跳沿墙边跳起state=1;vspeed=-16;gravity=1;sprite_index=sp_u;x-=40;}else if(keyboard_check_released(vk_right)){//松开右,落下state=2;gravity=1;sprite_index=sp_d;x-=20;}else{test=collision_rectangle(x,y-10,x+29,y+20+vspeed,ob_land,false,false);//撞到地面if(test!=noone){sprite_index=sp0;image_speed=7;y=test.y-1;x=x-20;vspeed=0;gravity=0;state=0;}}break;
}
}switch (state){
case 0:{//地面if(keyboard_check(vk_left)){test=collision_rectangle(x-28,y-30,x-8,y,ob_side,false,false);//撞到墙壁if(test!=noone){x=test.x+20;}else{x-=8;}}else if(keyboard_check(vk_right)){test=collision_rectangle(x+8,y-30,x+28,y,ob_side,false,false);//撞到墙壁if(test!=noone){x=test.x-20;}else{x+=8;}}break;
}
case 1://跳起
case 2://落下
case 3://二段跳起
case 4:{//二段落下if(keyboard_check(vk_left)){test=collision_rectangle(x-24,y-30,x-8,y,ob_side,false,false);//撞到墙壁if(test!=noone){state=5;gravity=0;x=test.x+1;vspeed=5;sprite_index=sp_sl;}else{x-=8;}}else if(keyboard_check(vk_right)){test=collision_rectangle(x+8,y-30,x+24,y,ob_side,false,false);//撞到墙壁if(test!=noone){state=6;gravity=0;x=test.x-1;vspeed=5;sprite_index=sp_sr;}else{x+=8;}}break;
}
case 5:{//沿墙左滑下test=collision_rectangle(x-8,y-30,x,y,ob_side,false,false);//离开墙壁if(test==noone){state=2;gravity=1;sprite_index=sp_d;x+=20;}break;
}
case 6:{test=collision_rectangle(x,y-30,x+8,y,ob_side,false,false);//离开墙壁if(test==noone){state=2;gravity=1;sprite_index=sp_d;x-=20;}break;
}
}

摘录一下其中的碰撞参数,加以图形化,有以下几种模型(有些模型说明忘了加,有些重复或互为镜像的模型也没有加)。最头疼是模型参数的设置,原代码中的参数让我觉得这份代码可能是个半成品。

修改后的代码如下(根据初步猜想的参数修改,这份代码与原代码运行一致):

switch (state){
case 0:{//地面if(keyboard_check_pressed(vk_left)){//向左移动sprite_index=sp_l;}else if(keyboard_check_pressed(vk_right)){//向右移动sprite_index=sp_r;}else if(keyboard_check_released(vk_left) || keyboard_check_released(vk_right)){//停止移动sprite_index=sp0;}if(keyboard_check_pressed(ord('Z'))){//按下跳state=1;sprite_index=sp_u;gravity_direction=270;gravity=1;vspeed=-16;}else if(instance_position(x-15,y+1,ob_land)<0 && instance_position(x+15,y+1,ob_land)<0){//落下state=2;gravity_direction=270;gravity=1;sprite_index=sp_d;}break;
}
case 1:{//跳起test=collision_rectangle(x-15,y-37+vspeed,x+15,y-20,ob_bottom,false,false);//撞到顶if(test!=noone ){y=test.y+37;vspeed=0;state=2;sprite_index=sp_d;}else if(keyboard_check_released(ord('Z')) || vspeed>=0 ){//松开或速度为0vspeed=0;state=2;sprite_index=sp_d;}break;
}
case 2:{//落下test=collision_rectangle(x-15,y,x+15,y+vspeed,ob_land,false,false);if(keyboard_check_pressed(ord('Z'))){//按下跳state=3;sprite_index=sp_u;vspeed=-12;}else if(test!=noone){//撞到地面image_speed=7;y=test.y-1;vspeed=0;gravity=0;state=0;sprite_index=sp0;}break;
}
case 3:{//二段跳起test=collision_rectangle(x-15,y-37+vspeed,x+15,y-20,ob_bottom,false,false);if(test!=noone ){//撞到顶y=test.y+37;vspeed=0;state=4;sprite_index=sp_d;}else if(keyboard_check_released(ord('Z')) || vspeed>=0 ){//松开或速度为0vspeed=0;state=4;sprite_index=sp_d;}break;
}
case 4:{//二段落下test=collision_rectangle(x-15,y,x+15,y+vspeed,ob_land,false,false);//撞到地面if(test!=noone){image_speed=7;y=test.y-1;vspeed=0;gravity=0;state=0;sprite_index=sp0;}break;
}
case 5:{//沿墙左滑下if(keyboard_check_pressed(ord('Z'))){//按下跳沿墙边跳起state=1;vspeed=-16;gravity=1;sprite_index=sp_u;x+=40;}if(keyboard_check_released(vk_left)){//松开左,落下state=2;gravity=1;sprite_index=sp_d;x+=20;}else{test=collision_rectangle(x,y,x+29,y-40,ob_land,false,false);//撞到地面if(test!=noone){sprite_index=sp0;image_speed=7;y=test.y-1;x=x+20;vspeed=0;gravity=0;state=0;}}break;
}
case 6:{//沿墙右滑下if(keyboard_check_pressed(ord('Z'))){//按下跳沿墙边跳起state=1;vspeed=-16;gravity=1;sprite_index=sp_u;x-=40;}else if(keyboard_check_released(vk_right)){//松开右,落下state=2;gravity=1;sprite_index=sp_d;x-=20;}else{test=collision_rectangle(x,y,x-29,y-40,ob_land,false,false);//撞到地面if(test!=noone){sprite_index=sp0;image_speed=7;y=test.y-1;x=x-20;vspeed=0;gravity=0;state=0;}}break;
}
}switch (state){
case 0:{//地面if(keyboard_check(vk_left)){test=collision_rectangle(x-28,y-30,x-8,y,ob_side,false,false);//撞到墙壁if(test!=noone){x=test.x+20;}else{x-=8;}}else if(keyboard_check(vk_right)){test=collision_rectangle(x+8,y-30,x+28,y,ob_side,false,false);//撞到墙壁if(test!=noone){x=test.x-20;}else{x+=8;}}break;
}
case 1://跳起
case 2://落下
case 3://二段跳起
case 4:{//二段落下if(keyboard_check(vk_left)){test=collision_rectangle(x-28,y-30,x-8,y,ob_side,false,false);//撞到墙壁if(test!=noone){state=5;gravity=0;x=test.x+1;vspeed=5;sprite_index=sp_sl;}else{x-=8;}}else if(keyboard_check(vk_right)){test=collision_rectangle(x+8,y-30,x+28,y,ob_side,false,false);//撞到墙壁if(test!=noone){state=6;gravity=0;x=test.x-1;vspeed=5;sprite_index=sp_sr;}else{x+=8;}}break;
}
case 5:{//沿墙左滑下test=collision_rectangle(x-8,y-30,x,y,ob_side,false,false);//离开墙壁if(test==noone){state=2;gravity=1;sprite_index=sp_d;x+=20;}break;
}
case 6:{test=collision_rectangle(x,y-30,x+8,y,ob_side,false,false);//离开墙壁if(test==noone){state=2;gravity=1;sprite_index=sp_d;x-=20;}break;
}
}

源代码及修改后的代码均有一个在Flash游戏中常见的BUG,就是角色obj可以依靠爬墙逻辑从上端bottom跟下端land“逃出墙壁”,这个缺陷是爬墙的逻辑不够完善所致。

使用GameMaker中用于碰撞检测的脚本小记相关推荐

  1. unity在脚本中获取游戏对象有三种_Unity3D中用于删除当前脚本所在游戏对象的代码是:_学小易找答案...

    [单选题]297 . 乙醇的颜色为 [单选题]219 . 下列物质中含有极性共价键的是 [单选题]OnWillCreatAsset( string path) 上面命令的作用是: [填空题]针对单个或 ...

  2. autohotkey 热键_键盘快捷方式(热键),用于将鼠标移至多显示器配置中的显示器-AutoHotkey脚本

    autohotkey 热键 Introduction 介绍 In an interesting question here at Experts Exchange, a member requeste ...

  3. php 自动获取头像,PHP_WordPress中用于获取及自定义头像图片的PHP脚本详解,get_avatar()(获取头像) get_avat - phpStudy...

    WordPress中用于获取及自定义头像图片的PHP脚本详解 get_avatar()(获取头像)get_avatar() 函数用来获取置顶邮箱或者用户的头像代码,在评论列表中非常常用. 这个函数提供 ...

  4. 浮岛物语(FORAGER): 在 GameMaker 中做优化

    Forager是如何管理成千上百个实例的 有些时候,你很幸运有机会在项目启动时就参与其中,这样可以对你的代码库有更全面的了解和掌控.但另一种情况是,你需要接手一个比较复杂的,将近50000行代码的项目 ...

  5. 不是python中用于开发用户界面的第三方库-模拟试卷C

    原标题:模拟试卷C 一.单项选择题 1. 按照"后进先出"原则组织数据的数据结构是____ 队列 栈 双向链表 二叉树 2. 以下选项的叙述中,正确的是 循环队列有队头和队尾两个指 ...

  6. shell实例第19讲:一个脚本中调用另一个脚本的3种方法

    在Shell脚本中调用另一个脚本(3种方法) 准备:主脚本是second.sh,主脚本中调用first.sh 方法1:exec(1)执行方式:exec /home/weibo/shell_test/s ...

  7. 嵌入式Linux系统中的.lds链接脚本基础

    from:http://www.embeddedlinux.org.cn/html/xinshourumen/201203/04-1989.html 连接脚本的格式 ================= ...

  8. Linux 命令之 let -- bash 中用于计算的工具,用于执行一个或多个表达式

    文章目录 一.命令介绍 二.命令示例 自增操作 自减操作 shell 脚本中的运算表达式 一.命令介绍 let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ ...

  9. 博主日常工作中使用的shell脚本分享

    前言: 今天给大家分享一篇在我工作中常用的一个shell脚本,里面有一些我们常用到的shell操作.该脚本用于本地电脑和服务器交互上,实现以下功能: 自动拉取自己个人电脑上的源码到服务器上yocto包 ...

最新文章

  1. Deep Learning论文笔记之(二)Sparse Filtering稀疏滤波
  2. Python 全局变量
  3. linux bash命令_Linux命令-您应该知道的基本Bash命令行技巧
  4. Java 面向对象:构造器详解
  5. react基础学习记录一
  6. 【网页保存为PDF】pdfkit神器网页自动保存PDF文件
  7. python在线音乐播放器_python实现音乐播放器
  8. 局域网共享文件的方法
  9. 我们是选择开源CRM,还是选择商业CRM?
  10. 计算机组成原理知识点梳理
  11. fuchsia中virtio 后端实现
  12. python 股票交易接口 github_GitHub - zhaoneng/vnpy: 基于python的开源交易平台开发框架...
  13. html代码width什么意思,width:100% 啥意思呢,在什么情况下使用?
  14. npm报错:npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
  15. 关于MBR和GUID分区的问题
  16. 图灵、图灵机和图灵测试
  17. 2018阿里巴巴春招面试
  18. GraphSAGE: 算法原理,实现和应用
  19. C语言程序设计--结构体--计算该日是在本年中是第几天
  20. 2021年度训练联盟热身训练赛第八场

热门文章

  1. C#实现Gauss完全主元消去法
  2. Linux操纵细碎以太网卡的装配及设置-2
  3. 迷宫中离入口最近的出口问题
  4. 国标服务器GBServerPlatform对接海康摄像头的操作说明
  5. 汽修采购业务线上化,数商云采购平台系统实现企业采购高效协同
  6. web服务器种类汇集
  7. select 函数使用方法
  8. php微信公众号支付实例教程,PHP微信公众号支付教程(含图文)
  9. CTFshow 击剑杯 部分WP
  10. 蓝桥杯 印章Java