zoukankan      html  css  js  c++  java
  • 关于Cocos2d-x中数据的存储

    当局分数的打印和最高分数的记录

    1.首先定义一个Label类型的节点在GameScene.cpp的init方法中,设置初始分数为0

    _myScore = 0;
    scorelabel = Label::createWithSystemFont("Score: 0", "Arial", 36);
    scorelabel->setAnchorPoint(Vec2(1, 0));
    scorelabel->setColor(Color3B::BLACK);
    scorelabel->setPosition(size.width, size.height - scorelabel->getContentSize().height); 
    this->addChild(scorelabel,2);

    2.当满足某个加分条件时,改变Label的文本值(没必要放在什么Update方法中,效率太低)

    //如果敌方飞机挂了,玩家增加分数,加1分
    _myScore += 1;
    char buf[100] = { 0 };
    sprintf(buf, "Score: %d", _myScore);
    scorelabel->setString(buf);

    3.满足游戏结束的条件时执行publishScore();方法,把这局游戏的分数存储到一个UserDefault.XML文件里面,这个UserDefault.XML文件是Cocos2d-x自己可以设计生成的一个小型数据库文件,更多的时候是用来记录玩家的最高记录时使用的。

    //如果玩家生命值为0,游戏结束

    publishScore(); //满足游戏结束的条件时执行

    void GameScene::publishScore()
    {
      auto userdefault = UserDefault::getInstance();

      //查看路径,测试用
      //log(userdefault->getXMLFilePath().c_str());

      //存储本次游戏分数
      char score_str[100] = { 0 };
      sprintf(score_str, "%d", _myScore);
      userdefault->setStringForKey("LastScore", score_str);

      //存储最佳游戏分数
      auto bestscore = userdefault->getStringForKey("BestScore");
      if (_myScore > atoi(bestscore.c_str()))
      userdefault->setStringForKey("BestScore", score_str);
    }

    4.在游戏结束的界面GameOver.cpp的init方法中,添加两个Label节点,分别打印出这局游戏的最终分数以及玩家的最高分数。

    //显示本次分数,位于中间
    auto score = UserDefault::getInstance()->getStringForKey("LastScore");

    auto labelscore = Label::createWithTTF(score, "fonts/Marker Felt.ttf", 36);

    labelscore->setColor(Color3B::BLACK);

    labelscore->setPosition(Vec2(labelscore->getContentSize().width / 2 + 50, visibleSize.height - labelscore->getContentSize().height / 2 - 120));
    addChild(labelscore);


    //显示最佳分数,位于左上
    auto bestscore = UserDefault::getInstance()->getStringForKey("BestScore");

    auto labelbestscore = Label::createWithSystemFont(bestscore, "Arial", 36);

    labelbestscore->setColor(Color3B::BLACK);

    labelbestscore->setPosition(Vec2(labelbestscore->getContentSize().width / 2 + 50, visibleSize.height - labelbestscore->getContentSize().height / 2 - 80));

    addChild(labelbestscore);

    注意:

    1.记录最高分数是记录在UserDefault.XML文件中,所以关掉游戏,下次再打开,还是那个最高分数,这个和C/C++中文件操作的原理差不多。要想知道UserDefault.XML文件在哪里,可以用测试语句打印出UserDefault.XML文件的路径

    //查看路径,测试用
    log(userdefault->getXMLFilePath().c_str());

    这个例子的路径是在

    C:/Users/Administrator/AppData/Local/NoOneDies_st/UserDefault.xml

    所以一般都是在C:/Users/Administrator/AppData/Local/游戏名/UserDefault.xml这种格式的路径下,就算删除了,下次运行游戏的时候也会自动再生成,不过最高分数会变成0,这种做法也可以用在平时写代码清零的时候,删一删这个文件。不然不管你开游戏关游戏多少次,最高分数还是那个,不会改变的,已经记录在我们电脑的文件上了。

    2.如果Label无缘无故不显示在场景的层中,很可能是因为和场景的层的颜色一样,导致看不见。

  • 相关阅读:
    vpp编写plugin
    vrf 命令
    vxlan + 多个vrf
    dpdk helloworld
    Go函数高级
    Go_defer
    Go递归函数
    Go作用域
    Go函数
    Go字符串
  • 原文地址:https://www.cnblogs.com/HangZhe/p/5793310.html
Copyright © 2011-2022 走看看