porridgechen890的笔记

梦里不知身是客

遇到的问题

在用SSH方式克隆仓库时报错:

git@gitee.com: Permission denied (publickey).
fatal: Could not read from remote repository.

检查电脑上有没有钥匙

用户目录下有一个叫 .ssh 的文件夹。如果有这个文件夹,检查这个文件夹里是否有钥匙,如果没有就生成钥匙。如果有就拷贝到账户设置里。

如何生成钥匙

需要用到 ssh-keygen 这个命令(可以通过输入 ssh-keygen --help 来查看用法)。

在终端(或命令行窗口)里输入 ssh-keygen -t rsa -C "your_email@xxx.com" -f ~/.ssh/filename1 就可以了。

邮箱和文件名可以自己改,输入命令后一直回车就可以了,不用输入密码。

我发现邮箱不用双引号括起来也没关系

如何生成多个钥匙

如果想要同时使用gitee和github的仓库,可以这样做:

ssh-keygen -t rsa -C 'aaa@bbb.com' -f ~/.ssh/gitee_id_rsa
ssh-keygen -t rsa -C 'ccc@ddd.com' -f ~/.ssh/github_id_rsa

在本地配置钥匙

在 ~/.ssh 目录下新建一个config文件,添加如下内容(其中Host和HostName填写git服务器的域名,IdentityFile指定私钥的路径)

# gitee
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitee_id_rsa
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id_rsa

在远程配置钥匙

把你刚生成的公钥拷贝到 github 账号(或 gitee 账号)的 SSH 设置里。

测试钥匙

ssh -T git@gitee.com
ssh -T git@github.com

# -*- coding: utf-8 -*-
import os
import base64
import pyperclip

# 图片名称
g_pic_name = 'IMG_1871'

# 图片所在的目录,从跟本py文件同级开始算
g_pic_folder = '12/1230/'

full_path = os.path.abspath('.')
full_path = os.path.join(full_path, g_pic_folder + g_pic_name + '.webp')

# 以二进制读取图片
f = open(full_path, 'rb')

# 得到 byte 编码的数据
base64data = base64.b64encode(f.read())

# 重新编码数据
str2 = str(base64data, 'utf-8')

# 文件名
str0 = '[' + g_pic_name + ']:data:image/webp;base64,'

pyperclip.copy(str0 + str2)
f.close()

先安装好python3cwebp

# -*- coding: utf-8 -*-
import os
import shutil


# 输入目录的路径,注意这里是图片所在文件夹的父文件夹,末尾不带斜杠
g_path_old = '/Users/cz/Downloads/光遇雨宝'
# 图片的目录名,末尾不带斜杠
g_folder = '12'
# 可执行文件的路径,末尾不带斜杠
g_exe_path = '/Users/cz/Downloads/libwebp-1.2.1-mac-10.15/bin/cwebp'

# 统计不是png也不是jpg的文件
g_list_not_png_jpg = []
# 输出目录的路径
g_path_new = os.path.abspath('.')


# 调用可执行文件压图
def call_exe(lv_file_input, lv_file_output):
    lv_para = "%s %s %s %s"%(g_exe_path, lv_file_input, "-o", lv_file_output)
    print(lv_para)
    os.system(lv_para)

# 遍历当前目录,把所有png转换成webp
def png_2_webp(root_path_old, root_path_new):

    if os.path.isdir(root_path_new):
        shutil.rmtree(root_path_new)
    os.mkdir(root_path_new)

    for root,dirs,files in os.walk(root_path_old): 
        for dir in dirs:
            lv_dir_full_path_old = os.path.join(root,dir)
            lv_dir_full_path_new = lv_dir_full_path_old.replace(g_path_old, g_path_new)
            os.mkdir(lv_dir_full_path_new)
        for file in files:
            if file == '.DS_Store':
                continue
            lv_full_path_old = os.path.join(root,file)
            lv_list = os.path.splitext(file)
            lv_ext = lv_list[1]
            lv_file_new = lv_list[0] + '.webp'
            if lv_ext == '.PNG' or lv_ext == '.png' or lv_ext == '.JPG' or lv_ext == '.jpg' or lv_ext == '.HEIC' or lv_ext == '.heic':
                lv_full_path_new = os.path.join(root,lv_file_new)
                lv_full_path_new2 = lv_full_path_new.replace(g_path_old, g_path_new)
                call_exe(lv_full_path_old, lv_full_path_new2)
            elif lv_ext == '.MP4' or lv_ext == '.MOV':
                lv_full_path_new = lv_full_path_old.replace(g_path_old, g_path_new)
                shutil.copy(lv_full_path_old, lv_full_path_new)
            else:
                g_list_not_png_jpg.append(lv_full_path_old)
                continue

if __name__ == "__main__":
    #shutil.copytree(os.path.join(pic_floder_path, pic_floder_name), os.path.join(py_file_path, pic_floder_name))
    png_2_webp(os.path.join(g_path_old, g_folder), os.path.join(g_path_new, g_folder))
    #print(g_list_not_png_jpg)

公元907到960,共53年。

  • 唐朝末期,藩镇割据。

  • 朱温(原来是黄巢起义的大将,后成为唐朝的宣武节度使)灭唐。

  • 梁唐晋汉周和周边国家,五代十国。

  • 梁:朱温睡儿媳。

  • 唐:李克用(原来是唐朝的河东节度使)、李存勖、刘皇后、李嗣源。伶官传序。

  • 晋:石敬瑭(原来是后唐皇帝的妹夫),燕云十六州。

  • 契丹灭晋后,入主中原,改国号辽。被反抗势力赶回北方。耶律德光(耶律阿保机的儿子)死于河北的一个树林,后称杀胡林。

  • 汉:刘知远。杨继业-刘继业-杨继业。

  • 周:郭威(原来是后汉的大臣),柴荣(郭威的养子),赵匡胤。

朱温和李克用都是在围剿黄巢叛乱中壮大起来的军事集团。朱温和李克用曾在围剿黄巢中合作。合作成功后,朱温层宴请李克用,宴会上李克用处处逞强,言语多有不敬,宴会后,朱温围杀李克用,李克用逃走。

耶律阿保机建立契丹。

石敬瑭利用国际关系解决家庭矛盾。

妻哥叫大舅子,妻弟叫小舅子。

后唐被灭之后,南吴的徐知诰,改名李昪,改国号唐。历史上称为南唐。

新增的一个时间戳属性,用来打点

  1. CandyManager类增加一个属性,在long time_total, time_left, time_used;之后:

    string level_timestamp; // 用于记录下of_start的时间,用来在数据中唯一标识一局游戏。

    CandyManager::CandyManager(void)里加一句初始化这个属性的代码:

    level_timestamp = ""; // 形成新的时间标识。

    CandyManager::of_start函数里增加一句给这个属性赋值的代码:

    level_timestamp = PF::tostring(PFJava::of_get_time_seconds()); // 形成新的时间标识。

    使用这个属性是在CandyYifanTrack::of_get_pub_string()函数里。

Adjust的几个属性

  1. 概述:这几个属性是java端才知道的。通过buyItemOk这个函数传回给c++端。通过字符串ON_ADJUST_USER_INFO_GET:来标志。

  2. PubConfigParm.h里增加一个宏定义,在CandyYifanTrack.cpp里会用到,所以现在就去CandyYifanTrack.cpp里写上#include "PubConfigParm.h"

    #define PUB_KEY_JAVA_INFO_DEV_STRING "+:::::+"

    DreamPub.java里给DreamPub类增加一个属性

    public static String pub_dev_key = "+:::::+";
  3. 给CandyYifanTrack类增加几个属性和一个方法,放在#pragma region 数据存储这个区域内。

    string is_user_tracktoken;
    string is_user_network;
    string is_user_campaign;
    string is_user_adgroup;
    string is_user_creative;
    
    // 因为名字中的内容比较长,比较乱,所以要注意分隔符。
    // token+:::::+networe+:::::+campaign+:::::+adgroup+:::::+creative
    void of_set_adjust_user_info(const string& as_info);
  4. 在构造函数CandyYifanTrack::CandyYifanTrack()里增加初始化这几个变量的代码:

    // adjust信息
    is_user_tracktoken = "";
    is_user_network = "";
    is_user_campaign = "";
    is_user_adgroup = "";
    is_user_creative = "";
  5. 在存盘的函数CandyYifanTrack::of_save_track_info()里,存一下这几个变量:

    ls_text += PF::create_key("is_user_tracktoken", is_user_tracktoken);
    ls_text += PF::create_key("is_user_network", is_user_network);
    ls_text += PF::create_key("is_user_campaign", is_user_campaign);
    ls_text += PF::create_key("is_user_adgroup", is_user_adgroup);
    ls_text += PF::create_key("is_user_creative", is_user_creative);
  6. 在读盘的函数CandyYifanTrack::of_load_track_info()里,读一下这几个变量:

    // adjust信息
    is_user_tracktoken = PF::key_format(ls_text, "is_user_tracktoken");
    is_user_network = PF::key_format(ls_text, "is_user_network");
    is_user_campaign = PF::key_format(ls_text, "is_user_campaign");
    is_user_adgroup = PF::key_format(ls_text, "is_user_adgroup");
    is_user_creative = PF::key_format(ls_text, "is_user_creative");
  7. 刚增加的方法,的实现部分:

    // 因为名字中的内容比较长,比较乱,所以要注意分隔符。
    // token+:::::+networe+:::::+campaign+:::::+adgroup+:::::+creative
    void CandyYifanTrack::of_set_adjust_user_info(const string& as_info) {
        auto ss = PF::spilt(as_info, PUB_KEY_JAVA_INFO_DEV_STRING);
        if (ss.size() >= 5) {
            is_user_tracktoken = ss[0];
            is_user_network = ss[1];
            is_user_campaign = ss[2];
            is_user_adgroup = ss[3];
            is_user_creative = ss[4];
            of_save_track_info();
        }
    }
  8. 修改CandyYifanTrack::of_get_pub_string方法,在string ls_msg = PF::create_track_line("u_event", as_event );后面增加如下代码:

    // 这里要先计算一下。
    g.cm->of_cal_life(); 
    
    // SDK的通用需求:发布的市场字段
    #if(CC_TARGET_PLATFOREM == CC_PLATFORM_ANDROID)
        ls_msg += PF::create_track_line("__store", "Google Play");
    #endif
    #if(CC_TARGET_PLATFOREM == CC_PLATFORM_IOS)
        ls_msg += PF::create_track_line("__store", "App Store");
    #endif
    
    // 公用部分事件属性,注意里面有 max_level 
    ls_msg += PF::create_track_line("u_model", g.game_model);
    ls_msg += PF::create_track_line("u_level", g.game_level);
    ls_msg += PF::create_track_line("u_page", is_current_page);
    ls_msg += PF::create_track_line("max_level", il_max_level);// 最大关卡号 
    ls_msg += PF::create_track_line("life_count", g.cm->pub_life);
    
    // adjust的属性段
    ls_msg += PF::create_track_line("user_tracktoken", is_user_tracktoken);
    ls_msg += PF::create_track_line("user_network", is_user_network);
    ls_msg += PF::create_track_line("user_campaign", is_user_campaign);
    ls_msg += PF::create_track_line("user_adgroup", is_user_adgroup);
    ls_msg += PF::create_track_line("user_creative", is_user_creative);
    
    // 金币段
    ls_msg += PF::create_track_line("money1_count", g.cm->pub_money1);
    ls_msg += PF::create_track_line("money2_count", g.cm->pub_money2);
    ls_msg += PF::create_track_line("money3_count", 0);
    ls_msg += PF::create_track_line("money4_count", 0);
    ls_msg += PF::create_track_line("money5_count", 0);
    ls_msg += PF::create_track_line("money6_count", 0);
    
    // 道具的状态.
    ls_msg += PF::create_track_line("tool_hammer_left", g.cm->of_get_magic("hammer").count);
    ls_msg += PF::create_track_line("tool_bomb_left", g.cm->of_get_magic("bomb").count);
    ls_msg += PF::create_track_line("tool_same_left", g.cm->of_get_magic("same").count);
    ls_msg += PF::create_track_line("tool_beforelineline_left", g.cm->of_get_magic("beforelineline").count);
    ls_msg += PF::create_track_line("tool_beforebombbomb_left", g.cm->of_get_magic("beforebombbomb").count);
    ls_msg += PF::create_track_line("tool_beforesame_left", g.cm->of_get_magic("beforesame").count);
    
    // 活动的状态
    //ls_msg += PF::create_track_line("activity_treasure", g.candy_treasure->of_is_doing());
    //ls_msg += PF::create_track_line("activity_littlebuilding", g.candy_building_little->of_is_in_task());
    //ls_msg += PF::create_track_line("activity_ranking", g.candy_competition->is_in_competing());
    //ls_msg += PF::create_track_line("activity_bigspin", g.candy_big_spin->of_is_doing());
    
    // 装修的状态 ::: 需要待定处理 
    //ls_msg += PF::create_track_line("area_id", StoryManager::getInstance()->of_get_area_id());
    //ls_msg += PF::create_track_line("area_task_done", StoryManager::getInstance()->of_get_task_done());
    //ls_msg += PF::create_track_line("area_task_all", StoryManager::getInstance()->of_get_task_all());
    
    
    // 关卡进度相关的数据,这个只同关卡事件相关,放在公用位置更汇总一些。
    ls_msg += PF::create_track_line("level_timestamp", g.level_timestamp);
    ls_msg += PF::create_track_line("level_move_used", g.moves_used);
    ls_msg += PF::create_track_line("level_move_left", g.moves_left);
    ls_msg += PF::create_track_line("level_move_total", g.moves_total);
    ls_msg += PF::create_track_line("level_second_used", il_time_count_second);
    ls_msg += PF::create_track_line("level_time_used", g.time_used);
    ls_msg += PF::create_track_line("level_time_total", g.time_total);
    ls_msg += PF::create_track_line("level_tools_used", is_magic_used);
    ls_msg += PF::create_track_line("level_goon_count", g.ii_count_goon_current_level - 1); // 注意这里是需要减一下的,这个变量代表了是弹出了多少次窗口。

处理Java端的回调

  1. CandyMagic::of_buy_succ函数里增加处理java端回调的代码:

    #pragma region java or ios callback event
    string ls_temp = good_id;
    //// 因为名字中的内容比较长,比较乱,所以要注意分隔符。
    // token+:::::+networe+:::::+campaign+:::::+adgroup+:::::+creative
    string ls_key_adjust_info = "ON_ADJUST_USER_INFO_GET:";
    if (ls_temp.find(ls_key_adjust_info) == 0) {//因为Java那里肯定是以这个开头的
        auto sss1 = ls_temp.substr(ls_key_adjust_info.size());
        g.candy_yifan_track->of_set_adjust_user_info(sss1);
        return;
    }
    #pragma endregion

Java端的修改

  1. 先按文档做好。

  2. AppActivity.java文件里的广告监听器里增加打点:

    SDKAgent.setAdListener(new AdListener() {
        @Override
        public void onAdClicked(AdBase var1) {
            super.onAdClicked(var1);
    
            // 此处通过回调进行数据的打点
            //  广告类型 interstitial  video
            //  广告方    facebook , admob , ,,,
            // 广告位ID:广告类型:广告方:广告位置
            String ls_info = var1.adId +":" + var1.type  + ":" + var1.name + ":" + var1.page;
            buyItemOk("ON_AD_CLICK:" + ls_info );
    
            // 用户增加类属性
            HashMap userAddMap = new HashMap();
            userAddMap.put("ad_click_count" , 1 );
            if (AdType.TYPE_INTERSTITIAL.equals(var1.type)){
                userAddMap.put("ad_click_count_interstitial" , 1  );
            }
            if (AdType.TYPE_VIDEO.equals(var1.type)){
                userAddMap.put("ad_click_count_video" , 1  );
            }
            YFDataAgent.trackUserAdd(userAddMap);
        }
    
        @Override
        public void onAdShow(AdBase var1) {
            super.onAdShow(var1);
    
            // 此处通过回调进行数据的打点
            //  广告类型 interstitial  video
            //  广告方    facebook , admob , ,,,
            // 广告位ID:广告类型:广告方:广告位置
            String ls_info = var1.adId +":" + var1.type  + ":" + var1.name + ":" + var1.page;
            buyItemOk("ON_AD_SHOW:" + ls_info );
            
            HashMap userAddMap = new HashMap();
            userAddMap.put("ad_count_all" , 1 );
            if (AdType.TYPE_INTERSTITIAL.equals(var1.type)){
                userAddMap.put("ad_count_interstitial" , 1  );
            }
            if (AdType.TYPE_VIDEO.equals(var1.type)){
                userAddMap.put("ad_count_video" , 1  );
            }
            YFDataAgent.trackUserAdd(userAddMap);
        }
    });
  3. 在类PubAdjustNew里新增几个属性,放在public long il_goon_coin_times_total = 0 ; // 一共进行了多少继续游戏的操作之后就行。

    public String user_tracktoken = "";
    public String user_network = "";
    public String user_campaign = "";
    public String user_adgroup = "";
    public String user_creative = "";
  4. 在类PubAdjustNew文件里新增一个函数of_read_adjust_info用来读取Adjust传过来的几个属性。

    /**
      * 读取玩家来源信息
      * 2.3 版本起自然用户全部置为 PAY 用户
      */
     public void of_read_adjust_info(){
    
         if(user_creative != null && user_creative.length() > 0 ){
             return;
         }
    
         try{
             new Thread(new Runnable() {
                 @Override
                 public void run() {
                     try{
                         AdjustAttribution info1 = Adjust.getAttribution();
    
                         user_tracktoken = info1.trackerToken;
                         user_network    = info1.network;
                         user_campaign   = info1.campaign;
                         user_adgroup    = info1.adgroup;
                         user_creative   = info1.creative;
    
                         if( user_tracktoken == null ) user_tracktoken = "";
                         if( user_network == null )    user_network = "";
                         if( user_campaign == null )   user_campaign = "";
                         if( user_adgroup == null )    user_adgroup = "";
                         if( user_creative == null )   user_creative = "";
    
                         // 提交数据至用户属性
                         if( user_tracktoken.length() > 1 ){
                             //user_setonce用户属性打点
                             HashMap userSetOnceMap = new HashMap();
                             userSetOnceMap.put("user_tracktoken",user_tracktoken);
                             userSetOnceMap.put("user_network",user_network);
                             userSetOnceMap.put("user_campaign",user_campaign);
                             userSetOnceMap.put("user_adgroup",user_adgroup);
                             userSetOnceMap.put("user_creative",user_creative);
                             YFDataAgent.trackUserSetOnce(userSetOnceMap);
                         }
    
                         // 传给c++
                         String ls_info = "ON_ADJUST_USER_INFO_GET:" ;
                         ls_info += user_tracktoken + DreamPub.pub_dev_key;
                         ls_info += user_network + DreamPub.pub_dev_key;
                         ls_info += user_campaign + DreamPub.pub_dev_key;
                         ls_info += user_adgroup  + DreamPub.pub_dev_key;
                         ls_info += user_creative  ;
                         ((AppActivity)_activity).buyItemOk(ls_info);
    
    
                     }
                     catch (Exception e2){
                         e2.printStackTrace();
                     }
                 }
             }).start();
         }
         catch (Exception e1){
             e1.printStackTrace();
         }
    
     }

    粘贴完刚才的代码后,可能需要引入相应的包。

  5. 这几个属性在这里赋值:

    public class PubAdjustNew {
        public void onResume(){
            of_read_adjust_info();
        }
    }

内购的打点

  1. 内购成功的函数:
VerifyPurchaseUtil.OnVerifyPurchaseListener onVerifyPurchaseListener = new VerifyPurchaseUtil.OnVerifyPurchaseListener(){
    public void onVerifyFinish(GooglePurchase googlePurchase) {
        DreamPub._adjustnew.of_track_moneypay( googlePurchase.getOrderId()  , googlePurchase.getProductId()  );//这里调用打点的代码
    }
}
  1. PubAdjustNew新增一个函数:
public class PubAdjustNew {
        //  只处理次数统计,不处理金额部分
    public void of_track_moneypay( String as_orderid  ,String as_goodid   ){
        if(as_goodid == null ) as_goodid = "";
        if(as_orderid == null ) as_orderid = "";


        // 购买成功次数的计算与打点         // 注意要修改此值
        long     ll_count = 0;
        String save_key  = "paymoney_count";
        String save_name = "pub_adjust_count" ;
        SharedPreferences sh =_activity .getSharedPreferences(save_name, 0);
        ll_count = sh.getLong( save_key ,0);
        ll_count ++;
        SharedPreferences.Editor shedit = sh.edit();
        shedit.putLong ( save_key    , ll_count  );
        shedit.commit();
        //  一共买了多少次的打点
        String ls_adjust_times = "money_pay_" + ll_count;
        if( ll_count >= 5 ){
            ls_adjust_times = "money_pay_5more";
        }
        of_track_adjust(ls_adjust_times);


        // 首次内购日期时。
        //user_setonce用户属性打点
        try {
            // 根据goodid的后四位来作为价格
            String ls_price = "0";
            if(as_goodid.length() >= 4 ){
                int li_pos_last1 = as_goodid.lastIndexOf(".");
                if(li_pos_last1 > 0 && li_pos_last1 < as_goodid.length() ){ // 这里是肯定大于0的。
                    ls_price = as_goodid.substring(li_pos_last1 + 1  );
                }
            }
            // 得到价格信息
            float lf_price = 0;
            try{
                lf_price = Float.parseFloat(ls_price);
            }
            catch (NumberFormatException e){

            }
            lf_price = lf_price / 100; // 转为美元。


            // 事件数据追踪打点
            // 一次性
            HashMap userSetOnceMap = new HashMap();
            userSetOnceMap.put("purchase_first_date", DreamPub.of_get_today_number()+ "");
            YFDataAgent.trackUserSetOnce(userSetOnceMap);

            // 增加类属性
            HashMap userAddMap = new HashMap();
            userAddMap.put("purchase_times" , 1 );
            userAddMap.put("purchase_sum" , lf_price  );
            YFDataAgent.trackUserAdd(userAddMap);

            // 返回给c++端
            // 内购点:订单号:价格
            String ls_info = as_goodid + DreamPub.pub_dev_key + as_orderid + DreamPub.pub_dev_key + ls_price;
            ((AppActivity)_activity).buyItemOk("ON_PURCHASE_VERIFIED:" + ls_info );


        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}
  1. 在C++那边处理一下Java的回调:

    void CandyMagic::of_buy_succ(string good_id){
        #pragma region java or ios callback event
        // 内购完成的追踪
        // 返回给c++端
        // 内购点:订单号:价格
        //String ls_info = as_goodid + "+:::::+" + as_orderid + "+:::::+" + ls_price;
        //((AppActivity)_activity).buyItemOk("ON_PURCHASE_VERIFIED:" + ls_info);
        // 
        string ls_key_purchase_verified = "ON_PURCHASE_VERIFIED:";
        if (ls_temp.find(ls_key_purchase_verified) == 0) {
            auto sss2 = ls_temp.substr(ls_key_purchase_verified.size());
            g.candy_yifan_track->of_track_purchase_verified(ls_temp);
            return;
        }
        #pragma endregion
    }
  2. CandyYifanTrack类增加一个方法:

    class CandyYifanTrack {
        #pragma region 跟踪类的方法
            void of_track_purchase_verified(const string& as_string);
        #pragma endregion
    }

    定义部分:

    // 内购完成的追踪
    // 返回给c++端
    // 内购点:订单号:价格
    //String ls_info = as_goodid +PUB_KEY_JAVA_INFO_DEV_STRING + as_orderid + PUB_KEY_JAVA_INFO_DEV_STRING + ls_price;
    //((AppActivity)_activity).buyItemOk("ON_PURCHASE_VERIFIED:" + ls_info);
    void CandyYifanTrack::of_track_purchase_verified(const string& as_string) {
        auto ss = PF::spilt(as_string, PUB_KEY_JAVA_INFO_DEV_STRING);
        if (ss.size() >= 3) {
            auto ls_msg = of_get_pub_string("purchase_succ");
            ls_msg += PF::create_track_line("purchase_good_id", ss[0]);
            ls_msg += PF::create_track_line("purchase_order_id", ss[1]);
            ls_msg += PF::create_track_line("purchase_price", ss[2]);
            PFJava::of_satcic_yifan_track(ls_msg);
        }
    }

处理一下java发来的广告部分回调

  1. 处理ON_AD_CLICK:ON_AD_SHOW:

    void CandyMagic::of_buy_succ(string good_id){
        #pragma region java or ios callback event
            // 广告事件打点的处理
            // 此处通过回调进行数据的打点
            //  广告类型 interstitial  video
            //  广告方    facebook , admob , ,,,
            // 广告位ID:广告类型:广告方:广告位置
            //String ls_info = var1.adId + ":" + var1.type + ":" + var1.name + ":" + var1.page;
            //buyItemOk("ON_AD_CLICK:" + ls_info);
            //buyItemOk("ON_AD_SHOW:" + ls_info );
            if (ls_temp.find("ON_AD_CLICK:") == 0 || ls_temp.find("ON_AD_SHOW:") == 0) {
                g.candy_yifan_track->of_track_ad(ls_temp);
                return;
            }
        #pragma endregion
    }
  2. 补上缺少的函数:

    // 广告的追踪,通过回调过来的内容进行处理
    // 此处通过回调进行数据的打点
    //  广告类型 interstitial  video
    //  广告方    facebook , admob , ,,,
    //  广告位ID:广告类型:广告方:广告位置,对于视频的这个位置并不准确
    //  String ls_info = var1.adId + ":" + var1.type + ":" + var1.name + ":" + var1.page;
    //  buyItemOk("ON_AD_CLICK:" + ls_info); 
    //  buyItemOk("ON_AD_SHOW:" + ls_info);
    void CandyYifanTrack::of_track_ad(const string& as_string) {
        auto ss = PF::spilt(as_string, ":");
        if (ss.size() < 5) return; // 无法解析,数量不足
    
                                //ad_show	广告展示(回调中触发)
                                //ad_click	广告点击(回调中触发)
                                //ad_video_show	调用端触发。只处理page信息 
        string ls_event = "none";
        if (ss[0] == "ON_AD_CLICK") ls_event = "ad_click";
        if (ss[0] == "ON_AD_SHOW") ls_event = "ad_show";
    
        auto ls_msg = of_get_pub_string(ls_event);
        ls_msg += PF::create_track_line("ad_pid", ss[0]);
        ls_msg += PF::create_track_line("ad_adtype", ss[1]);
        ls_msg += PF::create_track_line("ad_adnet", ss[2]);
        ls_msg += PF::create_track_line("ad_page", ss[3]);
        PFJava::of_satcic_yifan_track(ls_msg);
    
    }

错误

在克隆仓库时提示fatal: Authentication failed for xxx

Windows电脑上怎么去处理

开始->设置->搜索“控制面板”->以类别方式排序,找到“用户账户”,点进去->“管理Windows凭据”->找到不对的那个凭证,删掉。

然后再去克隆仓库时,会让你重新输入用户名和密码。

修改 CCFileUtils 这个类

  1. 在头文件cocos2d/cocos/platform/CCFileUtils.h里增加一个成员变量

    class FileUtils {
    protected:
    mutable std::unordered_map<std::string, std::string> _fullPathCache;//原来就有的代码
    std::unordered_map<std::string, std::string> m_my_hash_map_xxxxx;//新增的代码
    }
阅读全文 »

  1. 在本地新建分支(假设新分支叫dev),然后切换过去。

    git branch dev

    git switch dev

    当然你也可以用一条命令完成这两个步骤:git checkout -b dev

  2. 分支上多次提交后,切回主分支,开始合并

    git merge --squash dev

  3. 查看状态,发现所有修改的文件都add上了,此时只需要commit一下

代码里如何播放时间轴动画

auto csb = cocos2d::CSLoader::createNode(csb_path);
auto tla = cocos2d::CSLoader::createTimeline(csb_path);
tla->gotoFrameAndPlay(startIndex, endIndex, loop);
tla->setLastFrameCallFunc(callback);
csb->runAction(tla);
addChild(csb);

如果没有tla->gotoFrameAndPlay(startIndex, endIndex, loop);这句话是不会播放动画的,此时,加载出来的csb是处在时间轴动画的最后一帧。

0%