前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Cocos2d-x】Sprite精灵类-创建Sprite精灵对象

【Cocos2d-x】Sprite精灵类-创建Sprite精灵对象

作者头像
谙忆
发布于 2021-01-21 03:37:47
发布于 2021-01-21 03:37:47
82900
代码可运行
举报
文章被收录于专栏:程序编程之旅程序编程之旅
运行总次数:0
代码可运行

精灵在Cocos2d-x中的地位就像一场电影中的主角,男主角/女主角,是一场电影中的灵魂所在。也是我们游戏中的灵魂 无论我们控制的对象还是电脑控制的对象,我们都称之为精灵,或者背景中的图片,也可以称为精灵、只要在游戏场景中的东西,都是可以用精灵来做的。比如菜单,可以做成精灵菜单。 还有些精灵是和物理引擎有关的,有一些物理特效。 本章讲的精灵,只是一般意义上的精灵。

创建Sprite精灵对象

创建精灵对象

创建精灵对象有多种方式,其中常用的函数如下:

代码语言:javascript
代码运行次数:0
运行
复制
static Sprite* create(); //创建一个精灵对象,纹理等属性需要在创建后设置
static Sprite* create(const std:string &filename); //指定图片创建精灵  这种方式在实际项目中很少用。我们不会简单的把每个精灵做一个图片,这样会消耗更多的IO读写时间  
//可以放在大图中(合成图),进行一次读取,在使用中再截取,也就是下面的创建方法(这样内存会消耗多,但是IO操作少)
//如果使用的是iOS系统(苹果),图片不能超过2048*2048,这是系统的限制
static Sprite* create(const std::string &filename,const Rect &rect); //指定图片和裁剪的矩形区域来创建精灵
static Sprite* createWithTexture(Texture2D *texture);//指定纹理创建精灵  如果已经有纹理对象了,直接把纹理对象拿过来创建精灵对象
static Sprite* createWithTexture(Texture2D *texture,const Rect &rect,bool rotated=false);//指定纹理和裁剪的矩形区域来创建精灵,第三个参数是否旋转纹理,默认不旋转  从纹理缓存区来裁剪矩形区域创建精灵
//旋转就是,可能某些情况下,我们合图时为了节省空间,将小图旋转再合图了,这个时候就需要旋转了
static Sprite* createWithSpriteFrame(SpriteFrame *pSpriteFrame);//通过一个精灵帧对象创建另一个精灵对象 帧缓存
static Sprite* createWithSpriteFrameName(const std::string &spriteFrameName);//通过精灵帧的名字的创建

Sprite继承关系图:

纹理

无论是计算机中的CPU还是GPU,做运算做处理,它不是对图片进行处理。图片读入到计算机里,需要对图片进行解码。最后,在计算机放的东西,就可以叫做纹理! 实际上,纹理就是由图片或者计算机本身用绘图工具绘画出来的对象。这个东西本身最后的目的是为了放在图片上面,这个过程叫纹理贴图。 在实际中,我们有时候是把纹理叫成图片的。或者图片叫成纹理。一般而言,在游戏里叫纹理或纹理图片,这是没问题的

使用纹理对象创建Sprite对象

场景设计:

两个精灵(具体几个,看美工给几张图咯): 草地图片:


树图片:

这张图上有三棵树,实际上我们不需要全部用到,所以不能简单的把树图片放到草地图片上面。 而且摆放位置也不同。对于第二种图片,我们可以先读到内存里,形成一个纹理对象,然后从这个纹理对象中截图 从里面裁剪出来来创建精灵对象。 裁剪有两种方式,一是通过它的纹理缓存来裁剪。也可以从大图文件直接进行裁剪。

不管是哪种方式,我们都需要去量树的坐标,Rect的参数是一样的! 去画图工具中量坐标: 我们需要的参数是:左上角坐标,还有宽和高

从纹理中创建tree精灵:

代码语言:javascript
代码运行次数:0
运行
复制
auto tree1 = Sprite::create("tree1.png", Rect(608, 36, 300, 298));//左上角的坐标,宽,高
//指定大图,指定Rect获取树的截图
tree1->setPosition(Vec2(200,230));
this->addChild(tree1,0)
代码语言:javascript
代码运行次数:0
运行
复制
Texture2D* cache = Director::getInstance()->getTextureCache()->addImage("tree1.png");
auto tree2 = Sprite::create();
tree2->setTexture(cache);
tree2->setTextureRect(Rect(70,72,187,267));
tree2->setPosition(Vec2(500,200));//设置精灵位置
this->addChild(tree2,0);
//通过纹理缓存截取树

平时我们玩游戏的时候,遇到游戏中loading的画面时,基本上就是在缓存纹理,经过这个步骤后,我们玩游戏会快很多。因为不会去临时加载图片

实例:

代码语言:javascript
代码运行次数:0
运行
复制
bool HelloWorld::init()
{
    if ( !Layer::init() )
    {
        return false;
    }

    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    //背景精灵
    auto background = Sprite::create("background.png");//背景图
    //background->setAnchorPoint(Vec2::ZERO);//指定锚点(默认坐标为0,0)或者:
    background->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2));//指定位置(默认锚点为0.5,0.5)
    this->addChild(background,0);

    auto tree1 = Sprite::create("tree1.png", Rect(608, 36, 300, 298));//左上角的坐标,宽,高
    //指定大图,指定Rect获取树的截图
    tree1->setPosition(Vec2(200,230));
    this->addChild(tree1,0);

    Texture2D* cache = Director::getInstance()->getTextureCache()->addImage("tree1.png");
    auto tree2 = Sprite::create();
    tree2->setTexture(cache);
    tree2->setTextureRect(Rect(70, 72, 187, 267));
    tree2->setPosition(Vec2(500, 200));//设置精灵位置
    this->addChild(tree2, 0);
    //通过纹理缓存截取树

    return true;
}

源代码下载地址:

GITHUB源码下载地址: 点我进行下载

本文章由[谙忆]编写, 所有权利保留。 欢迎转载,分享是进步的源泉。

转载请注明出处:http://chenhaoxiang.cn 本文源自人生之旅_谙忆的博客

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/09/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
HDU 4348 To the moon(可持久化线段树)
To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 4287    Accepted Submission(s): 923 Problem Description Background To The Moon is a independent game released in November 2011, it is
ShenduCC
2018/04/27
6970
HDU 4605 Magic Ball Game(可持续化线段树,树状数组,离散化)
Magic Ball Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2489    Accepted Submission(s): 759 Problem Description When the magic ball game turns up, Kimi immediately falls in it. The inter
ShenduCC
2018/04/27
6680
HDU 5634 Rikka with Phi (线段树)
Problem Description Rikka and Yuta are interested in Phi function (which is known as Euler's totient function). Yuta gives Rikka an array  of positive integers, then Yuta makes  queries.   There are three types of queries:  Change  into ,
ShenduCC
2018/04/27
5770
给球上色(线段树+离散化) - HDU 1199
假定待离散化的序列为a[n],b[n]是序列a[n]的一个副本,则对应以上三步为:
ACM算法日常
2019/01/02
1.3K0
HDU 4417 Super Mario(线段树)
Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5370    Accepted Submission(s): 2461 Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability
ShenduCC
2018/04/27
6320
HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1468    Accepted Submission(s): 472 Problem Description You are given a  tree of  nodes, labeled from 1 to . To the th node a non-n
ShenduCC
2018/04/27
7210
HDU 3450 Counting Sequences(线段树)
Counting Sequences Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/65536 K (Java/Others) Total Submission(s): 2335    Accepted Submission(s): 820 Problem Description For a set of sequences of integers{a1,a2,a3,...an}, we define a sequence
ShenduCC
2018/04/27
5210
hdu 1394
求逆序数的时候,算出以每一个数为逆序数对的第二个数的情况之和即为序列的逆序数,这样能够防止反复
全栈程序员站长
2022/07/10
1850
[OI题库]八月提高模拟题解
具体地,将该点插入单调栈时,只会改变栈顶位置和插入点的值。记录原栈顶位置、插入点更改前的值,即可在回溯时撤销。
Clouder0
2022/09/23
2850
P2023 [AHOI2009]维护序列
老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。 输入输出格式 输入格式: 第一行两个整数N和P( )。第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, ( )。第三行有一个整数M,表示操作总数。从第四行开始每行描述一个操作,输入的操作有以下三种形式: 操作1
attack
2018/04/13
7610
BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1820  Solved: 736 [Submit][Status][Discuss] Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站。 Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取V
attack
2018/07/27
2630
CodeForces 19D Points (线段树+set)
D. Points time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Pete and Bob invented a new interesting game. Bob takes a sheet of paper and locates a Cartesian coordinate system on it as
ShenduCC
2018/04/27
6640
HDU 3333 Turing Tree (线段树)
Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4768    Accepted Submission(s): 1686 Problem Description After inventing Turing Tree, 3xian always felt boring when solving problems ab
ShenduCC
2018/04/27
5410
[Atcoder][CF]简单题选做练习笔记 2
第一个式子,要求 p_i \equiv 0 \pmod 3,第二个式子要求 p_i \equiv 1 \pmod 3 且 p_j \equiv 2 \pmod 3 或者反过来。
Clouder0
2022/09/23
3890
BZOJ3083: 遥远的国度(树链剖分)
以下图片来自(https://blog.csdn.net/lcomyn/article/details/45718295)
attack
2018/07/27
3230
BZOJ3083: 遥远的国度(树链剖分)
HDU6315 Naive Operations(线段树 复杂度分析)
设\(d_i\)表示\(i\)号节点还需要加\(d_i\)次才能产生\(1\)的贡献
attack
2018/10/08
4670
HDU6315 Naive Operations(线段树 复杂度分析)
SDUT算法分析与设计机测
将分解问题看成,以某个数字开头的分解有多少种,比如12可以看成以2开头的式子有几个,以3开头的有几个,4开头的有几个,6开头的有几个… 其中以2开头的分解式为例,可以看成12 = 2 * 6,即分析6有多少种分解方式,就是有多少个2开头的式子。
Here_SDUT
2022/09/19
5070
洛谷P3722 [AH2017/HNOI2017]影魔(线段树 set spaly)
题意 题目链接 Sol 这题好毒瘤啊。。 首先要观察到几个性质: 将最小值旋转到根相当于把右子树变为祖先的左子树,然后将原来的根变为当前最小值 上述操作对深度的影响相当于右子树不变,其他的位置-1 然后就可以做了,把询问离线之后离散化一下,建一棵权值线段树表示每个值对应的深度 同时用set维护出已经加入的值 每次先找到后继,看一下有没有左孩子,如果有的话说明前驱一定没有右孩子。 注意随时更新信息 复杂度\(O(nlogn)\) #include<bits/stdc++.h> #define Pair pa
attack
2019/03/08
3530
NOI 系列真题练习笔记
NOIP 前开始做做真题,虽然每年都风格迥异,不过感受一下 OI 风格的题目还是有一定意义的。
Clouder0
2022/09/23
8860
Day1下午解题报告
预计分数:0+30+30=60 实际分数:0+30+40=70 T1水题(water) 贪心,按长度排序, 对于第一幅牌里面的,在第二个里面,找一个长度小于,高度最接近的牌 进行覆盖。 考场上的我离正解只差一个小于号之遥。。。。。。。 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <iostream> 5 #include <set> 6 using namespace std; 7 i
attack
2018/04/11
7750
相关推荐
HDU 4348 To the moon(可持久化线段树)
更多 >
目录
  • 创建Sprite精灵对象
    • 创建精灵对象
    • Sprite继承关系图:
    • 纹理
  • 使用纹理对象创建Sprite对象
    • 实例:
  • 源代码下载地址:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档