话不多说,先上图,下面是实现代码(在后面会具体讲解实现过程):

 //第一步:将炮台的坐标转换为世界坐标下的坐标点
CCPoint location = this->getParent()->convertToWorldSpace(this->getPosition());
//第二部:计算出两个向量之间的夹角
float angle = ccpAngleSigned(ccpSub(target, location), CCPointMake(0, 1));
//因为求出的角度是以π为单位,所以这里要转换成以度为单位
this->setRotation(CC_RADIANS_TO_DEGREES(angle));

下面是ccpAngleSinged的实现代码:

CC_DEPRECATED_ATTRIBUTE static inline float ccpAngleSigned(const Vec2& a, const Vec2& b)
{
return a.getAngle(b);//可以看到,这里是a向量对b向量获取角度,我们再往里跳一步看具体的实现
}

我们再跳入getAngle看具体实现:


float Vec2::getAngle(const Vec2& other) const
{
//第一步:先将a,b向量进行规范化,也就是获得两个方向上的单位向量
Vec2 a2 = getNormalized();
Vec2 b2 = other.getNormalized();
//这一步很重要!!!留到最后来讲这一步的实现,涉及到了线性代数的一些知识
float angle = atan2f(a2.cross(b2), a2.dot(b2));
//判断角度是否小于浮点数能表示的最小值(float用的是IEEE754标准,23位表示尾数,8位表示数阶,1位表示尾数符号)
if (std::abs(angle) < FLT_EPSILON) return 0.f;
return angle;
}

接下来讲最重要的一步:

float angle = atan2f(a2.cross(b2), a2.dot(b2));

首先要了解一些线性代数的知识,向量积和数量积;atan2f是math库内的函数,而cross求的是向量积的模,dot求的是数量积,下面给出它们两个的代码:

/** Calculates cross product of two points.
@return float
@since v2.1.4
* @js NA
* @lua NA
*/
//这个求的是向量积,二维坐标下也就是一个二阶行列式的计算
inline float cross(const Vec2& other) const {
return x*other.y - y*other.x;
} //这个求的是数量积
inline float Vec2::dot(const Vec2& v) const
{
return (x * v.x + y * v.y);
}

然后,我们要知道下面两个公式:

而通过上述的公式可知: arctan(tan⊙)=⊙,而向量积的模除以数量积的模等于tan⊙,经过这样一换算,很简单的就能得出这两个向量之间的角度。

最后,只需要调用精灵的setRotation旋转相应的角度即可。

PS:当然,如果不知道上面这两个公式也是能做的(毕竟引擎库都已经封装好了),我们也可以自己来实现这个角度的计算,比如通过射击目标到炮台位置的向量的X,Y方向长度,利用tan(y/x)=角度,直接计算出角度(不过这里可能要进行判断x的正负,需要一些其他的逻辑判断

[cocos2d-x]捕鱼达人炮台射击角度的旋转实现的更多相关文章

  1. cocos2dx 3.x(捕鱼达人炮台角度换算)

    // // GameScence.hpp // NotesDamo // // Created by apple on 16/10/23. // // #ifndef GameScence_hpp # ...

  2. js原生捕鱼达人(三)--完结

    先给分享下我写完的效果,github有点卡,我没有压缩代码,不过效果可以看到 https://jasonwang911.github.io/ 转载请注明'转载于Jason齐齐的博客http://www ...

  3. js原生捕鱼达人(一)

    捕鱼达人的游戏大家都很熟悉吧,接下来的两三天,我会将整个游戏的原生js写法详细的写出来,整个游戏应用了面向对象的写法:创建构造函数,在构造函数上面添加对象的属性,然后在构造函数的原型上添加方法,当然这 ...

  4. TOP30专访:捕鱼达人陈昊芝

    原文:http://www.csdn.net/article/2012-04-04/313919/1 编者按:3月31日,第四届CocoaChina游戏开发者大会暨Cocos2D-X技术研讨会在北京举 ...

  5. 利用ZjDroid对 <捕鱼达人3> 脱壳及破解过程-转

    http://blog.sina.com.cn/zihao2015 <捕鱼达人3> 刚出来不久,就被鬼哥Dump出来dex,随之破解也就轻而易举.一开始我用ZjDroid神器试验过,但是没 ...

  6. html5 canvas简易版捕鱼达人游戏源码

    插件描述:html5利用canvas写的一个js版本的捕鱼,有积分统计,鱼可以全方位移动,炮会跟着鼠标移动,第一次打开需要鼠标移出背景图,再移入的时候就可以控制炮的转动,因为是用的mouseover触 ...

  7. 【Cocos2d-x for WP8 学习整理】(3)CCScrollView 实现捕鱼达人一样的场景选择界面

    UI 界面一般是游戏里比较独立的地方,因为游戏引擎一般都比较注意基础的功能封装,很少会关注UI,但是 UI 确是玩家第一眼看到的效果,因此能否实现一个美观的UI对于提升游戏的整体美观有着很大的帮助. ...

  8. 基于HTML5的捕鱼达人游戏网页版

    之前给大家分享了html5实现的水果忍者,愤怒的小鸟,中国象棋游戏.今天给大家分享一款捕鱼达人(fishjoy)网页版游戏的源码.可以在线玩也可以下载到本地.它使用html5技术和javascript ...

  9. 捕鱼达人代码例子下载地址 mac版

    捕鱼达人代码例子下载地址  mac版: http://pan.baidu.com/share/link?shareid=1431898404&uk=3189484501

  10. 捕鱼达人代码例子下载地址 Win版

    捕鱼达人代码例子下载地址 Win版:: http://pan.baidu.com/share/link?shareid=1601576904&uk=3189484501

随机推荐

  1. 【多线程那些事儿】如何使用C++写一个线程安全的单例模式?

    如何写一个线程安全的单例模式? 单例模式的简单实现 单例模式大概是流传最为广泛的设计模式之一了.一份简单的实现代码大概是下面这个样子的: class singleton { public: stati ...

  2. C语言两个升序递增链表逆序合并为一个降序递减链表,并去除重复元素

    #include"stdafx.h" #include<stdlib.h> #define LEN sizeof(struct student) struct stud ...

  3. python关于Django搭建简单博客项目(详解一)

    上一篇我们说了如何搭建简易博客网站,下面我们来进行详细解答.本文没有特定顺序,请结合上一篇和源代码参照学习. 相关源代码和解析请参看:https://github.com/Cheng0829/mysi ...

  4. kubelet忽然不可用

    原因,有可能机器的cpu信息有变化(扩容或者缩容)解决办法: 删掉/opt/var/lib/kubelet目录下(或者/data/lib/kubelet)cpu_manager_state文件 然后m ...

  5. Sublime Text 修改默认语言为Python

    Sublime Text 3 修改默认语言为Python 步骤如下 英文:Tools - Developer - New Plugin 中文:工具 - 插件开发 - 新建插件 清空原来内容,用下面的代 ...

  6. cordon节点,drain驱逐节点,delete 节点

    目录 一.系统环境 二.前言 三.cordon节点 3.1 cordon节点概览 3.2 cordon节点 3.3 uncordon节点 四.drain节点 4.1 drain节点概览 4.2 dra ...

  7. 抓包分析 TCP 握手和挥手

    前言 首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务.在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂 ...

  8. linux系统配置文件或shell脚本批量注释

    1. 配置文件批量注释 1.1 批量注释 ① 进入命令行模式,按ctrl + v进入 visual block模式,键盘上下箭头选中多行,把需要注释的行标记起来 ② 按大写字母I,再输入注释符:# ③ ...

  9. mybatis一对多根据条件查询的查条数

    一对多写了mapper映射之后 根据条件查条数 可以根据主表的唯一id进行分组 在拿到它的count select count(0) over(aa.id),,id,name,age from tab ...

  10. 一年一度!GitHub 开发者大会「GitHub 热点速递 v.22.45」

    GitHub 是全球最大的开源社区,它的一举一动都深受每一位开源爱好者的关注.这周末刚落下帷幕的<GitHub Universe 2022>是 GitHub 发布最新产品.功能.报告和计划 ...