使用GameMaker中用于碰撞检测的脚本小记
使用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中用于碰撞检测的脚本小记相关推荐
- unity在脚本中获取游戏对象有三种_Unity3D中用于删除当前脚本所在游戏对象的代码是:_学小易找答案...
[单选题]297 . 乙醇的颜色为 [单选题]219 . 下列物质中含有极性共价键的是 [单选题]OnWillCreatAsset( string path) 上面命令的作用是: [填空题]针对单个或 ...
- autohotkey 热键_键盘快捷方式(热键),用于将鼠标移至多显示器配置中的显示器-AutoHotkey脚本
autohotkey 热键 Introduction 介绍 In an interesting question here at Experts Exchange, a member requeste ...
- php 自动获取头像,PHP_WordPress中用于获取及自定义头像图片的PHP脚本详解,get_avatar()(获取头像)
get_avat - phpStudy...
WordPress中用于获取及自定义头像图片的PHP脚本详解 get_avatar()(获取头像)get_avatar() 函数用来获取置顶邮箱或者用户的头像代码,在评论列表中非常常用. 这个函数提供 ...
- 浮岛物语(FORAGER): 在 GameMaker 中做优化
Forager是如何管理成千上百个实例的 有些时候,你很幸运有机会在项目启动时就参与其中,这样可以对你的代码库有更全面的了解和掌控.但另一种情况是,你需要接手一个比较复杂的,将近50000行代码的项目 ...
- 不是python中用于开发用户界面的第三方库-模拟试卷C
原标题:模拟试卷C 一.单项选择题 1. 按照"后进先出"原则组织数据的数据结构是____ 队列 栈 双向链表 二叉树 2. 以下选项的叙述中,正确的是 循环队列有队头和队尾两个指 ...
- shell实例第19讲:一个脚本中调用另一个脚本的3种方法
在Shell脚本中调用另一个脚本(3种方法) 准备:主脚本是second.sh,主脚本中调用first.sh 方法1:exec(1)执行方式:exec /home/weibo/shell_test/s ...
- 嵌入式Linux系统中的.lds链接脚本基础
from:http://www.embeddedlinux.org.cn/html/xinshourumen/201203/04-1989.html 连接脚本的格式 ================= ...
- Linux 命令之 let -- bash 中用于计算的工具,用于执行一个或多个表达式
文章目录 一.命令介绍 二.命令示例 自增操作 自减操作 shell 脚本中的运算表达式 一.命令介绍 let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ ...
- 博主日常工作中使用的shell脚本分享
前言: 今天给大家分享一篇在我工作中常用的一个shell脚本,里面有一些我们常用到的shell操作.该脚本用于本地电脑和服务器交互上,实现以下功能: 自动拉取自己个人电脑上的源码到服务器上yocto包 ...
最新文章
- Deep Learning论文笔记之(二)Sparse Filtering稀疏滤波
- Python 全局变量
- linux bash命令_Linux命令-您应该知道的基本Bash命令行技巧
- Java 面向对象:构造器详解
- react基础学习记录一
- 【网页保存为PDF】pdfkit神器网页自动保存PDF文件
- python在线音乐播放器_python实现音乐播放器
- 局域网共享文件的方法
- 我们是选择开源CRM,还是选择商业CRM?
- 计算机组成原理知识点梳理
- fuchsia中virtio 后端实现
- python 股票交易接口 github_GitHub - zhaoneng/vnpy: 基于python的开源交易平台开发框架...
- html代码width什么意思,width:100% 啥意思呢,在什么情况下使用?
- npm报错:npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
- 关于MBR和GUID分区的问题
- 图灵、图灵机和图灵测试
- 2018阿里巴巴春招面试
- GraphSAGE: 算法原理,实现和应用
- C语言程序设计--结构体--计算该日是在本年中是第几天
- 2021年度训练联盟热身训练赛第八场