快捷鏈接
下載地址
相關(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ì)了, 最后還好, 朋友只是鄙視了下, 沒打沒罵...