《保卫萝卜2》主页面动画

  我们已经创建完《保卫萝卜2》主页面上的所有节点,并且正确摆放好了坐标以及层级(链接:https://blog.csdn.net/qq135595696/article/details/122605883),接下来我们实现主页面动画。

  如上图。在《保卫萝卜2》中,1号和5号怪物运行的动作为左右来回运动。2号怪物运行的动作是冲出来之后上下浮动。3号怪、4号和6号怪物也是一直上下浮动,6号怪物的做的是旋转运动,剩下一个萝卜为贝塞尔曲线运动。除了2号怪物的冲出动作和萝卜的运作之外,其它怪物运行的动作都是无限重复执行。

结果展示

代码实现

MainScene.h

#pragma once
#include "cocos2d.h"
#include "ui/CocosGUI.h"class MainScene :public cocos2d::Scene
{public:static cocos2d::Scene* createScene();virtual bool init();CREATE_FUNC(MainScene);
private:void InitSprite(cocos2d::Sprite*& outSprite, cocos2d::Node* parentNode, const std::string& fileName, float x, float y, int localZOrder);bool InitUI();bool InitUIAnimation();private:static float actionDuration;cocos2d::Sprite* _monster1;cocos2d::Sprite* _monster2;cocos2d::Sprite* _monster3;cocos2d::Sprite* _monster4;cocos2d::Sprite* _monster5;cocos2d::Sprite* _monster6;cocos2d::Sprite* _monster6Hand;cocos2d::Sprite* _carrot;
};

MainScene.cpp

#include "MainScene.h"
#include "SimpleAudioEngine.h"USING_NS_CC;
using namespace cocos2d::ui;float MainScene::actionDuration = 1.0f;cocos2d::Scene* MainScene::createScene()
{return MainScene::create();
}static void problemLoading(const char* filename)
{printf("Error while loading:%s\n", filename);printf("Depending on how you compiled you might have to add 'Resources/' in front of filenames in MainScene.cpp\n");
}void MainScene::InitSprite(cocos2d::Sprite*& outSprite, cocos2d::Node* parentNode, const std::string& fileName, float x, float y, int localZOrder)
{if (fileName == "MainMenu/front_front.png" || fileName == "MainMenu/front_smoke_3.png" || fileName == "MainMenu/front_smoke_1.png")outSprite = Sprite::create(fileName);else{auto pinfo = AutoPolygon::generatePolygon(fileName);outSprite = Sprite::create(pinfo);}if (nullptr == outSprite){outSprite = nullptr;problemLoading(fileName.c_str());return;}outSprite->setPosition(Vec2(x, y));parentNode->addChild(outSprite, localZOrder);
}bool MainScene::InitUI()
{if (!Scene::init())return false;auto visibleSize = Director::getInstance()->getVisibleSize();Vec2 origin = Director::getInstance()->getVisibleOrigin();//背景Sprite* rootNode = nullptr;InitSprite(rootNode, this, "MainMenu/zh/front_bg.png", origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2, -1);if (nullptr == rootNode)return false;//前置背景Sprite* frontNode = nullptr;InitSprite(frontNode, this, "MainMenu/front_front.png", origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2, 3);if (nullptr == frontNode)return false;//开始冒险按钮auto startGameBtn = Button::create("MainMenu/zh/front_btn_start_normal.png", "MainMenu/zh/front_btn_start_pressed.png", "null.png");if (nullptr == startGameBtn)problemLoading("MainMenu/zh/front_btn_start_normal.png||MainMenu/zh/front_btn_start_pressed.png");else{startGameBtn->setPosition(Vec2(origin.x + 562, origin.y + 384));this->addChild(startGameBtn, 1);}//天天向上按钮auto everyDayBtn = Button::create("MainMenu/zh/front_btn_floor_normal.png", "MainMenu/zh/front_btn_floor_pressed.png", "null.png");if (nullptr == everyDayBtn)problemLoading("MainMenu/zh/front_btn_floor_normal.png||MainMenu/zh/front_btn_floor_pressed.png");else{everyDayBtn->setPosition(Vec2(origin.x + 563, origin.y + 261));this->addChild(everyDayBtn, 1);}//锁Sprite* everyDayBtnLocked = nullptr;InitSprite(everyDayBtnLocked, everyDayBtn, "MainMenu/front_btn_floor_locked.png", everyDayBtn->getSize().width, everyDayBtn->getSize().height / 2, 1);if (nullptr == everyDayBtnLocked)return false;//Monster4_monster4 = nullptr;InitSprite(_monster4, this, "MainMenu/front_monster_4.png", origin.x + 227, origin.y + 475, 1);if (nullptr == _monster4)return false;_monster4->setScale(0.75);//设置按钮auto setUpBtn = Button::create("MainMenu/front_btn_setting_normal.png", "MainMenu/front_btn_setting_pressed.png", "null.png");if (nullptr == setUpBtn)problemLoading("MainMenu/front_btn_setting_normal.png||MainMenu/front_btn_setting_pressed.png");else{_monster4->addChild(setUpBtn, 1);setUpBtn->setPosition(Vec2(176, 89));}//保卫的萝卜_carrot = nullptr;InitSprite(_carrot, this, "MainMenu/front_carrot.png", origin.x + 920, origin.y + 90, 2);//起始坐标//origin.x + 960, origin.y + 50 //控制起始坐标//origin.x + 700, origin.y + 0 //控制结束坐标//origin.x + 620, origin.y + 14 //终点坐标if (nullptr == _carrot)return false;_carrot->setScale(0.45);//Monster6_monster6 = nullptr;InitSprite(_monster6, this, "MainMenu/front_monster_6.png", origin.x + 995, origin.y + 248, 1);if (nullptr == _monster6)return false;_monster6->setScale(0.75);//Monster6Hand_monster6Hand = nullptr;InitSprite(_monster6Hand, this, "MainMenu/front_monster_6_hand.png", origin.x + 894, origin.y + 256, -1);if (nullptr == _monster6Hand)return false;_monster6Hand->setScale(0.75);//答疑按钮auto confuseBtn = Button::create("MainMenu/front_btn_help_normal.png", "MainMenu/front_btn_help_pressed.png", "null.png");if (nullptr == confuseBtn)problemLoading("MainMenu/front_btn_help_normal.png||MainMenu/front_btn_help_pressed.png");else{_monster6Hand->addChild(confuseBtn, 0);confuseBtn->setPosition(Vec2(170, 405));}//Monster5_monster5 = nullptr;InitSprite(_monster5, this, "MainMenu/front_monster_5.png", origin.x + 882, origin.y + 155, 1);if (nullptr == _monster5)return false;_monster5->setScale(0.75);//烟雾2Sprite* smoke2 = nullptr;InitSprite(smoke2, this, "MainMenu/front_smoke_3.png", origin.x + 1020, origin.y + 165, 1);if (nullptr == smoke2)return false;//Monster3_monster3 = nullptr;InitSprite(_monster3, this, "MainMenu/front_monster_3.png", origin.x + 160, origin.y + 190, 1);if (nullptr == _monster3)return false;_monster3->setScale(0.75);//Monste1_monster1 = nullptr;InitSprite(_monster1, this, "MainMenu/front_monster_1.png", origin.x + 230, origin.y + 155, 1);if (nullptr == _monster1)return false;_monster1->setScale(0.85);//烟雾1Sprite* smoke1 = nullptr;InitSprite(smoke1, this, "MainMenu/front_smoke_1.png", origin.x + 120, origin.y + 170, 1);if (nullptr == smoke1)return false;if (!InitUIAnimation())return false;return true;
}bool MainScene::InitUIAnimation()
{//1号和5号怪物动作auto monster15MoveBy1 = MoveBy::create(actionDuration * 2, Vec2(7, 0));auto monster15MoveBy2 = MoveBy::create(actionDuration * 2, Vec2(-7, 0));auto monster15Seq = Sequence::create(monster15MoveBy1, monster15MoveBy2, nullptr);_monster1->runAction(RepeatForever::create(monster15Seq));_monster5->runAction(RepeatForever::create(monster15Seq->clone()));//3号、4号和6号怪物(以及其手臂)动作auto monster346MoveBy1 = MoveBy::create(actionDuration * 2, Vec2(0, 7));auto monster346MoveBy2 = MoveBy::create(actionDuration * 2, Vec2(0, -7));auto monster346Seq = Sequence::create(monster346MoveBy1, monster346MoveBy2, nullptr);_monster3->runAction(RepeatForever::create(monster346Seq));_monster4->runAction(RepeatForever::create(monster346Seq->clone()));_monster6->runAction(RepeatForever::create(monster346Seq->clone()));_monster6Hand->runAction(RepeatForever::create(monster346Seq->clone()));//Monster2初始化及2号怪物动作_monster2 = Sprite::create(AutoPolygon::generatePolygon("MainMenu/front_monster_2.png"));if (nullptr == _monster2){problemLoading("MainMenu/front_monster_2.png");return false;}_monster2->setScale(0.75);this->addChild(_monster2, 1);auto monster2MoveTo = MoveTo::create(actionDuration * 0.5, Vec2(Director::getInstance()->getVisibleOrigin().x + 342, Director::getInstance()->getVisibleOrigin().y + 140));auto monster2Seq = Sequence::create(monster2MoveTo, CallFunc::create([&]() {auto monster2MoveBy1 = MoveBy::create(actionDuration * 0.55, Vec2(0, 7));auto monster2MoveBy2 = MoveBy::create(actionDuration * 0.55, Vec2(0, -7));auto monsterSeq = Sequence::create(monster2MoveBy1, monster2MoveBy2, nullptr);_monster2->runAction(RepeatForever::create(monsterSeq));}), nullptr);_monster2->runAction(monster2Seq);//萝卜动作(贝塞尔曲线+缩放并行,即贝塞尔曲线加缩放并行运动)ccBezierConfig controlPointTo;controlPointTo.controlPoint_1.set(Director::getInstance()->getVisibleOrigin().x + 960, Director::getInstance()->getVisibleOrigin().y + 50);controlPointTo.controlPoint_2.set(Director::getInstance()->getVisibleOrigin().x + 700, Director::getInstance()->getVisibleOrigin().y + 0);controlPointTo.endPosition.set(Director::getInstance()->getVisibleOrigin().x + 620, Director::getInstance()->getVisibleOrigin().y + 14);auto carrotBezierTo = BezierTo::create(actionDuration * 0.5, controlPointTo);auto carrotScaleTo = ScaleTo::create(actionDuration * 0.5, 0.75);auto carrotSpawn = Spawn::createWithTwoActions(carrotBezierTo, carrotScaleTo);_carrot->runAction(carrotSpawn);return true;
}bool MainScene::init()
{if (!InitUI())return false;return true;
}

基于Cocos2d-x开发guardCarrot--4 《保卫萝卜2》主页面动画相关推荐

  1. iOS 5 cocos2d游戏开发实战(第2版)

    <iOS 5 cocos2d游戏开发实战(第2版)> 基本信息 作者: [美]Steffen Itterheim Andreas Low [作译者介绍] 译者: 同济大学苹果俱乐部 丛书名 ...

  2. Cocos2d游戏开发学习记录——4.开发《植物大战僵尸》

    文章目录 1.植物大战僵尸 2.开发前导 3.载入页面 4.菜单页面 & 预备战斗页面 5.植物准备页面 6.正式战斗页面 7.战斗逻辑 8.向日葵逻辑 9.进度条逻辑 10.音乐逻辑 11. ...

  3. TensorRT 基于Yolov3的开发

    TensorRT 基于Yolov3的开发 Models Desc tensorRT for Yolov3 https://github.com/lewes6369/TensorRT-Yolov3 Te ...

  4. 为什么您应该使用基于标准的开发实践

    为什么您应该使用基于标准的开发实践 Why you should use standards-based development practices (even if you don't have t ...

  5. 应用基于资产的开发到 SOA 的服务中1

    SOA 的主要原则之一是在整个 SOA 生命周期中将服务视为可重用资产.因此,务必在 SOA 中对服务应用正式的资产开发流程和指南.本文可帮助 IT 架构师.项目经理和 SOA 管理员全面了解一些主要 ...

  6. mysql for循环_基于Swoole扩展开发异步高性能的MySQL代理服务器

    MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...

  7. 基于.Net Core开发现代化Web应用程序系列课程和文章

    这个系列课程是Anduin2017在B站上传的: 基于.Net Core开发现代化Web应用程序系列课程第1课之:课程简介 基于.Net Core开发现代化Web应用程序系列课程第2课之:.Net平台 ...

  8. geany配置python_Linux系统下搭建基于Geany+Python开发环境

    Linux系统下搭建基于Geany+Python开发环境 一.升级python mkdir /usr/local/python3 # tar xvf Python-3.6.1.tar.xz # 解压文 ...

  9. 你也可以玩转Skype -- 基于Skype API开发外壳程序入门

    原文:你也可以玩转Skype -- 基于Skype API开发外壳程序入门 Skype是目前这个星球上最厉害的IM+VOIP软件,Skype现在已经改变了全球2.8亿人的生活方式.你,值得拥有! :) ...

  10. 官宣!微软宣布桌面版 Edge将基于Chromium进行开发\n

    今天,Windows副总裁Joe Belfiore在Windows官方博客上正式宣布桌面版 Edge将基于Chromium进行开发,以减少Web开发生态的碎片化,为用户提供更高的Web兼容性,这一消息 ...

最新文章

  1. 思科PIX防火墙的实际应用配置
  2. .bat文件(%~dp0)和call、echo批处理环境变量
  3. 自学架构设计的一个好方法
  4. android 获取sd卡目录失败_树莓派对SD卡的大小,速度有哪些要求?
  5. kibana 后台启动
  6. Python python 五种数据类型--字符串
  7. ASTreeView 1.4.0发布(ASP.NET树控件)
  8. linux性能测试工具的记录
  9. 如何排查Java内存泄露(内附各种排查工具介绍)
  10. 2021边缘保研经历(整个大三),川大 - 浙大软院
  11. 利用pyecharts实现中国省与市之间的跳转
  12. java格式化mac地址,java格式化mac地址(加分隔符,去分隔符)
  13. 程序人生 - 只要看这一篇,车险全搞懂(值得收藏)
  14. 双硬盘好还是纯固态好学计算机专业,固态硬盘虽好,但是和机械硬盘相比还是有其“不足之处”...
  15. PHP 加密、解密工具Zend Guard和ionCube
  16. mycat分库分表与读写分离
  17. Linux环境yum,安装MySQL
  18. 微信机器人,实时获取好友、群消息,拉取朋友圈数据
  19. “动吧“ - crud 练习 part7 - Shiro安全框架简介 - 58~60 - 、[扩展] - 动态菜单 - 60
  20. Mac 版本ScreenFlow软件英文版安装成功后非英文版,比如日语等,解决方案。

热门文章

  1. step-by-step: 夕小瑶版神经网络调参指南
  2. 【C++】C++中你不了解的类型转换
  3. 百面机器学习——svm使用信息熵寻找最优划分
  4. python—符号 | ^的使用
  5. 3.3 决策树分类与回归实战
  6. pytorch相关用法
  7. PLA算法(感知机)
  8. pytorch 动态图机制
  9. Coursera视频无法观看的三种不同解决方法(亲测有效)
  10. 人脸检测-Haar分类器方法