学习cocos2d-x之路(4)--实现Hero在各个方向移动

2023-11-07

为了实现在4个方向Hero的运动,创建枚举变量

typedef enum{
   keyDown=0,
   keyLeft=1,
   keyUp=2,
   keyRight=3,
 }HeroDirection;      

注意:    此处枚举变量的设置要按照英雄图片中的方向设置,需要定义在类声明中。

将createHeroSprite(),进行修改,声明为 cocos2d::CCAnimation* createHeroAnimation(HeroDirection direction);   

声明两个成员变量:

cocos2d::CCAnimation ** walkAnimations;
 cocos2d::CCSprite * heroSprite;

声明移动的回调函数:

void menuMoveCallback(CCObject * pSender);

注意: 默认创建的工程只有.cpp中 使用了   using namespace cocos2d. 如果要在类声明中使用cocos2d类,必须加 cocos2d::  或者 添加using namespace cocos2d,否则会报一堆莫名其妙的错误,我被这个错误痛苦折磨了一个小时发火

函数体修改为:

cocos2d::CCAnimation* HelloWorld::createHeroAnimation(HeroDirection direction)
{
 
 CCTexture2D *heroTex=CCTextureCache::sharedTextureCache()->addImage("hero.png");
 CCSpriteFrame * frame0,*frame1,*frame2,*frame3;
 frame0=CCSpriteFrame::createWithTexture(heroTex,CCRectMake(32*0,direction*32,32,32));    //通过方向控制纹理图的帧数
 frame1=CCSpriteFrame::createWithTexture(heroTex,CCRectMake(32*1,direction*32,32,32));
 frame2=CCSpriteFrame::createWithTexture(heroTex,CCRectMake(32*2,direction*32,32,32));
 frame3=CCSpriteFrame::createWithTexture(heroTex,CCRectMake(32*3,direction*32,32,32));
 CCArray * animFrames= CCArray::create();
 animFrames->addObject(frame0);
 animFrames->addObject(frame1);
 animFrames->addObject(frame2);
 animFrames->addObject(frame3);
 CCAnimation * animation=CCAnimation::createWithSpriteFrames(animFrames,0.2);
 animFrames->release();

// heroSprite->setPosition(ccp(32))
 return animation;

}

在HelloWorld::init()中创建精灵:

 

walkAnimations=new CCAnimation *[4];                                         //创建四个方向的动画。在这里创建的动画依然不能在控制移动的回调函数中使用
  walkAnimations[keyDown]=createHeroAnimation(keyDown);      //暂时不清除原因
  walkAnimations[keyLeft]=createHeroAnimation(keyLeft);
  walkAnimations[keyRight]=createHeroAnimation(keyRight);
  walkAnimations[keyUp]=createHeroAnimation(keyUp);

CCAnimationFrame * panimationFrame=

dynamic_cast<CCAnimationFrame*>(walkAnimations[keyDown]->getFrames()->objectAtIndex(0));         //获得第一帧
  CCSpriteFrame * pspriteFrame=panimationFrame->getSpriteFrame();                                       //转化为SpriteFrame
  heroSprite=CCSprite::createWithSpriteFrame(pspriteFrame);                                                  //使用第一帧创建精灵
  heroSprite->setPosition(ccp(32,32));
  addChild(heroSprite);

创建四个方向按钮

CCMenuItem *down=CCMenuItemFont::create("down", this, menu_selector(HelloWorld::menuMoveCallback));     //移动的回调函数
  CCMenuItem *left=CCMenuItemFont::create("left", this, menu_selector(HelloWorld::menuMoveCallback));
  CCMenuItem *right=CCMenuItemFont::create("right", this, menu_selector(HelloWorld::menuMoveCallback));
  CCMenuItem *up=CCMenuItemFont::create("up", this, menu_selector(HelloWorld::menuMoveCallback));
  down->setTag(keyDown);
  left->setTag(keyLeft);
  right->setTag(keyRight);
  up->setTag(keyUp);
  CCMenu *menu=CCMenu::create(down,left,right,up,NULL);
  menu->alignItemsHorizontallyWithPadding(50);
  addChild(menu);

编写移动的回调函数:

void HelloWorld::menuMoveCallback(CCObject *pSender){
 CCNode *node=(CCNode *) pSender;
 HeroDirection targetDirection=(HeroDirection) node->getTag();
 CCAnimate * animate=CCAnimate::create(createHeroAnimation(targetDirection));
 CCPoint moveByPosition;
 //根据方向计算移动的距离
 switch (targetDirection) {
 case keyDown:
  moveByPosition=ccp(0,-32);
  break;
 case keyLeft:
  moveByPosition=ccp(-32,0);
  break;
 case keyRight:
  moveByPosition=ccp(32,0);
  break;
 case keyUp:
  moveByPosition=ccp(0,32);
  break;
 default:
  break;
 }

//CCMoveBy实现咋指定时间内移动指定距离

//CCSpanwn实现多个动作同时发生
CCMoveBy *moveBy=CCMoveBy::create(0.28f,moveByPosition);
 CCSpawn * spawn=CCSpawn::create(animate,moveBy,NULL);
 CCAction *action=CCSequence::create(spawn,NULL);

 //创建不断重复的动画,并让heroSprite播放
 heroSprite->runAction(action);
}

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习cocos2d-x之路(4)--实现Hero在各个方向移动 的相关文章

  • UncaughtExceptionHandler异常处理机制

    解释 UncaughtExceptionHandler类是java1 5里新增的 Thread类里面的一个函数式接口类的 类名意思为 未捕获的异常处理 该类的注释接口意思 接口处理器时调用线程突然终止 由于未捕获到异常 当一个线程要终止由于
  • mysql json字段长度_mysql5.7 新增的json字段类型

    一 我们先创建一个表 准备点数据 CREATE TABLE json test id int 11 unsigned NOT NULL AUTO INCREMENT COMMENT ID json json DEFAULT NULL COM
  • java什么场景使用克隆,Java设计模式----原型模式(克隆模式)

    场景 思考一下 克隆技术是怎么样的过程 JavaScript语言中的 继承怎么实现 那里面也有prototype 原型模式 通过new产生一个对象需要繁琐的数据准备或访问权限 则可以使用原型模式 就是java中的克隆技术 以某个对象为原型
  • Qt 搜索框

    一 前言 用户需要输入文本时 可使用QLineEdit控件进行编辑输入 缺点是样式相对单一 在使用百度搜索输入框时 发觉比较人性化 故采用QLineEdt QPushButton通过css样式实现自定义搜索框控件 包含如下功能 1 可设置占
  • 用 ChatGPT 解锁生成式游戏#StoryGames.AI

    生成式游戏 AI 是一种基于人工智能技术 自动生成游戏故事情节 关卡 角色等内容的游戏 AI ChatGPT 的发展生成式游戏 AI 产生了重要影响 为游戏开发者提供了更加灵活 自由的创作方式 每个人都有机会开发自己的专属游戏 StoryG
  • 调试最长的一帧(第16天)

    终于到达绘制了 先看总体流程阶段 然而 从并行堆栈上看 已经有渲染线程开启了 跟着电子书走 先是介绍 抄一抄 加深印象 osg的场景渲染过程可以简单地分为三个阶段 用户APP阶段 更新用户数据 负责场景对象的运动和管理等 筛选cull阶段
  • 这是基于maven管理的SpringBoot项目的mongodb测试笔记,只测试了最基本的增删改查和一些踩过的坑。

    这是基于maven管理的SpringBoot项目的mongodb测试笔记 只测试了最基本的增删改查和一些踩过的坑 一 项目的依赖配置
  • 小米万兆路由器安装homeassistant并接入homekit教程

    1 做好准备工作 正常运行docker并启动docker命令行 参考参考链接中的b站视频 2 拉取homeassistant docker pull homeassistant home assistant 3 设置homeassistan
  • 浅谈依赖注入

    最近几天在看一本名为Dependency Injection in NET 的书 主要讲了什么是依赖注入 使用依赖注入的优点 以及 NET平台上依赖注入的各种框架和用法 在这本书的开头 讲述了软件工程中的一个重要的理念就是关注分离 Sepa
  • mysql数据库的优缺点

    优点1 通常存储过程 标题有助于提高应用程序的性能 因为当你创建他的时候就已经编译了 只不过是按需编译的 2 存储过程有助于减少应用程序和数据库服务器之间的流量 因为应用程序不必发送多个冗长的SQL语句 而只能发送存储过程的名称和参数 3
  • IDEA卡死解决

    找到IDEA的安装目录bin 修改这个文件 修改为 Xms128m Xmx1024m XX MaxPermSize 250m XX ReservedCodeCacheSize 150m
  • STM32外部中断

    参考正点原子视频 外部中断概述 外部中断是单片机实时地处理外部事件的一种内部机制 当某种外部事件发生时 单片机的中断系统将迫使CPU暂停正在执行的程序 转而去进行中断事件的处理 中断处理完毕后 又返回被中断的程序处 继续执行下去 STM32
  • 大疆无人机的新玩法?Payload SDK 了解一下

    一则小新闻 两个新产品 美国时间 3 月 28 日 大疆在加州门洛帕克的消防局总局低调发布了两款新的产品 一款是此前与 FLIR 合作开发的热成像相机 Zenmuse XT 的升级产品 Zenmuse XT2 另一款则是钟德夫更为关注并且会
  • h5 实现一键复制到粘贴板 兼容iOS

    效果展示 先贴上测试连接 http cdn foundao com zhaosheng copytext 实现原理 采用 document execCommand copy 来实现复制到粘贴板功能 复制必须是选中input框的文字内容 然后

随机推荐

  • JNDI数据源的连接属性

    如果无须HIbernate自己管理数据源 而是直接访问容器管理数据源 Hibernate可使用JNDI Java命名目录接口 数据源的相关配置 下面是连接JNDI数据源的主要配置属性 hibernate connection datasou
  • Java 加减乘除 int、long、float、double四种类型

    在学习了基本数据类型之后 内容如下 计算题 假如今天逛超市花了99 99 请用加减乘除 进行计算得到99 99这个结果 要求 1 4个方法 2 数值随意编写 3 数值要用到int long float double四种类型 4 都是返回值
  • Win10在BIOS中如何启用虚拟化(VT)

    文章目录 1 VT技术简介 2 如何进入BIOS 3 如何在BIOS中开启VT 1 VT技术简介 VT 就是虚拟化技术 Virtualization Technology 的缩写 Intel VT就是指Intel的虚拟化技术 这种技术简单来
  • ThreadLocal使用 --用于保存每个登录用户的信息-userInfo

    有时我们需要知道每个用户的登录信息 一般我们是将登录的用户信息是保存在session范围内 而我们在DAO中要是使用用户的某些信息 比哪录录ID 单位ID之类的信息进行过滤时 需要从从control 层传到 sevice层 再传到DAO层
  • 服务器的tls协议,ssl – Nginx中每台服务器的不同TLS协议

    这似乎是Nginx中的一个错误 我也在https serverfault com a 827794 318927发布了这个答案 它始终只使用第一个服务器块中的ssl protocols指令并忽略任何后续服务器块 在我的情况下 我有许多虚拟服
  • C/C++项目调用外部exe程序方法

    前言 在开发项目的时候 有的时候需要调用外部exe文件 那么在C C 里面直接调用exe文件的方法有哪些呢 现在可考虑的方法主要有 使用system函数 使用execl或者execv函数 使用WinExec函数 使用CreateProces
  • 归并排序——将两个有序表直接归并为一个有序表

    归并排序是多次将两个或两个以上的有序表合并成一个新的有序表 最简单的归并是直接将两个有序的子表合并成一个有序的表 即二路归并 二路归并的排序基本思想是 将a 0 n 1 看成是n个长度为1的有序序列 然后进行两两归并 得到n 2 向上取整
  • 终端业务组件化的几点思考

    终端业务组件化的几点思考 在软件开发领域 组件化是一种重要的架构模式 它可以将复杂的系统划分为独立的功能模块 以便于开发 维护和重用 在终端业务开发中 采用组件化的方式能够有效地提高开发效率和代码质量 本文将探讨终端业务组件化的几个关键问题
  • VSCode 中,TS 提示 ”无法找到 *.vue 声明文件“ 的解决方案

    在使用 VSCode 开发 Vue3 TS 项目时 编辑器一直有一个报错 因为不影响编译和运行 所以就一直没在意 但这两天看着这红杠提示实在是太别扭 今天就来解决一下这个问题 还自己一个清爽的开发环境 在网上查找了很多资料 靠谱的不好找 但
  • 腾讯会议连接蓝牙耳机没有声音 - 解决方案

    手机端 手机端连接蓝牙耳机没有声音 打开腾讯会议的附近设备权限 电脑端 电脑端连接蓝牙耳机没有声音 问题原因 腾讯会议会自动连接使用蓝牙耳机的麦克风 导致耳机为了同时保证输出输入带宽进入了通讯模式 hands free 而腾讯会议设置中无法
  • Debuggers and Related Tools

    Debuggers and Related Tools The last resort in debugging modules is using a debugger to step through the code watching t
  • 同时遍历多个数组并放入一个新数组里

    arrAuthor foreach arrTitle as key gt value array push arrAuthor title gt value author gt arrName key 新一维数组 order gt arrO
  • vue使用element-ui

    1 安装node js 输入node v 和 npm v 分别查看版本号 验证是否成功 2 安装淘宝镜像 也可不用 只是加快资源下载 npm install g cnpm registry http registry npm taobao
  • 【安装Ubuntu18.04遇到的问题】未找到WIFI适配器

    大家好 我是小政 好久没有更新文章 近期开始陆续分享一些研究生阶段正在学习的知识和遇到的一些问题 联想拯救者Y9000P关于安装Ubuntu未找到WIFI适配器的解决方法 1 Ubuntu18 04 2 网卡信息 3 解决方法 1 用手机U
  • 程序猿小哥哥无坚不摧,竟然是因为……

    因为会画图 不好意思 本拐无节操的标题党了一下 嘿嘿但是本篇本拐确实想和大家叨逼叨一下程序员的画图功夫一个只会写代码的程序员 肯定不是一个优秀的程序员 因为对于程序猿来说没有什么工作是可以低头就开整的也就是说 万物万码都有一个设计的过程这种
  • 删除流氓360首页

    不管你使用什么浏览器都很容易中招360给你自动设置的流氓首页 流氓厂石锤了 你在浏览器设置新的首页一样无效 比如 完全没有卵用 以前这样是可以生效的 最近几天突然不行了 这简直流氓的不行 而且 细心会发现 右键浏览器图标 属性 快捷方式这能
  • 2023JavaWeb面试问答_MyBatis

    谈谈你对 MyBatis 的理解 Mybatis是一个半ORM 对象关系映射 框架 它内部封装了 JDBC 开发时只需要关注 SQL 语句本身 不需要花费精力去处理加载驱动 创建连接 创建 Statement 等繁杂的过程 程序员直接编写原
  • 从程序员到等保测评师,多亏这个决定看到了希望

    做程序员的一年后 加班成隐 头秃了不说 感觉没有奔头 女朋友也不知道在哪里 一不小心公司后台被攻击崩溃了整夜加班是常事 解决不了少不了挨批 总之程序员太难了 我丧失了对未来的希望 后来因为公司一次攻击事件 有幸和测评机构的等保测评师探讨了一
  • Arduino PID 控制教程

    参考 在控制系统中 控制器在出现错误和干扰时将特定系统的输出校正为所需的输入 最流行的控制器类型是PID 它是P运动 异构和D的缩写 在这个Arduino PID控制教程中 我将告诉你如何在你的项目中使用这样的控制器 应用PID代码 5个重
  • 学习cocos2d-x之路(4)--实现Hero在各个方向移动

    为了实现在4个方向Hero的运动 创建枚举变量 typedef enum keyDown 0 keyLeft 1 keyUp 2 keyRight 3 HeroDirection 注意 此处枚举变量的设置要按照英雄图片中的方向设置 需要定义