• <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 閱讀(1307) 評論(0)  編輯 收藏 引用 所屬分類: I;P

            公告

            Using C++

            導航

            統計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久青青草原亚洲av无码app| 亚州日韩精品专区久久久| 亚洲中文字幕无码久久精品1 | 国产美女久久精品香蕉69| 久久99精品国产一区二区三区| 国产2021久久精品| 久久久久av无码免费网| 久久精品国产91久久综合麻豆自制| 久久国产欧美日韩精品| 精品免费久久久久久久| 久久精品国产精品国产精品污| 99久久精品国产一区二区蜜芽| 久久精品成人免费看| 亚洲国产成人精品女人久久久 | 91麻豆国产精品91久久久| 久久久久久久综合狠狠综合| 亚洲国产精品18久久久久久| 7国产欧美日韩综合天堂中文久久久久 | 精品久久亚洲中文无码| 久久狠狠高潮亚洲精品| 办公室久久精品| 婷婷国产天堂久久综合五月| 热re99久久精品国99热| 热RE99久久精品国产66热| 久久精品无码一区二区无码| 久久久久亚洲AV成人网人人网站| 久久九九兔免费精品6| 久久综合久久综合久久| 国产成人精品久久亚洲| 久久综合给合久久狠狠狠97色69| 精品免费久久久久国产一区| 久久精品国产亚洲av麻豆小说| 91精品国产高清91久久久久久| 日本三级久久网| 久久人人爽人人爽人人片av高请| 久久精品国产精品亚洲艾草网美妙| 无码久久精品国产亚洲Av影片| 久久久精品久久久久影院| 精品国产婷婷久久久| 国产欧美久久一区二区| 精品少妇人妻av无码久久|