《入门级-Cocos2dx4.0 塔防游戏开发》---第七课:游戏界面开发(自定义Layer)

目录

 一、开发环境

二、开发内容

2.1 添加资源文件

2.2 游戏MenuLayer开发

2.3 GameLayer开发

三、演示效果

四、知识点

4.1 sprite、layer、scene区别

4.2 setAnchorPoint


 一、开发环境

操作系统:UOS1060专业版本。

cocos2dx:版本4.0

环境搭建教程:统信UOS下配置安装cocos2dx开发环境

本课主要内容:

  1. 自定义Layer开发
  2. 游戏餐单按钮相关开发

文章地址:

二、开发内容

我们把开发游戏的menu相关元素放在一个Layer进行处理。

新建Layer目录,在其中新建文件GameLayer.h、GameLayer.cpp、GameMenuLayer.h、GameMenuLayer.cpp。

GameLayer:用于管理游戏相关内容。

GameMenuLayer:用于管理游戏餐单相关内容。

2.1 添加资源文件

前面的文章其实已经提到我们可以在LoadingScene.cpp中先加载资源,等到我们使用的时候可以直接通过资源的名字获取该资源信息。

在loadSource函数添加以下内容:

    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("map_spritesheet_32-hd.plist");
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("map_spritesheet_32_2-hd.plist");
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("map_spritesheet_16_na-hd.plist");

注意需要将对应的plist文件以及png图片拷贝到Resources目录中。否则精灵在创建是需要通过名称获取图片获取不到而导致程序崩溃。

2.2 游戏MenuLayer开发

GameMenuLayer.h文件内容代码如下:
#ifndef __LAYER_GAME_MENU_LAYER_H__
#define __LAYER_GAME_MENU_LAYER_H__

#include "cocos2d.h"
USING_NS_CC;

class GameMenuLayer : public Layer
{
public:

    virtual bool init();
        
    // implement the "static create()" method manually
    CREATE_FUNC(GameMenuLayer)

    MenuItemSprite *book_,*shop_,*update_;

    Sprite * sprite_map_stars_container_;

    Label * lable_star_,*lable_diamonds_;

    bool isFirst;
    void touchBook(Ref *pSender);
    void touchShop(Ref *pSender);
    void touchUpdate(Ref *pSender);

    void onEnterTransitionDidFinish();

};

#endif // __LAYER_GAME_LAYER_H__
GameMenuLayer.cpp文件内容代码如下:
#include "GameMenuLayer.h"


// on "init" you need to initialize your instance
bool GameMenuLayer::init()
{
    //
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    isFirst =  true;
    // 获取窗口大小
    auto winSize = Director::getInstance()->getWinSize();

    // 商店精灵
    shop_ = MenuItemSprite::create(Sprite::createWithSpriteFrameName("butShop_0001.png"),
                                   Sprite::createWithSpriteFrameName("butShop_0002.png"),
                                   CC_CALLBACK_1(GameMenuLayer::touchShop,this));
    // 百科全书精灵
    book_ = MenuItemSprite::create(Sprite::createWithSpriteFrameName("butEncyclopedia_0001.png"),
                                   Sprite::createWithSpriteFrameName("butEncyclopedia_0002.png"),
                                   CC_CALLBACK_1(GameMenuLayer::touchBook,this));
    // 升级精灵
    update_ = MenuItemSprite::create(Sprite::createWithSpriteFrameName("butUpgrades_0001.png"),
                                    Sprite::createWithSpriteFrameName("butUpgrades_0002.png"),
                                    CC_CALLBACK_1(GameMenuLayer::touchUpdate,this));

    book_->setPosition(Point(winSize.width - book_->getContentSize().width/2,book_->getContentSize().height/2 -130));
    update_->setPosition(Point(book_->getPosition().x - 160 , update_->getContentSize().height/2-130));
    shop_->setPosition(Point(update_->getPosition().x - 160 , shop_->getContentSize().height/2-130));

    auto menu = Menu::create(shop_,update_,book_,nullptr);
    menu->setPosition(Vec2::ZERO);
    addChild(menu);

    sprite_map_stars_container_ = Sprite::createWithSpriteFrameName("mapStarsContainer.png");
    sprite_map_stars_container_->setPosition(Point(winSize.width - sprite_map_stars_container_->getContentSize().width/2 - 10,
                                                   winSize.height - sprite_map_stars_container_->getContentSize().height/2 + 60));
    addChild(sprite_map_stars_container_);

    // 星星的数量
    lable_star_ = Label::createWithTTF("0","SohoGothicProMedium.ttf",26);
    lable_star_->setPosition(Point(sprite_map_stars_container_->getContentSize().width/4*3 + 20,sprite_map_stars_container_->getContentSize().height/2));
    sprite_map_stars_container_->addChild(lable_star_);

    // 砖石的数量
    lable_diamonds_  = Label::createWithTTF("0","SohoGothicProMedium.ttf",26);
    lable_diamonds_->setPosition(Point(sprite_map_stars_container_->getContentSize().width/4,sprite_map_stars_container_->getContentSize().height/2));
    sprite_map_stars_container_->addChild(lable_diamonds_);

    return true;
}

void GameMenuLayer::touchBook(Ref *pSender)
{

}

void GameMenuLayer::touchShop(Ref *pSender)
{

}

void GameMenuLayer::touchUpdate(Ref *pSender)
{

}

void GameMenuLayer::onEnterTransitionDidFinish()
{
    if(isFirst){
        book_->runAction(MoveBy::create(0.3f,Point(0,130)));
        update_->runAction(MoveBy::create(0.3f,Point(0,130)));
        shop_->runAction(MoveBy::create(0.3f,Point(0,130)));

        sprite_map_stars_container_->runAction(MoveBy::create(0.3f,Point(0,-70)));
        isFirst = false;
    }
}

2.3 GameLayer开发

其实GamelLayer添加了GameMenuLayer,并并且添加了一个背景就没啥了。


#ifndef __LAYER_GAME_LAYER_H__
#define __LAYER_GAME_LAYER_H__

#include "cocos2d.h"
USING_NS_CC;

class GameLayer : public Layer
{
public:
    static cocos2d::Scene* createScene();

    virtual bool init();
        
    // implement the "static create()" method manually
    CREATE_FUNC(GameLayer)

    Size win_size_;
    Sprite *sprite_background_;
};

#endif // __LAYER_GAME_LAYER_H__

内容如下:

#include "GameLayer.h"
#include "GameMenuLayer.h"
USING_NS_CC;

Scene* GameLayer::createScene()
{
    auto scene = Scene::create();
    auto game_layer = GameLayer::create();
    auto game_menu_layer = GameMenuLayer::create();
    scene->addChild(game_layer);
    scene->addChild(game_menu_layer);
    return scene;
}

// on "init" you need to initialize your instance
bool GameLayer::init()
{
    //
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    win_size_ = Director::getInstance()->getWinSize();
    sprite_background_ = Sprite::createWithSpriteFrameName("MapBackground.png");
    sprite_background_->setAnchorPoint(Vec2::ZERO);
    sprite_background_->setPosition(Vec2::ZERO);

    addChild(sprite_background_);
    return true;
}

三、演示效果

  

四、知识点

4.1 sprite、layer、scene区别

在 cocos2d-x 游戏引擎中,`Sprite`、`Layer` 和 `Scene` 都是用于构建游戏场景和图层的类,但它们在功能和用途上有一些区别。

1. Sprite(精灵):

  •   `Sprite` 是游戏中可见的图像元素,通常用于表示游戏中的角色、物体、背景等。
  •   你可以将纹理(图像)加载到 `Sprite` 中,使其显示特定的图像。
  •   `Sprite` 可以进行位置、大小、旋转等的设置,还可以添加动画和事件监听器。
  •   用法示例:创建角色、敌人、道具、特效等可见的游戏元素。

2. Layer(图层):

  •  `Layer` 是场景中的可视化图层,用于呈现游戏中的各种元素,如精灵、文本、UI 等。
  •   一个 `Layer` 通常是某种类型的视觉容器,可以用来组织和管理一组相关的游戏元素。
  •  `Layer` 可以添加到 `Scene` 中,一个 `Scene` 可以包含多个 `Layer`,从而实现图层的层次结构。
  •   用法示例:创建游戏界面、UI 图层、特效图层等。

3. Scene(场景):

  •  `Scene` 是一个可视化的游戏场景容器,用于表示游戏中不同的画面、状态或关卡。
  • 一个 `Scene` 通常由多个 `Layer` 组成,每个 `Layer` 呈现不同的游戏元素。
  • `Scene` 可以管理场景之间的切换,实现从一个画面切换到另一个画面。
  • 用法示例:创建游戏的不同关卡、主菜单、游戏结束画面等。

区别总结:

  • `Sprite` 是游戏中的可见元素,用于表示角色、物体等。
  •  `Layer` 是图层容器,用于组织和呈现游戏元素。
  • `Scene` 是画面容器,用于管理不同画面之间的切换。

通常的开发实践是,一个游戏会有多个 `Scene`,每个 `Scene` 包含多个 `Layer`,而每个 `Layer` 中包含多个 `Sprite`。这样的层次结构可以帮助你有效地组织和管理游戏中的元素。

4.2 setAnchorPoint

`setAnchorPoint` 是 cocos2d-x 中 `Node` 类的成员函数之一,用于设置节点的锚点位置。锚点是节点相对于自身位置的一个点,影响了节点的定位和旋转。

节点的锚点是一个具有两个坐标值(x 和 y)的点,取值范围通常是从 0 到 1,表示节点的宽度和高度的相对比例。

示例用法:

auto sprite = Sprite::create("image.png");
sprite->setPosition(Vec2(200, 200)); // 设置节点的位置

// 设置锚点为节点宽度的中心(x=0.5),高度的底部(y=0)
sprite->setAnchorPoint(Vec2(0.5, 0.0));

this->addChild(sprite);

在上述示例中,`setAnchorPoint` 函数被用来设置精灵节点的锚点位置。在这个例子中,锚点被设置在精灵的底部中心,这意味着节点的位置 `(200, 200)` 将会指向精灵底部中心,而不是默认的左下角。

通过调整锚点,你可以更好地控制节点的旋转、缩放和定位行为。需要注意的是,节点的位置和锚点相互作用,所以改变锚点可能会导致节点的位置发生变化。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

06.sqlite3学习——DQL(数据查询)(全)

目录 SQLite——DQL(数据查询) 数据集 select语句 条件查询 比较 确定范围 确定集合 like 查询记录 查询不重复的记录 排序和限制 排序 限制 聚合 聚合函数 语法 SQLite Group By详解 语法 实例 SQLite Having 子句 语法 实例 多…

BUUCTF [SWPU2019]Web1

​ 这是一道sql二次注入题目,但是注入点并不在登录处 注册一个用户然后登录 广告申请处进行sql注入 你会发现过滤了很多关键字 空格#information等等 这里用到了一些绕过技巧 使用 /**/ 代替空格 union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1…

Docker网络原理及案例详解

文章目录 简介Docker网络产生的过程Docker network的作用网络模式网络模式---bridge网络模式---host网络模式---none 自定义网络 简介 Docker网络实现容器之间通信和连接外部网络的功能,主要的网络连接方式有桥接网络(Bridge Network、主机网络(Host Ne…

详细了解G1、了解G1、G1垃圾收集器详解、G1垃圾回收器简单调优

4.详细了解G1: 4.1.一:什么是垃圾回收 4.2.了解G1 4.3.G1 Yong GC 4.4.G1 Mix GC 4.5.三色标记算法 4.6.调优实践 5.G1垃圾收集器详解 5.1.G1垃圾收集器 5.2.G1的堆内存划分 5.3.G1的运行过程 5.4.三色标记 5.4.1.漏标问题 5.5.记忆集与卡表 5.6.安全点与…

iconfont 图标在vue里的使用

刚好项目需要使用一个iconfont的图标,所以记录一下这个过程 1、iconfont-阿里巴巴矢量图标库 这个注册一个账号,以便后续使用下载代码时需要 2、寻找自己需要的图标 我主要是找两个图标 ,一个加号,一个减号,分别加入到…

Python爬虫实战案例——第二例

某某美剧剧集下载(从搜索片名开始) 本篇文章主要是为大家提供某些电影网站的较常规的下载电影的分析思路与代码思路(通过爬虫下载电影),我们会从搜索某部影片的关键字开始直到成功下载某一部电影。 地址:aHR0cHM6Ly93d3cuOTltZWlqdXR0LmNvbS9pbmRleC5od…

基于全新电脑环境安装pytorch的GPU版本

前言: 距离第一次安装深度学习的GPU环境已经过去了4年多(当时TensorFlow特别麻烦),现在发现安装pytorch的GPU版本还是很简单方便的,流程记录如下。 安装步骤: 步骤一:官网下载Anaconda Free…

局域网中电脑共享文件给手机

学习资源: 局域网共享:这样设置,你可以轻松拷贝任何电脑的文件。_哔哩哔哩_bilibili 可以实现什么效果? 连接同一个WIFI,电脑端为服务端,提供共享文件,手机是客户端,可以读取服务端…

C语言——指针进阶(一)

目录 ​编辑 一.字符指针 1.1 基本概念 1.2 面试题 二.指针数组 三.数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 四.数组参数、指针参数 4.1 一维数组传参 ​编辑 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 ​编辑 五.…

windows系统 Fooocus 图片生成模型 ,4-6GB显存即可玩,27S/p

安装步骤: 1.下载程序代码框架,大小2GB ,下载 ​​​​​​https://github.com/lllyasviel/Fooocus/releases/download/1.0.35/Fooocus_win64_1-1-1035.7z 2.下载模型文件sd_xl_base_1.0_0.9vae.safetensors ,大小6GBhttps://huggingface.co/stabilityai/stable-diffusion-x…

软件配置安装(破解)--- maven下载配置

检查环境是否已有 首先检查一下电脑里有无maven环境,有的话就不用安装了 查看path环境中没有maven,开始准备接下来的重头戏 下载maven 下载bin.zip版 解压mavenxxxbin.zip (建议把解压的文件放在一个文件夹内,命名英文的env…

利用敏捷开发工具实现敏捷项目管理的实践经验分享

Scrum中非常强调公开、透明、直接有效的沟通,这也是“可视化的管理工具”在敏捷开发中如此重要的原因之一。通过“可视化的管理工具”让所有人直观的看到需求,故事,任务之间的流转状态,可以使团队成员更加快速适应敏捷开发流程。 …

8.缓冲区管理

第五章 I/O管理 缓冲区管理 双缓冲区&#xff1a;T<CM 假设初始状态缓冲区1满&#xff0c;缓冲区2空&#xff0c;工作区为空。 刚开始缓冲区2为空&#xff0c;所以设备可以向缓冲区2中冲入数据耗时T&#xff0c;另一方面刚开始缓冲区1中是满的&#xff0c;所以刚开始就可…

前端vue3+typescript架构

1、vue creat 项目名称 选择自定义 选择需要的依赖 选择vue3 一路enter&#xff0c;选择eslistprettier 继续enter&#xff0c;等待安装 按步骤操作&#xff0c;项目启动成功 2、vscode安装5款插件 2、代码保存自动格式化&#xff0c;保证每个开发人员代码一致&#xff0c;根目…

LeetCode 周赛上分之旅 #42 当 LeetCode 考树上倍增,出题的趋势在变化吗

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…

DevOps系列文章 之 Python基础

字符串 定义字符串 1.python中字符串被定义为引号之间的字符集合 2.python支持使用成对的单引号或双引号 3.无论单引号&#xff0c;还是双引号&#xff0c;表示的意义相同 4.python还支持三引号&#xff08;三个连续的单引号或者双引号&#xff09;&#xff0c;可以用来包含特…

【Linux】深入理解文件操作

文章目录 初次谈论文件重温C语言文件操作系统文件操作接口openwriteread 再次谈论文件文件描述符文件描述符的分配规则 重定向什么是重定向重定向的本质系统调用接口实现重定向<、>、>> 初次谈论文件 开始之前先谈论一下关于文件的一些共识性问题。 一个文件可以…

http协议与apache

http概念&#xff1a; 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络。即因特网概念从属于互联网概念 万维网&#xff1a;万维网并非某种特殊的计算机网络&#xff0c;是一个大规模的、联机式的信息贮藏库&…

SpringCloud Alibaba实战和源码(7)Skywalking

什么是SkyWalking Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品&#xff0c;它同时吸收了Zipkin /Pinpoint /CAT 的设计思路。特点是&#xff1a;支持多种插件&#xff0c;UI功能较强&#xff0c;支持非侵入式埋点。目前使用厂商最多&#xff0c;版本更新较…

keepalived+lvs+nginx高并发集群

keepalivedlvsnginx高并发集群 简介&#xff1a; keepalivedlvsnginx高并发集群&#xff0c;是通过LVS将请求流量均匀分发给nginx集群&#xff0c;而当单机nginx出现状态异常或宕机时&#xff0c;keepalived会主动切换并将不健康nginx下线&#xff0c;维持集群稳定高可用 1.L…