深入解析:cocos 添加背景,帧动画,贴图

news/2025/9/27 10:51:11/文章来源:https://www.cnblogs.com/tlnshuju/p/19114834

深入解析:cocos 添加背景,帧动画,贴图

2025-09-27 10:49  tlnshuju  阅读(0)  评论(0)    收藏  举报

// 包含必要的头文件
#include "HelloWorldScene.h" // 引入当前场景类的头文件
#include "ui/CocosGUI.h" // 引入 Cocos2d-x 的 UI 控件模块(虽然当前代码未直接使用,但为后续扩展准备)

USING_NS_CC; // 使用 Cocos2d-x 命名空间,简化代码书写

// 创建场景的静态方法,用于初始化并返回一个 Scene 对象
Scene* HelloWorld::createScene()
{
Scene* scene = Scene::create(); // 创建一个场景对象
HelloWorld* layer = HelloWorld::create(); // 创建一个 HelloWorld 层对象
scene->addChild(layer); // 将层添加到场景中
return scene; // 返回创建好的场景
}

// 初始化层的技巧,在 create() 内部自动调用
bool HelloWorld::init()
{
if (!Layer::init()) // 调用父类的初始化方法,确保基础特性正常
{
return false; // 如果初始化失败,返回 false
}

Size visibleSize = Director::getInstance()->getVisibleSize(); // 获取当前设备的可见区域尺寸
Vec2 origin = Director::getInstance()->getVisibleOrigin(); // 获取可见区域的起点坐标(某些设备可能不是从 0,0 开始)

// 背景
Sprite* background = Sprite::create("./res (2)/No.2/fengmian_bg0.png"); // 创建背景精灵
if (background != nullptr) // 检查精灵是否创建成功(防止图片加载失败)
{
background->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y)); // 设置背景位置为屏幕中心
this->addChild(background, 0); // 将背景添加到当前层,zOrder 为 0,表示最底层
}

// 墙壁
Sprite* wall = Sprite::create("./res (2)/no.2/fengmian_bg1.png"); // 创建墙壁精灵
if (wall != nullptr)
{
wall->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y)); // 同样设置到屏幕中心
this->addChild(wall, 1); // zOrder 为 1,表明在背景之上
}

// 人物
Sprite* person = Sprite::create("./res (2)/no.2/fm_renwu.png"); // 创建人物精灵
if (person != nullptr)
{
person->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y)); // 设置到屏幕中心
this->addChild(person, 2); // zOrder 为 2,表现在墙壁之上
}

// 音乐按钮
Sprite* music = Sprite::create("./res (2)/no.2/sound_off_btn.png"); // 创建音乐按钮精灵
if (music != nullptr)
{
music->setPosition(Vec2(50, 54)); // 设置到屏幕左下角附近
this->addChild(music, 3); // zOrder 为 3,显示在人物之上
}

// 剧情按钮
Sprite* plot = Sprite::create("./res (2)/no.2/youxiyuanzuo_btn.png"); // 创建剧情按钮精灵
if (plot != nullptr)
{
plot->setPosition(Vec2(430, 54)); // 设置到屏幕右下角附近
this->addChild(plot, 3); // zOrder 为 3,与音乐按钮同一层级
}

// 灯笼
Sprite* lantern = Sprite::create("./res (2)/no.2/fm_denglong.png"); // 创建灯笼精灵
if (lantern != nullptr)
{
lantern->setPosition(Vec2(300, 500)); // 设置到屏幕上方
lantern->setAnchorPoint(Vec2(0.5f, 0.9f)); // 设置锚点为灯笼顶部偏下一点,便于摆动效果
lantern->setRotation(35.0f); // 初始旋转角度,偏向右侧
this->addChild(lantern, 3); // zOrder 为 3

// 灯笼摆动动画
RotateTo* swingRight = RotateTo::create(2.5f, 35.0f); // 向右旋转到 35 度,耗时 2.5 秒
RotateTo* swingLeft = RotateTo::create(2.5f, -35.0f); // 向左旋转到 -35 度,耗时 2.5 秒
Sequence* swingSequence = Sequence::create(swingRight, swingLeft, nullptr); // 创建一个序列,先右后左
RepeatForever* repeatSwing = RepeatForever::create(swingSequence); // 无限重复这个序列
lantern->runAction(repeatSwing); // 让灯笼执行这个无限摆动动画
}

// 眼睛动画1
Sprite* eyex = Sprite::create("./res (2)/no.2/fm_hs_eye1.png"); // 创建第一个眼睛精灵
if (eyex != nullptr)
{
this->addChild(eyex, 4); // zOrder 为 4,显示在按钮和灯笼之上
eyex->setPosition(visibleSize.width - 120, visibleSize.height / 2 - 75); // 设置到屏幕右侧中间偏下

// 创建帧动画
Animation* animation = Animation::create(); // 创建一个动画对象
for (int i = 1; i < 4; i++)
{
std::string str = String::createWithFormat("./res (2)/no.2/fm_hs_eye%d.png", i)->_string; // 循环加载 3 张图片
animation->addSpriteFrameWithFile(str); // 将每一帧添加到动画中
}
animation->setDelayPerUnit(0.3f); // 每帧间隔 0.3 秒
animation->setRestoreOriginalFrame(true); // 动画结束后恢复到第一帧

Animate* animate = Animate::create(animation); // 创建动画动作
RepeatForever* repeat = RepeatForever::create(animate); // 无限重复动画
eyex->runAction(repeat); // 让眼睛执行这个无限循环动画
}

// 眼睛动画2
Sprite* eye = Sprite::create("./res (2)/no.2/fm_xlk_eye1.png"); // 创建第二个眼睛精灵
if (eye != nullptr)
{
this->addChild(eye, 4); // zOrder 为 4
eye->setPosition(Vec2(195, 470)); // 设置到屏幕左上方

Animation* eyeAnimation = Animation::create(); // 创建动画对象
for (int i = 1; i < 4; i++)
{
std::string str = String::createWithFormat("./res (2)/no.2/fm_xlk_eye%d.png", i)->_string; // 循环加载 3 张图片
eyeAnimation->addSpriteFrameWithFile(str); // 添加每一帧
}
eyeAnimation->setDelayPerUnit(0.3f); // 每帧间隔 0.3 秒
eyeAnimation->setRestoreOriginalFrame(true); // 动画结束后恢复第一帧

Animate* eyeAnimate = Animate::create(eyeAnimation); // 创建动画动作
RepeatForever* eyeRepeat = RepeatForever::create(eyeAnimate); // 无限重复
eye->runAction(eyeRepeat); // 执行动画
}

return true; // 初始化成功,返回 true
}

// 关闭按钮的回调函数(虽然当前代码未使用,但保留模板)
void HelloWorld::menuCloseCallback(Ref* pSender)
{
Director* director = Director::getInstance(); // 获取导演单例
director->end(); // 结束当前游戏场景

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0); // 在 iOS 平台,强制退出程序
#endif
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

B站油管抖音一键笔记

在最近,我有一个需求就是需要对视频内容进行一个总结,做成一个笔记,但是又不想自己手动去写,于是我找到了一个项目 BiliNote,BiliNote 是一个开源的 AI 视频笔记助手,支持通过哔哩哔哩、YouTube、抖音等视频链接…

网站安装出现dir更改wordpress地址

集成swagger2的时候swagger-ui.html页面的v2/api-docs接口报404 尝试网上说的权限、包版本不一致、资源路径映射问题&#xff0c;发现都没有问题。 单独访问v2/api-docs接口的时候报 Swagger2Controller Unable to find specification for group 查看相关代码&#xff1a; …

成熟网站开发联系电话陕西网

简介&#xff1a;OpenKruise 是针对 Kubernetes 的增强能力套件&#xff0c;聚焦于云原生应用的部署、升级、运维、稳定性防护等领域。 云原生应用自动化管理套件、CNCF Sandbox 项目 -- OpenKruise&#xff0c;近期发布了 v1.0 大版本。 OpenKruise[1] 是针对 Kubernetes 的…

网站设计公司官网如何设计购物网站

Java流程控制语句有三种&#xff1a; 顺序结构、分支结构和循环结构。 顺序结构&#xff1a; 顺序结构语句是Java程序默认的执行流程&#xff0c;按照代码的先后顺序&#xff0c;从上到下依次执行。 原文链接&#xff1a; Java流程控制控制语句 - 红客网络编程与渗透技术 示例…

介绍自己

大家好!我是一个数据科学与大数据技术专业的大三学生。在日常生活中我有着许多的兴趣爱好打羽毛球、听音乐、做手工。技能树与专业规划 当前技术能力 编程基础:稍微掌握Python数据处理(Pandas、NumPy) 数据库技能:…

pycharm更换国内源

1、找到pip.ini2、记事本修改 [global] timeout = 6000 index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = https://pypi.tuna.tsinghua.edu.cn

基于Python+Vue开发的反诈视频宣传管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的反诈视频宣传管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习…

MySQL中的空间碎片率计算分析 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站开发财务预算企业手机网站建设流程

以下部门功能在lucene5以上版本可能有的API所有改变 目录1.简介 2.了解索引操作 2.1倒排索引 2.2字段类型 2.3细分 2.4文件编号 2.5搜索索引 3.创建索引 4.基本索引操作 4.1核心索引类 4.2将数据添加到索引 5.文件和领域 5.1文件 5.2领域 5.3在Lucene中增强文档 1.简介 该索引是…

为什么网站目录不收录seowhy问答

一、初识 1.1 基础 1.1.1 语言速成课 1.1.1.1 变量 ​ 变量是存储值的容器。首先用let关键字声明一个变量&#xff0c;后面跟着你给变量的名字 ​ 变量命名区分大小写 ​ 分号在JavaScript中是用来分隔语句的&#xff0c;但是如果语句后面有一个换行符(或者在{block}中只…

网站推广营销潞城建设局网站

题目要求&#xff1a;判断一棵树是否为平衡二叉树 思路&#xff1a;递归地比较左右子树&#xff0c;只要有一棵子树不满足条件就说明这棵树不是平衡二叉树。本题采用迭代法较为复杂。 leetcode实战&#xff1a; 代码实现&#xff1a; 递归&#xff1a; 迭代&#xff1a;

商城网站都有什么功能设计交易平台哪个好

SoMeLVLM: A Large Vision Language Model for Social Media Processing 论文地址: https://arxiv.org/abs/2402.13022https://arxiv.org/abs/2402.13022发表在ACL 2024 1.概述 在线社交媒体平台涌现出海量的文本与视觉内容,深刻揭示了人们如何交流、互动以及自我表达。随着通…

发帖百度秒收录网站分享中太建设集团股份有限公司官方网站

引言 前端开发中&#xff0c;数据的复制是一个常见的操作。尤其是在处理对象和数组时&#xff0c;我们需要考虑的是一个浅拷贝还是深拷贝。那么&#xff0c;什么是深拷贝和浅拷贝&#xff1f;它们在前端开发中有什么作用&#xff1f;如何实现这两种拷贝&#xff1f;这是我们在…

对于Hash冲突的处理

对于Hash冲突的处理求最小冲突质数 for(int i = 100000; ; ++ i){bool flag = true;for(int j = 2; j * j <= i; ++ j)if(i % j == 0) {flag = false;break;}if(flag) {cout << i << endl;break;}

完整教程:事件驱动与CDS:基于FHIR R5 Subscriptions与Bulk Data的再考察(上)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

关于SeaTunnel 达梦数据迁移无法自动建表的问题

关于SeaTunnel 达梦数据迁移无法自动建表的问题Posted on 2025-09-27 10:33 漂泊雪狼 阅读(0) 评论(0) 收藏 举报当sink库为达梦库时,schema_save_mode 设置为"CREATE_SCHEMA_WHEN_NOT_EXIST",希望它…

大模型agent综述:A Survey on Large Language Model based Autonomous Agents - 详解

大模型agent综述:A Survey on Large Language Model based Autonomous Agents - 详解2025-09-27 10:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; o…

电脑做服务器发布网站大连旅顺网站制作

在CSS中&#xff0c;我们要给一个元素定义样式&#xff0c;首先得把这个元素选出来&#xff0c;我在网上看了很多文章&#xff0c;再结合老师所讲的精华部分将平时比较常用的选择器整理出来分享给大家&#xff0c;哈哈哈一起学习一起进步&#xff01; https://blog.csdn.net/ha…

微服务去掉认证的功能

微服务去掉认证的功能1.概述 我们的微服务是通过网关做统一安全认证的,服务的后端接口不需要做安全认证,有些情况下,我们引入了 spring-authrization-server 的依赖,这个时候服务就会自动启动认证服务,当访问接口…