基于cocos2dx的飞机大战学习[三]-为英雄添加飞行帧动作并控制飞机移动

2024-08-21 07:58

本文主要是介绍基于cocos2dx的飞机大战学习[三]-为英雄添加飞行帧动作并控制飞机移动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



第三节:为英雄添加飞行帧动作并控制飞机移动


一、为飞机添加飞行动画

为飞机添加飞行动画十分简单,只需要在FlyPlane::init()函数中创建一个动画对象,在里面添加两张英雄图并相互切换就可以了。

添加代码如下:

//为英雄添加飞行动作,动作由动画组成,所以得到动作对象前,需要先得到动画对象//一、创建动画对象//1.1通过create得到动画对象auto animation = cocos2d::Animation::create();	//1.2添加这个动画所要用的精灵帧animation->addSpriteFrame(cocos2d::SpriteFrameCache::getInstance()->getSpriteFrameByName("hero1.png"));animation->addSpriteFrame(cocos2d::SpriteFrameCache::getInstance()->getSpriteFrameByName("hero2.png"));//1.3设置切换时间animation->setDelayPerUnit(0.2f);//1.4循环次数,默认为1,设为-1使其无限循环animation->setLoops(-1);	//二、根据动画对象创建动作对象auto animate = cocos2d::Animate::create(animation);//三、让hero执行这个动作hero->runAction(animate);


修改后init()函数如下:
bool FlyPlane::init() {//一定要先调用父类初始函数if( !cocos2d::Layer::init() ) {return false;}//使用精灵集需要两步//1、将美工做好的plist文件读取到缓存中//2、通过帧名字创建精灵并显示cocos2d::CCSpriteFrameCache::getInstance()->addSpriteFramesWithFile("shoot_background.plist");auto bg1 = cocos2d::Sprite::createWithSpriteFrameName("background.png");//把精灵bg1加到FlyPlane层中,第二个参数ZOrder表示距离用户的距离,第三个参数tag设为1this->addChild(bg1, -1, 1);//默认锚点为(0.5,0.5),只会显示一半的图,必须设置锚点为(0,0)bg1->setAnchorPoint(cocos2d::Point(0,0));//texture:纹理,通过精灵找到对应的纹理,并开启抗锯齿bg1->getTexture()->setAliasTexParameters();auto bg2 = cocos2d::Sprite::createWithSpriteFrameName("background.png");this->addChild(bg2, -1, 2);bg2->setAnchorPoint(cocos2d::Point(0,0));bg2->getTexture()->setAliasTexParameters();//添加英雄cocos2d::CCSpriteFrameCache::getInstance()->addSpriteFramesWithFile("shoot.plist");auto hero = cocos2d::Sprite::createWithSpriteFrameName("hero1.png");	hero->setPosition(VISIBLE_SIZE.width / 2, 100);this->addChild(hero, 3, 3);//为英雄添加飞行动作,动作由动画组成,所以得到动作对象前,需要先得到动画对象//一、创建动画对象//1.1通过create得到动画对象auto animation = cocos2d::Animation::create();	//1.2添加这个动画所要用的精灵帧animation->addSpriteFrame(cocos2d::SpriteFrameCache::getInstance()->getSpriteFrameByName("hero1.png"));animation->addSpriteFrame(cocos2d::SpriteFrameCache::getInstance()->getSpriteFrameByName("hero2.png"));//1.3设置切换时间animation->setDelayPerUnit(0.2f);//1.4循环次数,默认为1,设为-1使其无限循环animation->setLoops(-1);	//二、根据动画对象创建动作对象auto animate = cocos2d::Animate::create(animation);//三、让hero执行这个动作hero->runAction(animate);//定时器。scheduleUpdate每帧调用一次update函数scheduleUpdate();return true;
}
运行效果图(就是飞机屁股能喷火- -):




二、控制英雄移动

控制英雄需要监听事件,有这么几个问题需要考虑。

1.hero可以跟随触摸点移动
2.触摸点必须在hero的绘制区域内才会跟随移动
3.hero随触摸点移动时保持向量差
4.hero不能移出规定区域

现在进行编码,为了解决第三个问题首先我们需要在FlyPlane.h文件中添加一个属性m_vec,表示由touch指向英雄锚点坐标的向量。

private:cocos2d::Point m_vec;


在FlyPlane.cpp中的init()函数添加如下代码

	//用单个处理事件添加鼠标监听事件auto listener = cocos2d::EventListenerTouchOneByOne::create();//用lambda表达式处理分解事件//Lambda表达式://	{} 类似于普通函数的函数体//	() 类似于普通函数的参数列表//	[] 默认Lambda表达式不能访问外部的变量,如果想访问外部变量,就通过中括号传进来listener->onTouchBegan = [=](cocos2d::Touch* touch, cocos2d::Event*) {auto touchPos = touch->getLocation();bool isContain = hero->getBoundingBox().containsPoint(touchPos);if(isContain) {m_vec = hero->getPosition() - touchPos;//my_vector,记录touchPos指向hero的向量}return isContain;};const float leftMinX = hero->getContentSize().width / 2;	//英雄的X最小值(左边界线)const float rightMaxX = VISIBLE_SIZE.width - hero->getContentSize().width / 2;//英雄X最大值(右边界线)const float downMinY = hero->getContentSize().height / 2;		//英雄Y最小值(下边界线)const float upMaxY = VISIBLE_SIZE.height - hero->getContentSize().height / 2; //英雄Y最大值(上边界线)listener->onTouchMoved = [=](cocos2d::Touch* touch, cocos2d::Event*) {		auto touchPos = touch->getLocation() + m_vec;//让英雄跟着手指动并且不超出边界hero->setPosition(cocos2d::Point(MAX(leftMinX, MIN(rightMaxX, touchPos.x)), MAX(downMinY, MIN(upMaxY, touchPos.y)))); };//将监听器添加到事件分配器上this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, hero);

添加后FlyPlane::init() 函数如下

bool FlyPlane::init() {//一定要先调用父类初始函数if( !cocos2d::Layer::init() ) {return false;}//使用精灵集需要两步//1、将美工做好的plist文件读取到缓存中//2、通过帧名字创建精灵并显示cocos2d::CCSpriteFrameCache::getInstance()->addSpriteFramesWithFile("shoot_background.plist");auto bg1 = cocos2d::Sprite::createWithSpriteFrameName("background.png");//把精灵bg1加到FlyPlane层中,第二个参数ZOrder表示距离用户的距离,第三个参数tag设为1this->addChild(bg1, -1, 1);//默认锚点为(0.5,0.5),只会显示一半的图,必须设置锚点为(0,0)bg1->setAnchorPoint(cocos2d::Point(0,0));//texture:纹理,通过精灵找到对应的纹理,并开启抗锯齿bg1->getTexture()->setAliasTexParameters();auto bg2 = cocos2d::Sprite::createWithSpriteFrameName("background.png");this->addChild(bg2, -1, 2);bg2->setAnchorPoint(cocos2d::Point(0,0));bg2->getTexture()->setAliasTexParameters();//添加英雄cocos2d::CCSpriteFrameCache::getInstance()->addSpriteFramesWithFile("shoot.plist");auto hero = cocos2d::Sprite::createWithSpriteFrameName("hero1.png");	hero->setPosition(VISIBLE_SIZE.width / 2, 100);this->addChild(hero, 0, 3);//为英雄添加飞行动作,动作由动画组成,所以得到动作对象前,需要先得到动画对象//一、创建动画对象//1.1通过create得到动画对象auto animation = cocos2d::Animation::create();	//1.2添加这个动画所要用的精灵帧animation->addSpriteFrame(cocos2d::SpriteFrameCache::getInstance()->getSpriteFrameByName("hero1.png"));animation->addSpriteFrame(cocos2d::SpriteFrameCache::getInstance()->getSpriteFrameByName("hero2.png"));//1.3设置切换时间animation->setDelayPerUnit(0.2f);//1.4循环次数,默认为1,设为-1使其无限循环animation->setLoops(-1);	//二、根据动画对象创建动作对象auto animate = cocos2d::Animate::create(animation);//三、让hero执行这个动作hero->runAction(animate);//用单个处理事件添加鼠标监听事件auto listener = cocos2d::EventListenerTouchOneByOne::create();//用lambda表达式处理分解事件//Lambda表达式://	{} 类似于普通函数的函数体//	() 类似于普通函数的参数列表//	[] 默认Lambda表达式不能访问外部的变量,如果想访问外部变量,就通过中括号传进来listener->onTouchBegan = [=](cocos2d::Touch* touch, cocos2d::Event*) {auto touchPos = touch->getLocation();bool isContain = hero->getBoundingBox().containsPoint(touchPos);if(isContain) {m_vec = hero->getPosition() - touchPos;//my_vector,记录touchPos指向hero的向量}return isContain;};const float leftMinX = hero->getContentSize().width / 2;	//英雄的X最小值(左边界线)const float rightMaxX = VISIBLE_SIZE.width - hero->getContentSize().width / 2;//英雄X最大值(右边界线)const float downMinY = hero->getContentSize().height / 2;		//英雄Y最小值(下边界线)const float upMaxY = VISIBLE_SIZE.height - hero->getContentSize().height / 2; //英雄Y最大值(上边界线)listener->onTouchMoved = [=](cocos2d::Touch* touch, cocos2d::Event*) {		auto touchPos = touch->getLocation() + m_vec;//让英雄跟着手指动并且不超出边界hero->setPosition(cocos2d::Point(MAX(leftMinX, MIN(rightMaxX, touchPos.x)), MAX(downMinY, MIN(upMaxY, touchPos.y)))); };//将监听器添加到事件分配器上this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, hero);//定时器。scheduleUpdate每帧调用一次update函数scheduleUpdate();return true;
}

运行操作英雄,发现必须要点中英雄才可以自由移动并且不会超过边界,BUG解决。



本节效果完成,下节讲添加子弹。

这篇关于基于cocos2dx的飞机大战学习[三]-为英雄添加飞行帧动作并控制飞机移动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092578

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识