• <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文檔不~

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

                我 : 啊, 這個啊...簡單的怕你罵我...

             

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

             

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

                因此, 我用了如下的類型存放成就所需數(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: 成就標識;

                    target: 成就目標閾值;

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

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

             

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

             

            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());
            			}
            		}
            	}	
               }

             

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

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

            公告

            Using C++

            導(dǎo)航

            統(tǒng)計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久人妻少妇嫩草AV蜜桃| 久久精品无码一区二区三区| 久久一本综合| 久久人人爽人人人人片av| 亚洲va久久久噜噜噜久久狠狠 | 久久影院综合精品| 日韩精品国产自在久久现线拍| 久久毛片免费看一区二区三区| 思思久久99热只有频精品66| 99久久国产综合精品麻豆| 久久婷婷五月综合成人D啪| 一本久久a久久精品亚洲| 97精品国产97久久久久久免费| 久久精品国产亚洲av麻豆蜜芽 | 久久99精品国产一区二区三区| 国产亚洲美女精品久久久| 亚洲国产精品无码久久久蜜芽| 国产亚洲色婷婷久久99精品91| 浪潮AV色综合久久天堂| 无码精品久久一区二区三区| 国产69精品久久久久777| 人妻无码精品久久亚瑟影视| 精品久久久久久久久久中文字幕| 国内精品伊人久久久久av一坑| 色狠狠久久综合网| 亚洲精品成人久久久| 久久精品国产福利国产琪琪| 精品久久香蕉国产线看观看亚洲 | 久久99国内精品自在现线| 思思久久99热只有频精品66| 精品久久久久中文字幕一区| 国产精品久久久天天影视| 久久精品国产亚洲AV无码麻豆| 久久亚洲国产精品成人AV秋霞| 亚洲精品无码久久久| 欧美国产成人久久精品| 久久露脸国产精品| 亚洲精品无码专区久久同性男| 香蕉久久影院| 久久人人爽人人爽人人片AV不| 热久久最新网站获取|