关于cocos2d中的cpp宏(转)

Cocos2d-x开发:CPP、Lua、JS模板与Lua Runtime架构深度解析 在游戏开发领域,技术选型是项目成功的基石,直接影响开发效率、性能表现与长期维护成本。Cocos2d-x作为流行的跨平台游戏引擎,其核心优势在于支持多种脚本语言,为开发者提供了灵活的技术栈选择。理解不同语言模板的原理与差异,是进行高效技术决策的关键。C++模板提供原生性能与深度控制,适合性能密集型场景;Lua模板则在效率与灵活性间取得平衡,其解释执行与热更新能力显著提升了开发迭代速度;JS模板则面向特定生态与快速原型。深入而言,Lua模板中的Default与Runtime架构差异显著:Default采用单虚拟 阅读详情

最近在学写一个贪吃蛇游戏,发现我的贪吃蛇的头要身子在我按了向右转动时,会要求头和身子有一个旋转角度。当用到ccpRotateByAngle时转进来的几个参数不知道具体有什么用,在网上找到了别人的一个博客,转来了,方便以后自已再用到的时候参考。

本文转自:程序员需要有多懒 ?- cocos2d-x 数学函数、常用宏粗整理 - by Glede
下边是正文:

最近我们的cocos2d-x游戏项目已经进入了正式开发的阶段了,几个dev都辛苦码代码。cocos2d-x还是一套比较方便的api的,什么action啊、director啊、ccpoint啊都蛮便捷的。但是我看到几个dev有时候会很不知道用它们,还是首先自己去写函数……

用一些比较原始、低效率的方法……

甚至是copy / paste……

…………。

……。

这不科学啊!你不能这么勤劳啊!你这么勤劳要出事的啊!每年有多少程序员过劳死啊!程序员一定要是懒骨头才是正道啊!

首先第一个,看到有问题,要写很多代码处理问题,自己动手,丰衣足食——不是一条好路,是一条革命的老路。我们前面有那么多前任程序员的尸体,要学会翻烂它们……然后本文也是菜笔写的,仅简整理一下自己用的比较多一些cocos2d-x的util,帮助大家提高效率,要变懒,会偷懒,没有最懒,只有更懒。

 

数学类

cocos2d-x 里使用最多的数学类型是CCPoint,一个点,本质上也是一个向量,对于向量和向量之间有很多的数学操作要做,oh我知道要干什么,也许我知道怎么求一个值但是不知道怎么求得高效(或者不知道),怎么办我能偷懒吗?那当然可以。这其实并不是一个懒的标准,因为有一些方法写多了也可能确实稍微有那么点麻烦,所以自然cocos2d提供了一套ccp系列来帮助我们完成很多的工作,也显示一下库程序员照顾开发程序员的懒惰精神(当然他们自己也用,他们也很懒)。

那我们首先创建向量

ccp(x, y); // 以坐标x,y创建一个向量这个大家都知道。

ccpFromSize(s); // 以size s的width为x,height为y创建一个向量

 

有了ccp很多人就觉得自己已经够懒了,因为C++是可以用CCPoint()创建临时变量的,就是喜欢少打几个字吧。写个ccp(v1.x + v2.x, v1.y + v2.y)也不长……但是,有没有稍微再懒一点的?
——这个可以有。
基本的加法、减法、取负、数乘

ccpAdd(v1, v2); // 等价 ccp(v1.x+v2.x, v1.y+v2.y);

 

ccpSub(v1, v2); // 等价 ccp(v1.x-v2.x, v1.y-v2.y);

 

ccpNeg(v) // 等价 ccp(-v.x, -v.y);

 

ccpMult(v, s); //等价 ccp(v.x * s, v.y * s); s是个浮点数嘛

不错,但是这个写法不是那么符合我们原生C++程序员的习惯,向量运算符呢?可惜cocos2d原本是一套objc的API,没有操作符重载,cocos2d-x也没有像一些原生的C++数学库一样直接重载向量运算符。不过重载一下还是很方便的,我们的项目里声明了一个数学头文件,也就几行代码就好了:

inline cocos2d::CCPoint operator + (const cocos2d::CCPoint& v1, const cocos2d::CCPoint v2)
    {
        return ccp(v1.x + v2.x, v1.y + v2.y);
    }

    inline cocos2d::CCPoint operator - (const cocos2d::CCPoint& v1, const cocos2d::CCPoint v2)
    {
        return ccp(v1.x - v2.x, v1.y - v2.y);
    }

    inline cocos2d::CCPoint operator - (const cocos2d::CCPoint& v)
    {
        return ccp(-v.x, -v.y);
    }

    inline cocos2d::CCPoint operator * (const cocos2d::CCPoint& v1, float scale)
    {
        return ccp(v1.x * scale, v1.y * scale);       
    }

    inline cocos2d::CCPoint operator * (float scale, const cocos2d::CCPoint& v1)
    {
        return ccp(v1.x * scale, v1.y * scale);       
    }
   
    inline cocos2d::CCPoint operator / (const cocos2d::CCPoint& v1, float scale)
    {
        return ccp(v1.x / scale, v1.y / scale);       
    }

    inline bool operator == (const cocos2d::CCPoint& v1, const cocos2d::CCPoint& v2)
    {
        return (v1.x == v2.x) && (v1.y == v2.y);
    }

    inline bool operator != (const cocos2d::CCPoint& v1, const cocos2d::CCPoint& v2)
    {
        return (v1.x != v2.x) || (v1.y != v2.y);
    }

顺便还重载了等号和不等号,这样就可以直接用+、-来进行向量加减法,*、 / 进行数乘,==、!=判断是否相等了。程序员,这样才够懒!

什么,你说还有 +=、 -=、 /=、 *= 没重载?哦,改那些必须得修改到cocos2d-x的源代码了,改完还得重新编译一遍,略微有点懒得改吧,至少CCPoint还是能用 = 赋值的。我们还是看看cocos2d-x还提供了什么数学方法吧。

 

取中点!本来也就一 ccpMult(ccpAdd(v1,v2), 0.5f) 的事,开发者说不要,我就是要少打几个字,好吧库程序员就给了一个方法

ccpMidpoint(v1, v2); // 等价 ccp( (v1.x + v2.x)/2, (v1.y + v2.y)/2 );

点乘、叉乘、投影

ccpDot(v1, v2); // 等价 v1.x * v2.x + v1.y * v2.y;
ccpCross(v1, v2); // 等价 v1.x * v2.y - v1.y * v2.x;
ccpProject(v1, v2) // 返回的是向量v1在向量v2上的投影向量

喜闻乐见求长度、距离和各自的平方值(在仅需要比较两个长度大小时使用长度平方,因为省去了开方这一步,效率要高不少,这就不光是程序员的懒了,懒得要有效率)

ccpLength(v) // 返回向量v的长度,即点v到原点的距离

ccpLengthSQ(v) // 返回向量v的长度的平方,即点v到原点的距离的平方

ccpDistance(v1, v2) // 返回点v1到点v2的距离

ccpDistanceSQ(v1, v2) // 返回点v1到点v2的距离的平方

 

ccpNormalize(v) // 返回v的标准化向量,就是长度为1


旋转、逆时针90度、顺时针90度(90度的效率当然是更快的。。。同样懒得有效率)

ccpRotate(v1, v2); // 向量v1旋转过向量v2的角度并且乘上向量v2的长度。当v2是一个长度为1的标准向量时就是正常的旋转了,可以配套地用ccpForAngle

 

ccpPerp(v); // 等价于 ccp(-v.y, v.x); (因为opengl坐标系是左下角为原点,所以向量v是逆时针旋转90度)

 

ccpRPerp(v); // 等价于 ccp(v.y, -v.x); 顺时针旋转90度

上面说到ccpRotate,配套的有向量和弧度的转换向量,还有一些角度相关的

ccpForAngle(a); // 返回一个角度为弧度a的标准向量

// 返回向量v的弧度

ccpToAngle(v);

// 返回a,b向量指示角度的差的弧度值

ccpAngle(a, b);

// 返回向量v以pivot为旋转轴点,按逆时针方向旋转angle弧度

ccpRotateByAngle(v, pivot, angle);

线段相交的检测,哦天哪原来库程序员把这些事情都干了!我还在傻傻地想线段相交算法!实在是太勤奋了!

ccpLineIntersect(p1, p2, p3, p4, &s, &t); // 返回p1为起点p2为终点线段1所在直线和p3为起点p4为终点线段2所在的直线是否相交,如果相交,参数s和t将返回交点在线段1、线段2上的比例
// 得到s和t可以通过 p1 + s * (p2 - p1) 或 p3 + t * (p4 - p3) 求得交点。

ccpSegmentIntersect(A, B C, D) // 返回线段A-B和线段C-D是否相交

ccpIntersectPoint(A, B, C, D) // 返回线段A-B和线段C-D的交点

数学方法没有列全,更多请直接查头文件CCPointExtension.h。基本该有的都有了。

 

当然数学不只有向量,还有一些其他的……这些也很经常用到。小懒一下。

CC_RADIANS_TO_DEGREES(a);  // 弧度转角度
CC_DEGREES_TO_RADIANS(a);  // 角度转弧度
CCRANDOM_0_1();     // 产生0到1之间的随机浮点数
CCRANDOM_MINUS1_1(); // 产生-1到1之间的随机浮点数    

博客里还有第二部分关于语句宏的,我这里就不转了,你们去原博客看吧。我也懒一下。



Cocos2d-x 格斗 **敌人AI(`Enemy.h/cpp`)**:实现 `updateAI` 方法,根据与玩家的距离决定追击/攻击(例如:距离<200时攻击,否则移动靠近)。- **血条UI(`HpBar.h/cpp`)**:可通过 `DrawNode` 绘制两个矩形(背景+血条),提供 `setPercent` 方法更新血量;└─ Resources/ // 资源(图片/动画帧,需自行补充)│ ├─ Character.h/cpp // 角色基类(玩家/敌人共用) 阅读详情

相关推荐

基于cocos2d-x C++的塔防游戏开发实战

Cocos2d-x是一套用于开发2D游戏的强大框架,它的起源可以追溯到2008年,最初为iOS平台创建的Cocos2d-iPhone项目。随着移动游戏市场的迅速增长,以及对跨平台开发需求的日益迫切,Cocos2d-x应运而生,以C++语言编写,提供了对多个平台的支持。经过多年的发展,Cocos2d-x不断演进,不仅支持了Android、Windows、MacOS等操作系统,还通过不断更新,引入了现代游戏开发所需的各种高级特性。

weixin_30533301的博客 533

CPP常识 01 -- 判断两个vector是否相等

https://www.jianshu.com/p/51225ce0b234

wuxiecsdn的博客 1706

深入解析COCOS2D麻将游戏开发技术要点

htmltable {th, td {th {pre {简介:《连环夺宝》是一款基于COCOS2D引擎开发的2D麻将类手游。本文将详细阐述COCOS2D在麻将游戏开发中的应用,包括其轻量级跨平台特性、图形渲染系统、核心算法设计(牌型判断、胡牌规则、摸牌逻辑)、编程语言(C++和Lua)的结合、丰富的UI组件、平滑的动画系统、音效和音乐集成、多人在线网络同步、资源管理和游戏测试调试等关键开发知识点。

weixin_30356433的博客 708

Coco2d-x生成项目

好的,用户现在的问题是“怎么让sln生成到win32中”,也就是希望Visual Studio的解决方案文件(.sln)直接生成到项目的proj.win32目录下,而不是使用CMake默认的build目录。需要确保步骤清晰,分平台说明,但可能用户主要是在某个特定平台下工作,所以可能需要先问清楚,但通常Cocos2d-x项目是多平台的,所以可以涵盖主要的几个平台。另外,用户可能没有明确说明他们使用的Cocos2d-x版本,但根据之前的回答,假设他们使用的是v4.x版本,因此需要基于CMake的方法。

qq_73597721的博客 1065

cocos2d-cpp:C ++ 14中的便携式2D游戏引擎

cocos2d-cpp cocos2d-cpp是用C ++ 14编写的2D游戏引擎。 cocos2d-cpp最初是从cocos2d-x游戏引擎中克隆的,旨在重构一些旧功能。 从那时起,它变成了对引擎的完全重写。 因此,尽管cocos2d-cpp基于cocos2d-x,但与之不兼容。 cocos2d-cpp仅适用于C ++和C ++。 尝试以这种比例保持lua和javascript绑定进行重写是不切实际的,因此这些绑定已被删除。 cocos2d-cpp适用于Android,iOS,Linux,MacOS和Windows。 由于cocos2d-cpp现在正在积极开发中,其中包括重写基本组件

从零到一:如何用YOLOv8和PyQt5打造一个高效的路面坑洞检测系统

本文详细介绍了如何利用YOLOv8和PyQt5开发一个高效的路面坑洞检测系统。从环境配置、数据采集标注到模型训练优化,再到PyQt5界面开发与系统集成,提供了完整的实战指南。该系统结合深度学习技术,显著提升了道路检测的准确性和效率,适用于各类道路维护场景。

weixin_29047919的博客 308

Cocos2d-x引擎学习笔记(一)—— cpp-empty-test程序流程

cpp-empty-test程序流程 cocos2d-x版本:3.17.2 运行环境:Visual Studio 2017 解决方案配置:Debug Win32 1.程序入口 main.cpp #include "main.h" #include "../Classes/AppDelegate.h" USING_NS_CC; int WINAPI _tWinMain(HINSTANCE h...

dick的博客 633

Amesim管路仿真进阶:如何用阻力管实现不规则管路的高精度模拟

本文深入探讨了在Amesim仿真中,如何利用阻力管(Orifice with Table)元件,特别是TFORT0子模型,实现对不规则管路的高精度模拟。通过直接输入基于测试或CFD的流量-压降数据,该方法能有效弥补标准管路模型在复杂流道、内部结构复杂等场景下的不足,为液压、热管理等系统仿真提供精准可靠的部件模型。

cicd6pipeline的博客 671

cocos2d-x cpp-test学习

01. 这一回主要搭建大致的框架,写程序的过程中错误不断,磕磕碰碰才写到现在,可见自己的能力是多么的差,所以要多写程序。 多思考代码的逻辑, 这一章主要谢了一个测试ActionManager, 其中有CallFunc和CallFuncN有什么区别? CC_CALLBACK_0 CC_CALLBACK_1 和其它几个有什么区别? 回答这两个问题,写到这里进行下一章学习。

wangrl的博客 1090

车载 ECU 中的 Safety Linux 详解

车载 ECU 中的 Safety Linux 详解

天赐好车的博客 312

【DRAM存储器二】Sense Amplifier

详述DRAM颗粒中感应放大器功能、电路结构、工作原理和操作波形

highman110的博客 7199

Cocos2d-x中的AppDelegate.cpp文件解析

在Cocos2d-x中AppDelegate.cpp中通过三个方法处理应用的主逻辑循环: applicationDidFinishLaunching程序启动完成时调用 applicationDidEnterBackground程序进入后台时调用(比如用户此时接了电话,游戏就会在后台运行) applicationWillEnterForeground程序从后台回到前台时调用(比如用户接完电话返

紫红阳光的博客 2162

【OpenCV】图像的像素直方图 图像特征点 cv::FAST cv::ORB ORB_SLAM2::ORB

文章目录图像直方图代码实现cv::FAST和cv::ORB 检测图像特征点cv::FAST和cv::ORB 检测图像特征点代码实现ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比代码实现 图像直方图代码实现 图像是由不同数值(颜色)的像素构成的,像素值在图像中的分布情况是图像的重要属性,可以用直方图修改图像的外观,标识图像的内容,检测图像中特定的物体或纹理。 单通道灰度图像中每个像素都有一个 0(黑色)-255(白色)的整

小秋 AI SLAM 入门实战教程 2510

Android通过JNI调用cocos2d-x中的C++方法

假如我们遇到这样一种情况:通过cocos2d-x在Android平台实现一个录音功能或者播放视频功能,当录音结束或者视频播放结束时,Android该如何通知Cocos2d-x呢?

寻一份宁静 1058

通过Langchain实现大模型完成测试用例生成的代码(可集成到各种测试平台)

代码中使用的是讯飞spark3.0版本,其中版本在的控制已经封装到了langchain对应的讯飞的iflytek的类中,可以在调用的时候显示控制,默认是spark2.0版本。

Criss@陈磊 2362

学Simulink——基于Simulink的扰动观测器(DOB)补偿坡道重力分量

(质量5kg,坡度30°,目标速度1m/s)为例,基于Simulink搭建“DOB+PI”复合控制仿真平台,从系统建模、DOB算法推导、离散化实现到Simulink模块搭建,提供模块化模型、核心代码及参数整定表,帮助工程师彻底解决重力等恒值扰动引起的稳态误差问题。采用双线性变换(Tustin): s=Ts​2​z+1z−1​,其中 Ts​为控制周期。模块相加(注意符号:ufinal​=upi​−ucomp​或 upi​+ucomp​,取决于扰动定义方向,此处假设重力为正,控制力需反向抵消,故为减)。

MHD0815的博客 69

cocos2d-Lua与c++交互,lua如何绑定C++类。

我们有一个C++类,TestLayer.h #ifndef __TEST_LAYER_H__ #define __TEST_LAYER_H__ #include "cocos2d.h" namespace cocos2d{ class TestLayer : public Layer { public: static TestLayer* create(); bool in

zwcwu31的专栏 1526

一分钟了解OpenSpec (规格)

OpenSpec是由Fission AI开源的轻量级规范驱动开发(SDD, Spec-Driven Development)CLI工具。它专为AI编程助手(如Cursor、Claude Code)设计,核心是**“先约定,后编码”:在AI写代码前,先通过结构化规范文档达成共识,让开发过程可预测、可审计、可协作**。轻量无侵入:单CLI、无依赖、不改造项目、1分钟接入存量友好:增量Spec、不重构旧文档、1→n王者完全可控:每步审查、AI按图施工、零返工协作利器。

h a 6 6 6 c k 为 你解决复杂难题! 2752

cocos2d-x C++与Lua交互

cocos2dx 关于C++与Lua的交互,说明了下LuaEngine对通过LuaStack对LuaState环境的封装和初始化,tolua++的使用等等

鹤九日的博客 2648

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Windows下Cocos2d-x C++ Android开发环境搭建全攻略

在移动游戏开发领域,C++因其高性能和跨平台能力,常被用于游戏引擎和核心逻辑的实现。其原理在于通过编译器将C++源码编译为特定平台的原生机器码,从而实现对硬件资源的直接高效访问。在Android平台上,这一过程依赖于Android NDK提供的交叉编译工具链,将C++代码编译为ARM架构的动态链接库。这种技术方案的价值在于,它允许开发者复用成熟的C++代码库,在保持高性能的同时,兼顾了Android生态的兼容性,广泛应用于对图形渲染、物理计算有高要求的游戏开发场景。本文聚焦于Cocos2d-x这一流行的开源

weixin_30466039的博客 348

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[转]Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

【转自】https://segmentfault.com/a/1190000000718145 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂、网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1、在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 2、在cocos2d-x项目里,把纯C函数注册进Lua环境,理解cocos2d

ffxiangyu的专栏 593

Cocos2d-x中与属性相关的宏

2.2.4 属性 C++的类成员只有方法与字段,没有属性和事件,这给开发者带来了不便。为了实现Objective-C中提供的属性功能,我们不得不使用方法来模拟get和set访问器。Cocos2d-x规定了属性访问器的方法名称以get或set为前缀,后接属性名。在CCNode中包含大量属性,例如用于给节点做标记的Tag属性,它的访问器分别为getTag()和setTag(int aTag),其

风流海的专栏 1594

Cocos2d-x 关于Android.mk 自动读入CPP

Cocos2d-x 关于Android.mk 自动读入CPP

继续激情,继续奋斗。 2239

详解Cocos2d-X中宏CC_DLL(转)

在cocos2d-x的源码中,经常可以看到宏CC_DLL的使用,比如在类CCScene的定义中: class CC_DLL CCScene : public CCNode { public:         CCScene();         virtual ~CCScene();         bool init();         static CCScene *create(void

tianxi_fs的专栏 492

详解Cocos2d-X中宏CC_DLL

原文地址:http://www.cnblogs.com/mingfish/archive/2013/07/09/3180652.html 在cocos2d-x的源码中,经常可以看到宏CC_DLL的使用,比如在类CCScene的定义中: class CC_DLL CCScene : public CCNode { public: CCScene();

hanjjjjj的专栏 666
上一篇: C++与Objective-C的差异(转)
下一篇: box2D(转)
woodcol
博客等级 码龄19年 288粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值