查看项目所有章节

接着上一章,我们添加一个敌人精灵,起名enemy

并在enemy属性中,添加图集,设置图片

得到效果:

新建一个enemy的TypeScript脚本,并将脚本添加到entity精灵上

编辑game_manager脚本,在顶部添加entity的导入

import Enemy from '../script/enemy'

并添加entity属性节点

  @property(Enemy)enemy: Enemy = null

修改update(dt)方法中的代码

 update(dt) {//计算出朝向var dx = this.role.node.x - this.enemy.node.xvar dy = this.role.node.y - this.enemy.node.yvar dir = cc.v2(dx, dy)var angle = dir.signAngle(cc.v2(1, 0))//var degree = (angle / Math.PI) * 180 + 90var degree = Math.floor(cc.misc.radiansToDegrees(angle)) + 90//移动if (this.joystick.state === 1) {var s = this.role.move_speed * 0.016this.role.move(s, this.joystick.radius)} else {}//设置敌人朝向this.enemy.node.angle = -degree}

保存后,打开GameManager节点,编辑属性,将enemy精灵拖到enemy属性中

点击运行查看效果:

到这里,敌人始终朝向主角的代码已经写完了,我们来解释一下这段代码的含义

首先,查看几何数学中的夹角公式之余弦公式:

在查看了cocos2d-js的源码:

不难得出以下代码:

  clampf(value: number, min_inclusive: number, max_inclusive: number) {//如果最小值大于最大值,则变量值相互交换if (min_inclusive > max_inclusive) {var temp = min_inclusivemin_inclusive = max_inclusivemax_inclusive = temp}//若value比最小值小,则返回最小值,如果比最大值大,则返回最大值return value < min_inclusive ? min_inclusive : value < max_inclusive ? value : max_inclusive}update(dt) {//【计算出朝向】var dx = this.role.node.x - this.enemy.node.xvar dy = this.role.node.y - this.enemy.node.y//直线a (主角和敌人直接的向量)var a = cc.v2(dx, dy)//直线b (X轴正方向)var b = cc.v2(1, 0)//1.使用系统API//var angle = a.signAngle(b)//2.手动实现//实现anglevar m1 = a.x * a.x + a.y * a.yvar m2 = b.x * b.x + b.y * b.yvar dot = a.x * b.x + a.y * b.yvar theta = dot / Math.sqrt(m1 * m2)//clampf函数:如果比-1小,则返回-1,如果比1大,则返回1theta = this.clampf(theta, -1, 1)var angle = Math.acos(theta)//实现signAngle//this.cross(vector) < 0 ? -angle : angleangle = a.x * b.y - a.y * b.x < 0 ? -angle : angle//1.使用系统API将弧度转化//var degree = Math.floor(cc.misc.radiansToDegrees(angle)) + 90//2.手动实现var degree = (angle / Math.PI) * 180 + 90//移动if (this.joystick.state === 1) {var s = this.role.move_speed * 0.016this.role.move(s, this.joystick.radius)} else {}//设置敌人朝向this.enemy.node.angle = -degree}

OK,之前的敌人跟随主角朝向的代码我们都通过手写的方式实现了,但系统提供了强大的API,就可以直接使用系统封装的,可以减少我们很多写代码的时间,但原理我们一定要清楚

接下来我们实现一下,当主角停止移动时,主角朝向敌人的代码

首先添加一个标志位,因为update方法会不断被调用,但我们只需要在主角停止移动时,只设置一次方向

  //是否移动了主角move: boolean = false

修改update方法

    //移动if (this.joystick.state === 1) {var s = this.role.move_speed * 0.016this.role.move(s, this.joystick.radius)this.move = true} else {//若停止移动,设置主角朝向if (this.move) {this.move = falseconsole.log('停止移动 :' + degree)this.role.node.angle = -degree + 180}}

查看效果:

本章源码:

点击下载

【cocos creater】7.仿《弓箭传说》- 控制主角朝向敌人相关推荐

  1. 【cocos creater】仿《弓箭传说》

    项目介绍: 此游戏是由cocos creater编写,可发布到原生,h5,微信小游戏等各大平台上.此demo中实现了热门小游戏<弓箭传说>的核心功能,可提供参考,欢迎各位评论点赞 [coc ...

  2. 【cocos creater】1.仿《弓箭传说》-开发环境及项目搭建

    查看项目所有章节 首先进入cocos creater官网 https://www.cocos.com/creator 打开下载V 2.1.2版本,因为cocos creater的各个版本之间都有差异, ...

  3. 【cocos creater】8.仿《弓箭传说》- 发射子弹

    查看项目所有章节 接着上一章,在层级管理器中创建一个名叫bullet的精灵,表示我们的子弹 接着给bullet精灵添加子弹图片 效果如下: 创建完成后,在层级管理器中将bullet精灵直接拖到下方的资 ...

  4. cocos creater 游戏开发工具方法

    /*** 观察者方法** @export* @param {*} obj* @param {Function} callback* @param {*} pointer* @return {*} {P ...

  5. 这款Roguelike+RPG养成游戏为何如此成功?《弓箭传说》节奏点分析

    <弓箭传说>是一款什么样的游戏? 如果您已经玩过这款游戏,那无须多言,可以直接跳转至后看分析,如果您还没深入体验或只是看到过或者没听过,可以简单看一下这款游戏的定位. <弓箭传说&g ...

  6. cocos creater 热更重启导致崩溃

    cocos creater 热更重启导致崩溃 知识点 jsb_websocket_server.cpp 游戏中用到的 socket inspector_socket_server.cc V8引擎中 用 ...

  7. 三轴联动c语言算法,(数控加工)虚拟轴数控机床的仿三轴控制.pdf

    (数控加工)虚拟轴数控机 床的仿三轴控制 虚拟轴数控机床的仿三轴控制 前言 虚拟轴数控机床的出现被认为是本世纪最具革命性的机床设计突破. 如果充分发挥这种新型机床在结构上的优势,就有可能为大幅度地提 ...

  8. cocos creater 使用.max文件/.max文件转换为.fbx文件

    .max文件转为.fbx文件 本人c4d纯小白,作为前端要在cocos中用到3d模型,去某宝买了一些,但是是.max格式,cocos creater用不了,只能看着怎么弄成.fbx,而且不知道什么原因 ...

  9. cocos creater 2.4 Error Bundle resources doesn‘t contain

    cocos creater 2.4 Error Bundle resources doesn't contain 使用cocos2.4版本的时候, 依照官方指南 https://docs.cocos. ...

最新文章

  1. MySQL开启远程连接权限
  2. 已知环境静态障碍物避障_我女儿如何教我无障碍环境
  3. Android bitmap图片处理
  4. LESSON 12.7 梯度提升树的参数空间与TPE优化
  5. java 开发环境的搭建
  6. 总结计算机语言的基本元素,认识程序设计中基本元素教案.doc
  7. (计算机组成原理)第三章存储系统-第六节2:Cache和主存的映射方式(全相联映射、直接映射和组相连映射)
  8. qt 创建文件_xmake从入门到精通2:创建和编译工程
  9. window操作大全
  10. javase转javaee(java web)
  11. 桌面高效便捷的多窗口调整管理工具
  12. VB6 用ODBC连接数据库
  13. U盘病毒肆虐横行 金山毒霸2011全面解决隐患
  14. flutter 后台管理框架
  15. HTML5在豆瓣中的应用
  16. 数学计算机学具制作,《 用计算器计算》四年级数学
  17. 雷电模拟器打开应用权限_雷电模拟器超级用户权限怎么设置,是什么,怎么关闭【获取超级用户权限】通知提示,如何自动允许...
  18. HTML颜色名称和颜色代码表
  19. free top 内存泄漏 内存溢出
  20. JAVA8 UnaryOperator接口

热门文章

  1. 连续声音采集最好版本(c#),把书读薄了
  2. 金山中等专业学校计算机,江苏省金山中等专业学校2021年招生计划
  3. android快速换机,华为手机换机数据转移用什么最快?华为一键换机方法汇总
  4. 大学英语b统考必过题库
  5. 鸿蒙手机怎么设置每天上下班打卡提醒?用待办软件开启打卡提醒
  6. 第一个多层感知器实例:印第安人糖尿病诊断
  7. Protege、D2RQ、JENA与SPARQL
  8. linux宝塔清除全部日志,宝塔Linux面板定时删除网站监控报表日志
  9. docker mysql高可用_Docker下Ubuntu系统编译安装HAprox+Keepalived+MySQL负载高可用架构
  10. [LeetCode]187. 重复的DNA序列(java实现)暴力 + 哈希