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

            公告

            Using C++

            導航

            統計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久久无码精品午夜| 亚洲欧美日韩中文久久 | 精品久久久久久亚洲精品| 亚洲精品国产美女久久久| 国内精品久久久久影院优| 中文字幕久久欲求不满| 久久精品综合网| 九九久久99综合一区二区| 伊人久久大香线蕉综合5g| 久久超乳爆乳中文字幕| 欧美午夜A∨大片久久 | 伊人久久大香线蕉精品不卡 | 久久久久亚洲AV成人网人人网站| 久久频这里精品99香蕉久| 国产精品久久久久久久久免费| 亚洲人成无码久久电影网站| 91久久精品视频| 久久精品国产亚洲av日韩| 99久久做夜夜爱天天做精品| 国产亚洲精午夜久久久久久 | 日韩亚洲欧美久久久www综合网| 人人妻久久人人澡人人爽人人精品| 久久精品人人做人人爽电影| 欧美精品久久久久久久自慰| 亚洲人成无码www久久久| 久久精品亚洲乱码伦伦中文 | 久久精品国产亚洲7777| 精品人妻久久久久久888| 伊人久久大香线蕉亚洲| 国内精品伊人久久久影院| 少妇被又大又粗又爽毛片久久黑人| 免费观看久久精彩视频| 久久精品国产亚洲网站| 国产婷婷成人久久Av免费高清| 新狼窝色AV性久久久久久| 久久天天躁夜夜躁狠狠躁2022| 亚洲国产成人久久综合野外| 久久人人爽人人爽人人片AV麻豆| 丁香久久婷婷国产午夜视频| 9999国产精品欧美久久久久久 | 亚洲国产精品成人久久蜜臀|