• <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

            快捷鏈接

                下載地址

                相關隨筆

             

            正文

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

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

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

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

             

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

             

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

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

             

            		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: 遞增類型(用于區別大于/小于);

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

             

                有了上面的結構, 實例化各個成就數據, 然后在running過程中的每個事件中, 比如, Tary移動, 指令調用, 執行成功等等地方, 累計相應的成就值就好; 當執行成功時(這個是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++

            導航

            統計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            99久久亚洲综合精品成人| 免费一级做a爰片久久毛片潮| 久久国产精品无| 久久久女人与动物群交毛片| 久久精品国产亚洲av麻豆小说| 国产精品一久久香蕉国产线看| 久久综合九色综合97_久久久| 国产2021久久精品| 亚洲综合熟女久久久30p| 青青青国产成人久久111网站| 久久精品国产WWW456C0M| 亚洲色大成网站www久久九| 久久精品国产免费| 伊人久久大香线蕉综合影院首页| 一本色道久久88加勒比—综合| 蜜桃麻豆www久久国产精品| 国产精品国色综合久久| 国产成人精品白浆久久69| 久久国产一片免费观看| 亚洲中文字幕久久精品无码喷水| 国产精品成人99久久久久91gav| 中文字幕乱码久久午夜| 久久精品国产色蜜蜜麻豆 | 久久婷婷激情综合色综合俺也去| www.久久99| 无码国产69精品久久久久网站| 久久久久99精品成人片三人毛片| 漂亮人妻被黑人久久精品| 色欲综合久久躁天天躁| 国产亚洲美女精品久久久| 97超级碰碰碰久久久久| 色偷偷偷久久伊人大杳蕉| 久久精品国产日本波多野结衣| 久久精品国产精品亜洲毛片| 99热成人精品免费久久| 国产呻吟久久久久久久92| 国产综合成人久久大片91| 国产一区二区三精品久久久无广告 | 亚洲精品乱码久久久久久中文字幕| 国产高潮国产高潮久久久91 | 亚洲中文久久精品无码|