【cocos creator】玩家数据存储,读取,登录日期存储,第二天重置

本文详细介绍使用Cocos Creator进行游戏数据管理的方法,包括玩家数据的保存与读取、游戏物品背包管理、任务状态检查与更新等核心功能实现。探讨了如何通过本地存储管理游戏进度,并解决了模拟器和实际设备上可能遇到的性能问题。

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

// Learn cc.Class:
//  - https://docs.cocos.com/creator/manual/en/scripting/class.html
// Learn Attribute:
//  - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
//  - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html


var curMod = cc.Class({
    extends: cc.Component,

    properties: {
        // foo: {
        //     // ATTRIBUTES:
        //     default: null,        // The default value will be used only when the component attaching
        //                           // to a node for the first time
        //     type: cc.SpriteFrame, // optional, default is typeof default
        //     serializable: true,   // optional, default is true
        // },
        // bar: {
        //     get () {
        //         return this._bar;
        //     },
        //     set (value) {
        //         this._bar = value;
        //     }
        // },
        version: "103",
    },

    statics: {
        _instance: null,

        Instance() {
            return curMod._instance;
        },
    },

    // LIFE-CYCLE CALLBACKS:

    onLoad() {
        curMod._instance = this;
        cc.game.addPersistRootNode(this.node);
        var Bag = {};
        var item1 = {
            id: 1001,
            count: 1
        }
        var item2 = {
            id: 4001,
            count: 1
        }
        var date = new Date().getTime();
        Bag[1001] = item1;
        Bag[4001] = item2;
        this.userData = {
            PLname: "我",
            PLpicUrl: "",
            gameTime: 0,
            moneyCount: 0,
            MaxDeliveries: 0,
            MaxDistance: 0,
            bag: Bag,
            roleId: 1001,
            itemId: -1,
            vehicleId: 4001,
            lastLoginDay: date,
            loginDay: 1,
            dailyTask: {},
            CoinGetCountShare: 0,//分享
            CoinGetCountVideo: 0,//视频
        };
        this.readMsg();
    },

    SetMaxScore(destance, count) {
        if (destance > this.userData.MaxDistance ||
            (destance === this.userData.MaxDistance && count > this.userData.MaxDeliveries)) {
            this.userData.MaxDeliveries = count;
            this.userData.MaxDistance = destance;
            this.save();
        }
    },

    setDailyTask(ID, count, isGet) {
        if (this.userData.dailyTask[ID] && !isGet) {
            if (parseInt(ID / 1000)) {
                this.userData.dailyTask[ID].count = count;
            }
            else {
                this.userData.dailyTask[ID].count += count;
            }
        }
        else if (this.userData.dailyTask[ID] && isGet) {
            this.userData.dailyTask[ID].isGet = true;
        }
        else {
            var item = {
                id: ID,
                count: count,
                isGet: false,
            }
            this.userData.dailyTask[ID] = item;
        }
        //this.save();
    },

    checkDailyState(ID) {
        var id = parseInt(ID / 1000);
        var DailyTasks = require('TableUtil').GetTableByName('DailyTask');//XML为json文件名
        if (this.userData.dailyTask[id] && !this.userData.dailyTask[id].isGet) {
            if (id === 1) {
                if (this.userData.dailyTask[id].count = DailyTasks[ID].taskCount) {
                    return true;
                }
            }
            else {
                if (this.userData.dailyTask[id].count >= DailyTasks[ID].taskCount) {
                    return true;
                }
            }
        }
        return false;
    },

    getDailyState(ID) {
        if (this.userData.dailyTask[ID] && this.userData.dailyTask[ID].isGet) {
            return true;
        }
        return false;
    },

    start() {
        require('TableUtil').initAllTable();//加载所有表
    },

    getData() {
        return this.userData;
    },

    addBag(ID) {
        if (this.userData.bag[ID]) {
            this.userData.bag[ID].count += 1;
        }
        else {
            var item = {
                id: ID,
                count: 1
            }
            this.userData.bag[ID] = item;
        }
        if (parseInt(ID / 1000) === 1) {
            this.userData.roleId = ID;
        }
        else if (parseInt(ID / 1000) === 2 || parseInt(ID / 1000) === 3) {
            this.userData.itemId = ID;
        }
        else if (parseInt(ID / 1000) === 4) {
            this.userData.vehicleId = ID;
        }
        //this.save();
    },

    removeBag(ID) {
        if (this.userData.bag[ID]) {
            this.userData.bag[ID].count -= 1;
            if (this.userData.bag[ID].count === 0) {
                delete this.userData.bag[ID];
                this.userData.itemId = -1;
            }
        }
    },

    addMoney(count) {
        this.userData.moneyCount += count;
        //this.save();
    },

    save: function () {
        cc.sys.localStorage.setItem('SFJetpack_PlayerData', JSON.stringify(this.userData));//存数据
        console.log("保存玩家信息", this.userData)
    },

    save2: function () {
        cc.sys.localStorage.setItem('SFJetpack_V', this.version);//存数据
        console.log("保存玩家信息SFJetpack_V", this.version)
    },

    readMsg: function () {
        console.log("数据加载");
        //window.localStorage.removeItem('SFJetpack_PlayerData');
        if (cc.sys.localStorage.getItem('SFJetpack_V')) {
            var str = cc.sys.localStorage.getItem('SFJetpack_V');//读取数据
            if (this.version === str) {

            }
            else {
            }
        } else {
            this.save2();
        }
        if (cc.sys.localStorage.getItem('SFJetpack_PlayerData')) {
            var str = cc.sys.localStorage.getItem('SFJetpack_PlayerData');//读取数据
            //console.log("读取数据", str)
            //console.log(str)
            str = str.replace(/\ +/g, "");//去掉空格
            str = str.replace(/[\r\n]/g, "");//去掉回车换行
            this.userData = JSON.parse(str);
            if (!this.userData.CoinGetCountShare) {
                this.userData.CoinGetCountShare = 0;
                this.userData.CoinGetCountVideo = 0;
            }
            if (this.CheckLoginDate(this.userData.lastLoginDay)) {
                this.userData.loginDay++;
                this.userData.dailyTask = {};
                this.userData.CoinGetCountShare = 0;
                this.userData.CoinGetCountVideo = 0;
                console.log("第二天重置数据");
            }
            this.userData.lastLoginDay = new Date().getTime();
            this.save();
            console.log("读取信息", this.userData)
        } else {
            this.save();
        }
        // cc.log(this.userData.lastLoginDay, new Date())
        console.log("玩家信息:", this.userData)
        //this.addMoney(50000);
    },

    CheckLoginDate(lastLoginDay) {
        var lastLoginDay = new Date(lastLoginDay);
        var now = new Date();
        if (now.getFullYear() !== lastLoginDay.getFullYear() ||
            now.getMonth() !== lastLoginDay.getMonth() ||
            now.getDate() !== lastLoginDay.getDate()) {
            return true;
        }
        cc.log("第二天", lastLoginDay.toDateString(), now.toDateString())
        return false;
    },
    // update (dt) {},
});

android 模拟器和实机 用cc.sys.localStorage 会导致掉帧,就算不频繁调用也会导致掉帧的,官方也没什么优化方案,属于遗留问题。
目前来说解决办法就是用JSB写文件来储存:
jsb.fileUtils.writeStringToFile(string, filename)
jsb.fileUtils.getStringFromFile(filename)

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烧仙草奶茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值