• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Codejie's C++ Space

            Using C++

            I;P : How to track the achievement event

            快捷鏈接

                下載地址

                相關(guān)隨筆

             

            正文

                朋友 : 這I;P的成就咋搞的?

                我 : 不是我干的, 都是Google Play Service搞定的, 要看API文檔不~

                朋友 : 知道你沒個(gè)服務(wù)器搞這個(gè), 我就想問問你怎么跟蹤成就事件的? 就是你怎么判斷成就完成了呢?

                我 : 啊, 這個(gè)啊...簡(jiǎn)單的怕你罵我...

             

                開說(shuō) ---- 我覺得呢, 每個(gè)問題都有N多的解決方案, 但基于人性考慮呢, 簡(jiǎn)單,好敲, 省力氣的, 才是好方案...

             

                成就事件跟蹤呢, 簡(jiǎn)單考慮就是實(shí)時(shí)/定時(shí)事件點(diǎn)上更新成就所需數(shù)據(jù), 并在指定的事件點(diǎn)上(也可以實(shí)時(shí))進(jìn)行檢查判斷, 以決定是否解鎖.

                因此, 我用了如下的類型存放成就所需數(shù)據(jù):

             

            		private Type(int id, int target, boolean inc, boolean global) {
            			this.id = id;
            			this.target = target;
            			this.inc = inc;
            			this.global = global;
            		}


                    id: 成就標(biāo)識(shí);

                    target: 成就目標(biāo)閾值;

                    inc: 遞增類型(用于區(qū)別大于/小于);

                    global: 全局成就類型(就是全關(guān)卡通用, 反之每次running后清零);

             

                有了上面的結(jié)構(gòu), 實(shí)例化各個(gè)成就數(shù)據(jù), 然后在running過(guò)程中的每個(gè)事件中, 比如, Tary移動(dòng), 指令調(diào)用, 執(zhí)行成功等等地方, 累計(jì)相應(yīng)的成就值就好; 當(dāng)執(zhí)行成功時(shí)(這個(gè)是I;P成就的前提條件), 檢查每一個(gè)成就實(shí)例, 哪個(gè)滿足條件了, 就解鎖哪個(gè). 很簡(jiǎn)單不是? 下面是代碼:

             

            package jie.android.ip.playservice;
            
            import java.util.HashMap;
            
            import jie.android.ip.PlayEventListener;
            import jie.android.ip.utils.Utils;
            
            public class PlayServiceTracker {
            	
            	private static final String Tag = PlayServiceTracker.class.getSimpleName();
            	
            	private static final int ID_MOVE_LEFT = 10;
            	private static final int ID_MOVE_RIGHT = 11;
            	private static final int ID_ACTION_EMPTY = 12;
            	private static final int ID_ACTION_MAX = 13;
            	private static final int ID_CALL_MAX = 14;
            	private static final int ID_CHECK_MAX = 15;
            	private static final int ID_STEP_MAX = 20;
            	private static final int ID_EXECUTE_MAX_EXCEPTIN = 30;
            	private static final int ID_EXECUTE_MAX_OVERFLOW = 31;
            	private static final int ID_EXECUTE_MAX_FINISHED = 32;
            	private static final int ID_EXECUTE_MAX_RESET = 33;
            	private static final int ID_EXECUTE_MIN_SUCC = 34;
            	private static final int ID_EVENT_NO_UNSOLVED = 40;
            	
            	public enum Type {
            		MOVE_LEFT(ID_MOVE_LEFT, 50, true, false), MOVE_RIGHT(ID_MOVE_RIGHT, 50, true, false), ACTION_EMPTY(ID_ACTION_EMPTY, 30, true, false), 
            		ACTION_MAX(ID_ACTION_MAX, 180, true, false), CALL_MAX(ID_CALL_MAX, 30, true, false), CHECK_MAX(ID_CHECK_MAX, 50, true, false),
            		STEP_MAX(ID_STEP_MAX, 200, true, false),
            		EXECUTE_MAX_EXCEPTION(ID_EXECUTE_MAX_EXCEPTIN, 10, true, true), EXECUTE_MAX_OVERFLOW(ID_EXECUTE_MAX_OVERFLOW, 10, true, true), EXECUTE_MAX_FINISHED(ID_EXECUTE_MAX_FINISHED, 10, true, true),
            		EXECUTE_MAX_RESET(ID_EXECUTE_MAX_RESET, 10, true, true), EXECUTE_MIN_SUCC(ID_EXECUTE_MIN_SUCC, 1, false, true),
            		EVENT_NO_UNSOLVED(ID_EVENT_NO_UNSOLVED, 1, true, true);
            		
            		private final int id;
            		private final int target;
            		private final boolean inc;
            		private final boolean global;
            		
            		private Type(int id, int target, boolean inc, boolean global) {
            			this.id = id;
            			this.target = target;
            			this.inc = inc;
            			this.global = global;
            		}
            		
            		public int getId() {
            			return id;
            		}
            		public int getTarget() {
            			return target;
            		}
            		
            		public boolean isInc() {
            			return inc;
            		}
            		
            		public boolean isGlobal() {
            			return global;
            		}
            	}
            	
            	public class Data {
            		public int value;
            		public int target;
            		
            		public boolean check() {
            			return value >= target;
            		}
            	}
            	
            	private HashMap<Integer, Integer> mapData = new HashMap<Integer, Integer>();
            	
            	public PlayServiceTracker() {
            		init();
            	}
            	
            	private void init() {
            		for (final Type type : Type.values()) {
            			mapData.put(type.getId(), new Integer(0));
            		}
            	}
            	
            	public void update(final Type type) {
            		mapData.put(type.getId(), mapData.get(type.getId()) + 1);
            	}
            	
            	public void refresh(boolean all) {
            		for (final Type type : Type.values()) {
            			if (all || !type.isGlobal()) {
            				mapData.put(type.getId(), new Integer(0));
            			}
            		}
            	}
            	
            	public boolean check(final Type type) {
            		final Integer val = mapData.get(type.getId());
            		if (type.isInc()) {
            			return (val >= type.getTarget());
            		} else {
            			return (val <= type.getTarget());
            		}
            	}
            
            	public void check(final PlayEventListener playEventListener) {
            		for (final Type type : Type.values()) {
            			if (check(type)) {
            				Utils.log(Tag, "PlayEvent is triggered - id = " + type.id);
            				playEventListener.unlockTrackerAchievement(type.getId());
            			}
            		}
            	}	
               }

             

                對(duì)了, 最后還好, 朋友只是鄙視了下, 沒打沒罵...

            posted on 2014-04-24 20:23 codejie 閱讀(1299) 評(píng)論(0)  編輯 收藏 引用 所屬分類: I;P

            公告

            Using C++

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲国产精品无码久久一区二区 | 久久综合88熟人妻| 色欲综合久久中文字幕网| 色综合久久综合中文综合网 | 亚洲欧洲精品成人久久奇米网| 久久久久久国产精品免费免费| 久久青青色综合| 999久久久无码国产精品| 久久se精品一区精品二区国产| 久久人做人爽一区二区三区| 人人狠狠综合久久亚洲88| 2020国产成人久久精品 | 一本色道久久88精品综合 | 久久国产亚洲精品| 久久电影网2021| 国产成年无码久久久免费| 青青青青久久精品国产| 久久久精品人妻一区二区三区蜜桃 | 9191精品国产免费久久| 久久99精品久久久大学生| 久久久久人妻一区精品| 99久久中文字幕| 久久婷婷国产综合精品| 久久强奷乱码老熟女网站| 国产精品午夜久久| 久久国产精品成人免费| 亚洲国产精品高清久久久| 中文成人无码精品久久久不卡 | 亚洲人成电影网站久久| 久久性生大片免费观看性| 国产国产成人精品久久| 久久九九精品99国产精品| 国产精品99久久久精品无码| 久久影视综合亚洲| 色悠久久久久久久综合网| 久久www免费人成精品香蕉| 国产精品免费久久久久影院| 国产午夜精品久久久久九九电影| 国产精品久久国产精麻豆99网站| 国内精品久久人妻互换| 久久精品国产一区|