问题概述

红警、帝国时代、星际争霸……想必很多玩家都对这类即时战略游戏保有极深的感情。其中有一个较为常见的逻辑便是——左键划动选中人物,然后右键标记目标地点,使得人物向目标地点移动。这个逻辑最常见的问题在于——可能会有不同的部队被选中,使得他们在同一时间向不同的地区进发。为了解决这个难点,博主想了一套相对简单的逻辑来实现。

解决方案

基本思路非常简单。首先我们先定义一个叫旗帜的物体,旗帜的本质意义就是玩家点击右键后留下的目标点,其他的按照逻辑编写代码即可。基本流程如下:

  1. 创建旗帜物体obj_mubiao.(建议给这个物体挂一个sprite,方便debug)
  2. 编写选中角色的逻辑代码。
  3. 编写在空白区域点击左键以取消选中的逻辑代码。
  4. 编写在空白区域点击右键以放置旗帜的逻辑代码。
  5. 编写旗帜的逻辑代码。

代码实现

按照上述思路,我们开始对各个物体分别编写代码。

obj_zhujue

一、创建

对于主角,先创建一个属于自己的旗帜。
具体方法是创建一个旗帜并把这个旗帜的id赋给一个变量mubiao中,然后再把自己(id)赋成旗帜(mubiao)的“主人”,这样把人物和自己旗子的关系确定下来

mubiao=instance_create(0,0,obj_mubiao);   //创造一个以自己为对象的旗子
mubiao.zhuren=id;                         //将旗子的对象设置为自己

二、鼠标左键放开

里面就一句话,shubiao=1表示选中了主角(当时不习惯使用布尔值,表打我~)

shubiao=1;     //表示鼠标选中了这号角色

三、全局左键按下

里面也只有一句话,表示空白区域点一下左键就取消所有选中

if (shubiao==1) shubiao=0;    //判定:如果此时处于选中状态,则取消选中

四、全局右键按下

首先判断是否有人物被选中,如果有便进入创作

if (shubiao==1 )                                    //判定右键时是否是该物体被选中
{move=1;                                          //开启移动模式zhan=0;move_x=mouse_x;                                  //移动目标:鼠标x值move_y=mouse_y;                                  //移动目标:鼠标y值dertax=move_x-x;                                 //横坐标远近dertay=move_y-y;                                 //纵坐标远近if (dertax!=0) k=dertay/dertax;                    //斜率if (dertax==0) k=dertay/(dertax+0.001);             //补救当x=0时导致的运算错误if (k<-1 || k>1 && dertay>0) fangxiang=1;if (k>=-1 && k<=1 && dertax>=0) fangxiang=2;if (k<-1 || k>1 && dertay<0) fangxiang=3;if (k>=-1 && k<=1 && dertax<0) fangxiang=4;
}

五、步事件

这个是人物移动指令,不难理解

/*     向下移动     */
if (move==1 && fangxiang==1 && (image_index>=2)) image_index=0;
if (move==1 && fangxiang==1){if (distance_to_point(move_x,move_y)>0.5)mp_potential_step_object(move_x,move_y,move_speed,obj_no);if (distance_to_point(move_x,move_y)<=0.5) {speed=0;move=0;zhan=1;}}/*     向右移动     */
if (move==1 && fangxiang==2 && (image_index<=10 or image_index>=13)) image_index=11
if (move==1 && fangxiang==2){if (distance_to_point(move_x,move_y)>0.5) mp_potential_step_object(move_x,move_y,move_speed,obj_no);if (distance_to_point(move_x,move_y)<=0.5) {speed=0;move=0;zhan=1;}}/*     向上移动     */
if (move==1 && fangxiang==3 && (image_index<=1 or image_index>=4)) image_index=2
if (move==1 && fangxiang==3){if (distance_to_point(move_x,move_y)>0.5) mp_potential_step_object(move_x,move_y,move_speed,obj_no);if (distance_to_point(move_x,move_y)<=0.5) {speed=0;move=0;zhan=1;}}/*     向左移动     */
if (move==1 && fangxiang==4 && (image_index<=3 or image_index>=6)) image_index=4
if (move==1 && fangxiang==4){if (distance_to_point(move_x,move_y)>0.5) mp_potential_step_object(move_x,move_y,move_speed,obj_no);if (distance_to_point(move_x,move_y)<=0.5) {speed=0;move=0;zhan=1;}}

obj_mubiao

步事件

表示如果对应主角处于被选中状态,那么就显示旗帜,否则会隐藏
一旦主角到达指定位置,旗帜消失

if (zhuren.shubiao=1) image_alpha=100;
if (zhuren.shubiao=0) image_alpha=0;
if collision_point(x,y,zhuren,0,0)
{x=0;y=0;
}

全局右键

这里面是设定终点位置

if (zhuren.shubiao==1)
{x=zhuren.move_x;y=zhuren.move_y;
}
if (collision_circle(x,y,1,obj_difang,1,0) && zhuren.duixiang=collision_circle(x,y,1,obj_difang,1,0))
{zhuren.move=0;zhuren.da=1;
}
else
{zhuren.chetui=1;
}
if collision_point(x,y,1,obj_no,1)
{x=0;y=0;
}

Gamemaker studio2经验(1)——右键人物移动逻辑相关推荐

  1. Gamemaker studio2经验(2)——TCP联机

    问题概述 众所周知gamemaker是一款制作2d游戏的优秀引擎,但是落后的弱联网机制始终是一个坑.所幸在gms2中,yoyogames集团加入了TCP的联机机制,这也为gm系列引擎制作联网游戏带来了 ...

  2. Gamemaker studio2经验(3)——昼夜更替效果实现

    问题概述 在一些知名引擎(如unity,godot,cocos等)中,天空盒概念的引入使得场景中的天空丰富多彩,但是gm就吃了这个大亏.由于动态天空制作麻烦.没有对口的天空盒系统,导致很少有开发者在g ...

  3. Gamemaker studio2经验(4)——打字机效果

    问题概述 在很多游戏中--算了实在不好意思写引言了,就直说啦.如果你是UT粉,想用gm搞搞UT的同人作品但是又无从下手,那么请看过来. 对于RPG类游戏,文字交流系统是不可或缺的,但是gm的文字系统- ...

  4. 如何debug 右键菜单执行逻辑 - Test BSP Application page implementation

    Created by Jerry Wang, last modified on Aug 11, 2014 需要在SE80里debug 在右键菜单里选择了Test之后的执行逻辑. 直接在command ...

  5. Unity3D游戏制作——人物移动逻辑

    Unity中移动某个游戏对象有以下两种方式: ·更改Transform组件的Position属性: ·利用物理引擎(PhyX, Box2D)移动游戏对象. 首先我们试着通过调整Transform组件的 ...

  6. 多模态人物识别技术及其在爱奇艺视频场景中的应用 | 公开课笔记

    [12月公开课预告],入群直接获取报名地址 12月11日晚8点直播主题:人工智能消化道病理辅助诊断平台--从方法到落地 12月12日晚8点直播:利用容器技术打造AI公司技术中台 12月17日晚8点直播 ...

  7. 004_推箱子-游戏逻辑

    1. 游戏逻辑 1.1. 定义初始化地图变量 1.2. 定义活动地图, 因为人物每移动一次, 地图都发生了变化 1.3. 坐标类, 定义人物位置 1.4. 定义当前人物坐标变量 1.5. 绘制场景时, ...

  8. 软件测试理论与经验--阅读笔记

    第1章 测试员的角色 测试人员的角色到底是什么?能够定义的很清楚吗? 经验1-测试员是项目的前灯 测试就是要找到信息,有关项目或者产品的关键信息决策都需要根据这些信息来决定. 经验2-测试员的使命决定 ...

  9. 软件测试理论与经验-第1章(测试员的角色)-第2章(按测试员的方式思考)-阅读笔记

    Lessons Learned in Software Testing  美 Cem kaner.James Bach.Bret Pettichord著 本书的三位作者具有多年的测试经验,知道成功的测 ...

最新文章

  1. undefined symbol: sqlite3_open_v2
  2. java 获取计算机内存
  3. php挖洞提权,记一次渗透挖洞提权实战
  4. 【githubgit】1、github中的watch、star、fork的作用
  5. php-dev离线安装,局域网 pm2 离线安装
  6. 20155210 Exp5 MSF基础应用
  7. 使用powermock 测试static 方法,jacoco统计覆盖率问题
  8. Lightbox JS v2.0
  9. 推荐-最新PSP游戏下载,不用注册直接下载!(1)
  10. 自制Anki选择题模板(支持桌面版/移动版)
  11. 《失业的程序员》(十二):潜意识的智商 .
  12. java web前端邮件,JavaMail:在Web应用上完整接收、解析复杂邮件(转)
  13. centos查询 硬盘序列号查询_CentOS查看主板型号、CPU、显卡、硬盘等信息
  14. 我的世界服务器无限耐久护甲,我的世界无限耐久指令 | 手游网游页游攻略大全...
  15. tcp图片13包java怎么接收_13. TCP协议中的动态数据传输:应对小数据包
  16. 机器人运动学、动力学基础上利用MATLAB进行PID控制仿真
  17. 量子计算机是什么?量子计算机和传统计算机之间有什么区别?
  18. (30)zabbix Trapper 监控项配置
  19. 中国量子计算机芯片美国,13nm!中国量子芯片再获突破,美国专家:中国学者不睡觉吗?...
  20. 64格棋盘放芝麻,求重量。

热门文章

  1. iOS小技能:app侧登录流程【上篇】 (前置知识)
  2. Myeclipse之回退版本
  3. git版本回退命令_git 版本回退 撤销 删除
  4. 这台iPad最适合程序媛吃鸡,号称吃鸡神器!
  5. 山东大学计算机考研压分,很坑!考研院校:这些骚操作,你不得不防
  6. cpu是计算机硬件中的,电脑硬件CPU介绍
  7. 超实用工具:获取法定节假日、休息日、周末天数
  8. [渝粤教育] 广东-国家-开放大学 21秋期末考试马克思主义基本原理概论(A)10882k1
  9. php循环实现金字塔,PHP中使用循环实现的金字塔图形
  10. 小米生态链企业商米科技完成数亿元C+轮融资,蚂蚁金服投资...