【cocos2dx 3.2】2048

本文详细介绍了使用Cocos2d-x框架开发2048游戏的具体步骤,包括游戏逻辑的实现、触摸事件处理以及游戏UI的设计等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打包好的APKhttp://pan.baidu.com/share/link?shareid=847502897&uk=185595768

游戏分析请看【Android重制2048】

打包方法:

(1)将工程导入eclipse中(记得将xml文档中调成竖屏模式)

(2)将VS工程中的D:\hello\Card\cocos2d\cocos\2d\platform\android\java\src里的org文件夹拖进eclipse的src

(3)修改eclipse工程中jni文件下的Android.mk文件

参考:http://blog.youkuaiyun.com/gf771115/article/details/34414449

(4)打开CMD,运行到VS工程中的proj.android下,执行Build_native.py

(5)成功后重新导入工程到eclipse中

(6)最后导出apk

效果:


AppDelegate.cpp(修改分辨率和屏幕大小)

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "AppDelegate.h"  
  2. #include "HelloWorldScene.h"  
  3.   
  4. USING_NS_CC;  
  5.   
  6. AppDelegate::AppDelegate() {  
  7.   
  8. }  
  9.   
  10. AppDelegate::~AppDelegate()   
  11. {  
  12. }  
  13.   
  14. bool AppDelegate::applicationDidFinishLaunching() {  
  15.     // initialize director  
  16.     auto director = Director::getInstance();  
  17.     auto glview = director->getOpenGLView();  
  18.     if(!glview) {  
  19.         //修改屏幕大小  
  20.         glview = GLView::createWithRect("My2048",Rect(0,0,286,512),1.0f);  
  21.         director->setOpenGLView(glview);  
  22.     }  
  23.     //分辨率适应  
  24.     glview->setDesignResolutionSize(268,512,ResolutionPolicy::EXACT_FIT);  
  25.      
  26.     director->setDisplayStats(true);  
  27.   
  28.     director->setAnimationInterval(1.0 / 60);  
  29.   
  30.     auto scene = HelloWorld::createScene();  
  31.   
  32.     director->runWithScene(scene);  
  33.   
  34.     return true;  
  35. }  
  36.   
  37. void AppDelegate::applicationDidEnterBackground() {  
  38.     Director::getInstance()->stopAnimation();  
  39. }  
  40.   
  41. void AppDelegate::applicationWillEnterForeground() {  
  42.     Director::getInstance()->startAnimation();  
  43. }  

2.游戏主场景

HelloWorld.h

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #ifndef __HELLOWORLD_SCENE_H__  
  2. #define __HELLOWORLD_SCENE_H__  
  3.   
  4. #include "cocos2d.h"  
  5. #include "Card.h"  
  6.   
  7. USING_NS_CC;  
  8.   
  9. class HelloWorld : public Layer  
  10. {  
  11. public:  
  12.    
  13.     static Scene* createScene();  
  14.   
  15.     virtual bool init();    
  16.       
  17.     void menuCloseCallback(Ref* pSender);  
  18.   
  19.     CREATE_FUNC(HelloWorld);  
  20.   
  21.     //自动生成卡片  
  22.     void autoCreateCard();  
  23.   
  24.     //判断是否游戏结束  
  25.     void checkGameOver();  
  26.   
  27.     //判断是否移动  
  28.     bool isMoveLeft();  
  29.     bool isMoveRight();  
  30.     bool isMoveUp();  
  31.     bool isMoveDown();  
  32.   
  33. private:  
  34.     //记录按下时坐标和偏移量  
  35.     float startX,startY,offsetX,offsetY;  
  36.   
  37.     //创建触控监听  
  38.     bool onTouchBegan(Touch *t, Event *e);  
  39.     void onTouchEnded(Touch *t, Event *e);  
  40.   
  41.     //创建卡片  
  42.     void createCard(Size size);  
  43.   
  44.     //储存卡片的二维数组,以便控制每一张卡片  
  45.     Card* cardArr[4][4];  
  46.   
  47.     //游戏分数  
  48.     int score ;  
  49.     //显示分数的控件  
  50.     LabelTTF *scoreLabel;  
  51.   
  52.     //设置重新开始游戏按钮  
  53.     LabelTTF *restartBtn;  
  54. };  
  55.   
  56. #endif // __HELLOWORLD_SCENE_H__  

HelloWorld.cpp

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "HelloWorldScene.h"  
  2.   
  3. USING_NS_CC;  
  4.   
  5. Scene* HelloWorld::createScene()  
  6. {  
  7.     auto scene = Scene::create();  
  8.       
  9.     auto layer = HelloWorld::create();  
  10.   
  11.     scene->addChild(layer);  
  12.   
  13.     return scene;  
  14. }  
  15.   
  16. bool HelloWorld::init()  
  17. {  
  18.    
  19.     if ( !Layer::init() )  
  20.     {  
  21.         return false;  
  22.     }  
  23.       
  24.     Size visibleSize = Director::getInstance()->getVisibleSize();  
  25.     Point origin = Director::getInstance()->getVisibleOrigin();  
  26.   
  27.     //加入游戏背景  
  28.     auto layerClourBG = LayerColor::create(Color4B(180,170,160,255));  
  29.     this->addChild(layerClourBG);  
  30.   
  31.     //加入游戏标题  
  32.     auto title = LabelTTF::create("My2048","Arial",60);  
  33.     title->setColor(Color3B(255,255,153));  
  34.     title->setPosition(Point(visibleSize.width/2,visibleSize.height-50));  
  35.     addChild(title);  
  36.       
  37.     //加入restart按钮  
  38.     restartBtn = LabelTTF::create("Restart","Arial",30);  
  39.     restartBtn->setColor(Color3B(204,255,253));  
  40.     restartBtn->setPosition(Point(visibleSize.width/2,visibleSize.height-110));  
  41.     addChild(restartBtn);  
  42.   
  43.     //加入游戏分数  
  44.     auto slabel = LabelTTF::create("Score","Arial",30);  
  45.     slabel->setPosition(Point(visibleSize.width/5,visibleSize.height-150));  
  46.     addChild(slabel);  
  47.   
  48.     score = 0;  
  49.     scoreLabel = LabelTTF::create("0","Arial",30);  
  50.     scoreLabel->setPosition(Point(visibleSize.width/2+60,visibleSize.height-150));  
  51.     addChild(scoreLabel);  
  52.   
  53.     //创建触控监听  
  54.     auto listener = EventListenerTouchOneByOne::create();  
  55.     listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan,this);  
  56.     listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded,this);  
  57.     _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);  
  58.       
  59.     //调用卡片生成方法  
  60.     createCard(visibleSize);  
  61.   
  62.     //一开始生成随机数  
  63.     autoCreateCard();  
  64.     autoCreateCard();  
  65.   
  66.   
  67.   
  68.     return true;  
  69. }  
  70.   
  71. bool HelloWorld::onTouchBegan(Touch *t, Event *e)  
  72. {  
  73.     //记录开始点击的坐标  
  74.     Point startPoint = t->getLocation();  
  75.     startX = startPoint.x;  
  76.     startY = startPoint.y;  
  77.   
  78.     if(restartBtn->getBoundingBox().containsPoint(restartBtn->convertToNodeSpace(t->getLocation())))  
  79.     {  
  80.         Director::getInstance()->replaceScene(TransitionFade::create(1,HelloWorld::createScene()));  
  81.     }  
  82.   
  83.     return true;  
  84. }  
  85.   
  86.   
  87. void HelloWorld::onTouchEnded(Touch *t, Event *e)  
  88. {  
  89.     //计算出偏移量,用于判断用户的滑动方向意图  
  90.     Point endPoint = t->getLocation();  
  91.     offsetX = startX - endPoint.x;  
  92.     offsetY = startY - endPoint.y;  
  93.   
  94.     //如果X轴的偏移量比Y轴的大,则说明是水平方向的滑动  
  95.     if(abs(offsetX) > abs(offsetY))  
  96.     {  
  97.         //向左滑动  
  98.         if(offsetX > -5){  
  99.             if(isMoveLeft())  
  100.                 //调用生成随机数  
  101.                 autoCreateCard();  
  102.                 //判断游戏是否结束  
  103.                 checkGameOver();  
  104.         }  
  105.         //向右滑动  
  106.         else{  
  107.             if(isMoveRight())  
  108.                 autoCreateCard();  
  109.                 checkGameOver();  
  110.         }  
  111.     }  
  112.     else  
  113.     {  
  114.         //向上滑动  
  115.         if(offsetY > -5){  
  116.             if(isMoveUp())  
  117.                 autoCreateCard();  
  118.                 checkGameOver();  
  119.         }  
  120.         //向下滑动  
  121.         else{  
  122.             if(isMoveDown())  
  123.                 autoCreateCard();  
  124.                 checkGameOver();  
  125.         }  
  126.     }  
  127. }  
  128.   
  129. //逻辑一样,只需实现一个方向的逻辑,其他复制修改就好了  
  130. bool HelloWorld::isMoveLeft()  
  131. {  
  132.     bool moved = false;  
  133.     for (int y = 0; y < 4; y++)  
  134.     {  
  135.         for (int x = 0; x < 4; x++)  
  136.         {  
  137.             for(int x1 = x+1; x1 < 4 ; x1++)  
  138.             {  
  139.                 if(cardArr[x1][y]->getNumber() > 0)  
  140.                 {   //当前位置为空,而同一行的有不为空的数字,就把它移到空的位置,接着把原位置清零  
  141.                     if(cardArr[x][y]->getNumber() <= 0){  
  142.                         cardArr[x][y]->setNumber(cardArr[x1][y]->getNumber());  
  143.                         cardArr[x1][y]->setNumber(0);  
  144.                         //再扫描一次,确保所有结果正确  
  145.                         x--;  
  146.                         moved = true;  
  147.                     }else if(cardArr[x][y]->getNumber() == cardArr[x1][y]->getNumber())  
  148.                     {//当前位置不为空,而且同一行有数字,相同的就叠加,并清空原位置  
  149.                             cardArr[x][y]->setNumber(cardArr[x1][y]->getNumber()*2);  
  150.                             cardArr[x1][y]->setNumber(0);  
  151.                             //合并时同时加分  
  152.                             score += (cardArr[x][y]->getNumber());  
  153.                             scoreLabel->setString(__String::createWithFormat("%i",score)->getCString());  
  154.                             moved = true;  
  155.                     }  
  156.                     break;  
  157.                 }  
  158.             }  
  159.         }  
  160.     }  
  161.     return moved;  
  162. }  
  163.   
  164. bool HelloWorld::isMoveRight()  
  165. {  
  166.     bool moved = false;  
  167.     for (int y = 0; y < 4; y++)  
  168.     {  
  169.         for (int x = 3; x >= 0; x--)  
  170.         {  
  171.             for(int x1 = x-1; x1 >= 0 ; x1--)  
  172.             {  
  173.                 if(cardArr[x1][y]->getNumber() > 0)  
  174.                 {   //当前位置为空,而同一行的有不为空的数字,就把它移到空的位置,接着把原位置清零  
  175.                     if(cardArr[x][y]->getNumber() <= 0)  
  176.                     {  
  177.                         cardArr[x][y]->setNumber(cardArr[x1][y]->getNumber());  
  178.                         cardArr[x1][y]->setNumber(0);  
  179.                         //再扫描一次,确保所有结果正确  
  180.                         x++;  
  181.                         moved = true;  
  182.                     }  
  183.                     else if(cardArr[x][y]->getNumber() == cardArr[x1][y]->getNumber())  
  184.                     {//当前位置不为空,而且同一行有数字,相同的就叠加,并清空原位置  
  185.                         cardArr[x][y]->setNumber((cardArr[x1][y]->getNumber())*2);  
  186.                         cardArr[x1][y]->setNumber(0);  
  187.                         score += (cardArr[x][y]->getNumber());  
  188.                         scoreLabel->setString(__String::createWithFormat("%i",score)->getCString());  
  189.                         moved = true;  
  190.                     }     
  191.                 break;  
  192.                 }  
  193.             }  
  194.         }  
  195.     }  
  196.     return moved;  
  197. }  
  198.   
  199. bool HelloWorld::isMoveUp()  
  200. {  
  201.     bool moved = false;  
  202.     for (int x = 0; x < 4; x++)  
  203.     {  
  204.         for (int y = 0; y < 4; y++)  
  205.         {  
  206.             for(int y1 = y+1; y1 < 4 ; y1++)  
  207.             {  
  208.                 if(cardArr[x][y1]->getNumber() > 0)  
  209.                 {   //当前位置为空,而同一行的有不为空的数字,就把它移到空的位置,接着把原位置清零  
  210.                     if(cardArr[x][y]->getNumber() <= 0)  
  211.                     {  
  212.                         cardArr[x][y]->setNumber(cardArr[x][y1]->getNumber());  
  213.                         cardArr[x][y1]->setNumber(0);  
  214.                         //再扫描一次,确保所有结果正确  
  215.                         y--;  
  216.                         moved = true;  
  217.                     }  
  218.                     else if(cardArr[x][y]->getNumber() == cardArr[x][y1]->getNumber())  
  219.                     {//当前位置不为空,而且同一行有数字,相同的就叠加,并清空原位置  
  220.                         cardArr[x][y]->setNumber((cardArr[x][y1]->getNumber())*2);  
  221.                         cardArr[x][y1]->setNumber(0);  
  222.                         score += (cardArr[x][y]->getNumber());  
  223.                         scoreLabel->setString(__String::createWithFormat("%i",score)->getCString());  
  224.                         moved = true;  
  225.                     }  
  226.                     break;                
  227.                 }  
  228.             }  
  229.         }  
  230.     }  
  231.     return moved;  
  232.   
  233. }  
  234.   
  235. bool HelloWorld::isMoveDown()  
  236. {  
  237.     bool moved = false;  
  238.     for (int x = 0; x < 4; x++)  
  239.     {  
  240.         for (int y = 3; y >= 0; y--)  
  241.         {  
  242.             for(int y1 = y-1; y1 >= 0 ; y1--)  
  243.             {  
  244.                 if(cardArr[x][y1]->getNumber() > 0)  
  245.                 {   //当前位置为空,而同一行的有不为空的数字,就把它移到空的位置,接着把原位置清零  
  246.                     if(cardArr[x][y]->getNumber() <= 0)  
  247.                     {  
  248.                         cardArr[x][y]->setNumber(cardArr[x][y1]->getNumber());  
  249.                         cardArr[x][y1]->setNumber(0);  
  250.                         //再扫描一次,确保所有结果正确  
  251.                         y++;  
  252.                         moved = true;  
  253.                     }  
  254.                     else if(cardArr[x][y]->getNumber() == cardArr[x][y1]->getNumber())  
  255.                     {//当前位置不为空,而且同一行有数字,相同的就叠加,并清空原位置  
  256.                         cardArr[x][y]->setNumber((cardArr[x][y1]->getNumber())*2);  
  257.                         cardArr[x][y1]->setNumber(0);  
  258.                         score += (cardArr[x][y]->getNumber());  
  259.                         scoreLabel->setString(__String::createWithFormat("%i",score)->getCString());  
  260.                         moved = true;  
  261.                     }  
  262.                     break;  
  263.                 }  
  264.             }  
  265.         }  
  266.     }  
  267.     return moved;  
  268.   
  269.   
  270. }  
  271.   
  272. void HelloWorld::createCard(Size size)  
  273. {  
  274.     //求出单元格的宽高  
  275.     int cardLen = (size.width-20)/4;  
  276.   
  277.     //4*4单元格  
  278.     for (int i = 0; i < 4; i++)  
  279.     {  
  280.         for (int j = 0; j < 4; j++)  
  281.         {  
  282.             Card *cards = Card::createCard(0,cardLen,cardLen,cardLen*i+12,cardLen*j+12+size.height/6);   
  283.             addChild(cards);  
  284.             //把卡片存在一个二维数组里面  
  285.             cardArr[i][j] = cards;  
  286.         }  
  287.     }  
  288. }  
  289.   
  290. void HelloWorld::autoCreateCard()  
  291. {  
  292.     //随机生成横坐标和纵坐标  
  293.     int row = CCRANDOM_0_1()*4;  
  294.     int col = CCRANDOM_0_1()*4;  
  295.   
  296.     //判断位置是否已经存在数字  
  297.     if(cardArr[row][col]->getNumber() > 0)  
  298.     {  
  299.         autoCreateCard();  
  300.     }  
  301.     else  
  302.     {   //4出现的几率是%10  
  303.         cardArr[row][col]->setNumber(CCRANDOM_0_1()*10<1?4:2);  
  304.     }  
  305.   
  306. }  
  307.   
  308. void HelloWorld::menuCloseCallback(Ref* pSender)  
  309. {  
  310. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)  
  311.     MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");  
  312.     return;  
  313. #endif  
  314.   
  315.     Director::getInstance()->end();  
  316.   
  317. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)  
  318.     exit(0);  
  319. #endif  
  320. }  
  321.   
  322. void HelloWorld::checkGameOver()  
  323. {  
  324.     bool isGameOver = true;  
  325.       
  326.     for (int y = 0; y < 4; y++)  
  327.     {  
  328.         for (int x = 0; x < 4; x++)  
  329.         {  
  330.             if(cardArr[x][y]->getNumber() == 0 ||  
  331.                 (x>0 && (cardArr[x][y]->getNumber() == cardArr[x-1][y]->getNumber()))||  
  332.                 (x<3 && (cardArr[x][y]->getNumber() == cardArr[x+1][y]->getNumber()))||  
  333.                 (y>0 && (cardArr[x][y]->getNumber() == cardArr[x][y-1]->getNumber()))||  
  334.                 (y<3 && (cardArr[x][y]->getNumber() == cardArr[x][y+1]->getNumber()))){  
  335.                     isGameOver = false;//满足以上条件则游戏继续  
  336.             }  
  337.         }  
  338.     }  
  339.   
  340.     if(isGameOver)  
  341.     {  
  342.         Director::getInstance()->replaceScene(TransitionFade::create(1,HelloWorld::createScene()));  
  343.     }  
  344. }  

3.游戏卡片精灵类

Card.h

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "cocos2d.h"  
  2.   
  3. USING_NS_CC;  
  4.   
  5. class  Card : public Sprite  
  6. {  
  7. public:  
  8.     //初始化框架三件套  
  9.     static Card* createCard(int num, int cardWeight, int cardHeight, float positionX, float positionY);  
  10.     virtual bool init();  
  11.     CREATE_FUNC(Card);  
  12.   
  13.     //设置数字并显示的方法  
  14.     void setNumber(int num);  
  15.       
  16.     //获取数字的方法  
  17.     int getNumber();  
  18.   
  19. private:  
  20.     //卡片中的数字  
  21.     int number;  
  22.     void cardInit(int num, int cardWeight, int cardHeight, float positionX, float positionY);  
  23.   
  24.     //用于显示数字的控件  
  25.     LabelTTF *cardLabel;  
  26.   
  27.     //控件的背景颜色  
  28.     LayerColor *cardBgColour;  
  29.   
  30. };  

Card.cpp

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "Card.h"  
  2.   
  3. USING_NS_CC;  
  4.   
  5. Card* Card::createCard(int num, int cardWeight, int cardHeight, float positionX, float positionY)  
  6. {  
  7.     Card* card = new Card();  
  8.     if(card && card->init())  
  9.     {  
  10.         card->autorelease();  
  11.         card->cardInit(num,cardWeight,cardHeight,positionX,positionY);  
  12.         return card;  
  13.     }  
  14.     CC_SAFE_DELETE(card);  
  15.     return NULL;  
  16. }  
  17.   
  18. bool Card::init()  
  19. {  
  20.     if(!Sprite::init())  
  21.         return false;  
  22.     return true;  
  23. }  
  24.   
  25. void Card::setNumber(int num)  
  26. {  
  27.     number = num;  
  28.     //设置字体的大小  
  29.     if(number >= 0 && number < 16)  
  30.     {  
  31.         cardLabel->setFontSize(50);  
  32.   
  33.     }  
  34.     if(number >= 16 && number < 128)  
  35.     {  
  36.         cardLabel->setFontSize(40);  
  37.   
  38.     }  
  39.     if(number >= 128 && number < 1024)  
  40.     {  
  41.         cardLabel->setFontSize(30);  
  42.     }  
  43.     if(number >= 1024)  
  44.     {  
  45.         cardLabel->setFontSize(20);    
  46.     }  
  47.   
  48.     //设置数字颜色  
  49.      if(number == 0){  
  50.          cardBgColour->setColor(Color3B(200,190,180));  
  51.      }  
  52.     if(number == 2){  
  53.         cardBgColour->setColor(Color3B(240,230,220));  
  54.     }  
  55.     if(number == 4){  
  56.         cardBgColour->setColor(Color3B(51,153,51));  
  57.     }  
  58.     if(number == 8){  
  59.         cardBgColour->setColor(Color3B(255,153,102));  
  60.     }  
  61.     if(number == 16){  
  62.         cardBgColour->setColor(Color3B(153,204,153));  
  63.     }  
  64.     if(number == 32){  
  65.         cardBgColour->setColor(Color3B(153,204,255));  
  66.     }  
  67.     if(number == 64){  
  68.         cardBgColour->setColor(Color3B(255,204,204));  
  69.     }  
  70.     if(number == 128){  
  71.         cardBgColour->setColor(Color3B(204,102,0));  
  72.     }  
  73.     if(number == 256){  
  74.         cardBgColour->setColor(Color3B(153,204,51));  
  75.     }  
  76.     if(number == 512){  
  77.         cardBgColour->setColor(Color3B(255,102,102));  
  78.     }  
  79.     if(number == 1024){  
  80.         cardBgColour->setColor(Color3B(204,204,255));  
  81.     }  
  82.     if(number == 2048){  
  83.         cardBgColour->setColor(Color3B(255,204,00));  
  84.     }  
  85.   
  86.     //显示数字  
  87.     if(number > 0)  
  88.         cardLabel->setString(__String::createWithFormat("%d",number)->getCString());  
  89.     else  
  90.         cardLabel->setString("");  
  91. }  
  92.   
  93. int Card::getNumber()  
  94. {  
  95.     return number;  
  96. }  
  97.   
  98. void Card::cardInit(int num, int cardWeight, int cardHeight, float positionX, float positionY)  
  99. {  
  100.     number = num;  
  101.   
  102.     //添加卡片背景颜色  
  103.     cardBgColour = LayerColor::create(Color4B(200,190,180,255),cardWeight-5,cardHeight-5);  
  104.     cardBgColour->setPosition(Point(positionX,positionY));  
  105.   
  106.     //判断num是否大于0,是就显示,否则显示空  
  107.     if(num > 0)  
  108.     {  
  109.         //设置字体  
  110.         cardLabel = LabelTTF::create(__String::createWithFormat("%d",number)->getCString(),"Arial",50);  
  111.         cardLabel->setPosition(Point(cardBgColour->getContentSize().width/2,cardBgColour->getContentSize().height/2));  
  112.         cardBgColour->addChild(cardLabel);  
  113.     }  
  114.     else  
  115.     {  
  116.         cardLabel = LabelTTF::create("","Arial",50);  
  117.         cardLabel->setPosition(Point(cardBgColour->getContentSize().width/2,cardBgColour->getContentSize().height/2));  
  118.         cardBgColour->addChild(cardLabel);  
  119.     }  
  120.   
  121.     this->addChild(cardBgColour);  
  122. }  



FROM: http://blog.youkuaiyun.com/ns2250225/article/details/39697373

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值