基于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

相关文章

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea