【来写个2048吧】—— 创建卡片类以及添加

一、创建卡片类

首先想想卡片是一个精灵,那么我们就继承精灵类。然后还要有数字,背景颜色。基本就这些,那么看代码吧。

Card.h代码

#ifndef _CARD_H_
#define _CARD_H_

#include "cocos2d.h"

USING_NS_CC ;

class CardSprite : public Sprite
{
public :
        //这里number是卡片数字,wight和height是宽和高,cardSpriteX和CardSpriteY是卡片坐标
        static CardSprite * createCardSprite ( int number , int wight , int height, float CardSpriteX , floatCardSpriteY);
        virtual bool init();
        CREATE_FUNC (CardSprite );

        //获取数据
        int getNumber ();
        //设置数据
        void setNumber ( int num );
private :
        //显示的数字
        int number ;
        //初始化
        void enemyInit ( int number , int wight , int height, float CardSpriteX , float CardSpriteY );
        //显示数字的控件
        LabelTTF * labelCardNumber ;
        //背景
        LayerColor * colorBackground ;
};

Card.cpp代码实现

#include "Card.h"

USING_NS_CC ;

CardSprite * CardSprite :: createCardSprite( int number , int wight, int height , float CardSpriteX , float CardSpriteY)
{
        //这里是创建一个自定义精灵类,格式很规范化
        CardSprite * enemy = new CardSprite ();
        if ( enemy && enemy-> init ())
        {
               enemy ->autorelease ();
               enemy ->enemyInit ( number, wight ,height , CardSpriteX, CardSpriteY );
               return enemy ;
        }
        CC_SAFE_DELETE (enemy );

        return NULL ;
}

//这里也是规范化
bool CardSprite:: init ()
{
        if (! Sprite ::init ())
        {
               return false ;
        }

        return true ;
}

//获取数据
int CardSprite:: getNumber ()
{
        return number ;
}

//设置数据
void CardSprite:: setNumber (int num)
{
        number = num;
        //更新显示的数字
        if ( num > 0)
        {
               labelCardNumber ->setString ( __String:: createWithFormat ("%i" , number)-> getCString ());
        }
        else
        {
               labelCardNumber ->setString ( "");
        }
}

//初始化
void CardSprite:: enemyInit (int number, int wight , int height , float CardSpriteX, float CardSpriteY )
{
        //初始化数字
        this ->number = number ;
        //加入卡片背景颜色
        colorBackground = LayerColor :: create( Color4B (200 , 190, 180 ,255 ), wight- 15 ,height - 15);
        colorBackground ->setPosition ( Point( CardSpriteX ,CardSpriteY ));

        //判断如果大于0就显示,否则就不显示
        if ( number > 0)
        {
               //加入字体
               labelCardNumber = LabelTTF :: create( __String ::createWithFormat ( "%i", number )->getCString (), "Consolas", 100 );
               labelCardNumber ->setPosition ( Point( colorBackground ->getContentSize (). width/ 2 , colorBackground -> getContentSize(). height /2 ));
               labelCardNumber ->setTag ( 8);
               colorBackground ->addChild ( labelCardNumber);
        }
        else
        {
               //加入字体
               labelCardNumber = LabelTTF:: create ("" , "Consolas", 100 );
               labelCardNumber ->setPosition ( Point( colorBackground ->getContentSize (). width/ 2 , colorBackground -> getContentSize(). height /2 ));
               labelCardNumber ->setTag ( 8);
               colorBackground ->addChild ( labelCardNumber);
        }

        this ->addChild ( colorBackground);
}

基本自定义精灵类差不多就是这个套路,看注释就很明白

二、把卡片加入到场景中

首先在GameScene.h中加入

	CardSprite *cardArr[4][4]   //用来储存卡片
        //根据屏幕大小创建卡片
        void createCardSprite ( Size size );

下面是实现

//根据屏幕大小创建卡片
void GameScene:: createCardSprite (Size size)
{
        //求出单元格的宽和高
        int cardSize = ( size. height - 36) / 4 ;
        //绘制出4X4的单元格
        for ( int i = 0 ; i < 4; i++)
        {
               for ( int j = 0 ; j < 4; j++)
               {
                      //需要屏幕分辨率适配
                      CardSprite * card = CardSprite:: createCardSprite (2 , cardSize , cardSize , cardSize * i+ 80 ,cardSize *j + 20);
                      cardArr [i ][ j] = card ;
                      addChild (card );
               }
        }
}

然后将函数加入init()中即可。

同时创建游戏背景

        //加入游戏背景
        auto layerColorBG = LayerColor ::create ( Color4B( 180 , 170 , 160 , 255 ));
        this ->addChild ( layerColorBG);
        //创建4X4卡片
        createCardSprite (visibleSize );

运行可以看到

【来写个2048吧】—— 创建卡片类以及添加

时间: 2025-01-06 00:21:42

【来写个2048吧】—— 创建卡片类以及添加的相关文章

能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么

不能向编译后得到的类中增加实例变量!能向运行时创建的类中添加实例变量! 因为编译后的类已经注册在runtime中,类结构体中的objc_ivar_list 实例变量的链表和instance_size实例变量的内存大小已经确定,同时runtime 会调用class_setIvarLayout 或 class_setWeakIvarLayout来处理strong weak引用,所以不能向存在的类中添加实例变量. 运行时创建的类是可以添加实例变量,调用 class_addIvar 函数,但是得在调用 

VS2010/MFC对话框:创建对话框类和添加控件变量

创建对话框类和添加控件变量 前两讲中讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDITION_DIALOG,并自动生成了对话框类CAdditionDlg,它是从CDialogEx类派生的.大家用过VC++ 6.0的可能记得,我们定义的对话框类都是从CDialog类派生的,但在VS2010中,一般对话框类都是继承自CDia

【转】VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)

原文网址:http://www.jizhuomi.com/software/153.html 前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下,生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 因为鸡啄米给大家的例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDITION_DIALOG,并自动生成了对话框类CAdditionDlg,它是从CDialogEx类派生的.大家用过VC++6.0

【来写个2048吧】—— 移动算法与随机数字生成

一.移动算法 其实2048的移动算法蛮简单,看代码很容易明白,就不多说了. 向左滑动 //左滑动 bool GameScene:: doLeft () { //判断有没有发生移动 bool isMove = false ; for ( int y = 0 ; y < 4; y++) { for ( int x = 0 ; x < 4; x++) { for ( int x1 = x +1 ; x1 < 4; x1++) { if ( cardArr [x1 ][ y]-> getN

使用SharpZIpLib写的压缩解压操作类

使用SharpZIpLib写的压缩解压操作类,已测试. public class ZipHelper { /// <summary> /// 压缩文件 /// </summary> /// <param name="directory"></param> /// <param name="targetPath"></param> public static void Zip(string dir

【来写个2048吧】—— 后期优化及源代码

卡片里的数字假设越来越大则会超过卡片,这样看起来不好看,所以我们要推断数字的位数然后设置合适的大小. 在Card.cpp的setNumber()中增加例如以下代码 //设置数字大小 if ( num >= 0) { labelCardNumber->setFontSize (100); } if ( num >= 16) { labelCardNumber->setFontSize (90); } if ( num >= 128) { labelCardNumber->

vs里根据json快速创建对应类的方法

有时候,我们在调用别人接口的时候,服务端返回了一个json格式的字符串,我们要获取json里面的数据的话一般有两种方式: 1.通过正则 2.反序列化成一个对象 第一种方式这里不再多说,主要说一下第二种,(为什么呢,你看到后面 你也会喜欢上第二种) 有人肯定会说, json字符串万一很长,很复杂,我一个个去写类????有这个功夫 我用个正则 程序都已经写完了,你还在写对应的类. 是的,我之前也是通过正则的方式获取想要的数据,因为第二种方式,我们创建与json相对应的类的话 如果json很复杂,那是

自己动手写客户端UI库——创建第一个控件

在上一篇文章中我们主要讲了C#如何和JS通信, 这一篇文章中,我们将创建一个最基础的Button控件 WUI库中控件的继承机制 我们先解释最简单的继承机制,以后WUI库的继承机制会比这个复杂的多 第一:PanelMain类 我们在上一篇中说了,PanelMain是一个特殊的Panel,每一个用户程序都应该自己实现一个PanelMain类的子类,用户把这个子类的实例交给WUI库,WUI库把这个实例当作第一个容器控件添加到窗体中,WUI库告诉用户什么时候这个用户控件创建完毕,用户可以在PanelMa

【来写个2048吧】—— 游戏结束检测与添加分数

一. 游戏结束检测 //检测游戏是否结束 void GameScene :: doCheck() { bool isGameOver = true ; //判断每一个的上下左右和自己是否相同 for ( int y = 0 ; y < 4; y++) { for ( int x = 0 ; x < 4; x++) { if ( cardArr [x ][ y]-> getNumber () == 0 || ( x< 3 && cardArr[ x ][y ]->