package com.znv.linkup;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.res.XmlResourceParser;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseArray;
import android.view.Window;
import android.view.WindowManager;
import com.znv.linkup.core.config.GameCfg;
import com.znv.linkup.core.config.GlobalCfg;
import com.znv.linkup.core.config.LevelCfg;
import com.znv.linkup.core.config.ModeCfg;
import com.znv.linkup.core.config.RankCfg;
import com.znv.linkup.core.util.ImageUtil;
import com.znv.linkup.db.DbScore;
import com.znv.linkup.db.LevelScore;
import com.znv.linkup.rest.UserInfo;
import com.znv.linkup.sound.MusicManager;
import com.znv.linkup.sound.SoundManager;
import com.znv.linkup.util.CacheUtil;
import com.znv.linkup.util.ShortcutUtil;
import com.znv.linkup.util.Stopwatch;
import com.znv.linkup.view.indicator.RankAdapter;
/**
* 游戏Activity的基类
*
* @author yzb
*
*/
public class BaseActivity extends Activity {
// 游戏背景音乐
public static MusicManager musicMgr = null;
// 游戏音效
public static SoundManager soundMgr = null;
// 游戏关卡配置
public static List<ModeCfg> modeCfgs = null;
// 游戏配置Map
public static SparseArray<LevelCfg> levelCfgs = null;
// 第三方登录用户信息
public static UserInfo userInfo = null;
// rankAdapter缓存
public static RankAdapter[] rankAdapters = null;
// 根据游戏皮肤缓存图片,不用每次加载
public static List<List<Bitmap>> skinImages = new ArrayList<List<Bitmap>>(ViewSettings.SkinNames.length);
// 缓存特定比例的卡片
public static Map<String, List<Bitmap>> scaleImages = new HashMap<String, List<Bitmap>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initFullScreen();
initShortcut();
initMusic();
initSound();
}
/**
* 全屏初始化
*/
private void initFullScreen() {
// set full screen
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
/**
* 初始化快捷键
*/
private void initShortcut() {
if (!CacheUtil.hasBind(this, "short_cut")) {
ShortcutUtil util = new ShortcutUtil(this);
util.delShortcut();
util.addShortcut();
CacheUtil.setBind(this, "short_cut", true);
}
}
/**
* 初始化游戏音乐
*/
private void initMusic() {
if (musicMgr == null) {
musicMgr = new MusicManager(this);
}
playMusic();
}
/**
* 播放背景音乐
*/
protected void playMusic() {
if (musicMgr != null) {
musicMgr.play();
}
}
/**
* 停止播放背景音乐
*/
protected void stopMusic() {
if (musicMgr != null) {
musicMgr.stop();
}
}
/**
* 初始化游戏音效
*/
private void initSound() {
if (soundMgr == null) {
soundMgr = new SoundManager(BaseActivity.this);
}
}
/**
* 加载关卡配置
*/
protected void loadCfgs() {
if (modeCfgs == null) {
Stopwatch sw = new Stopwatch();
sw.start();
XmlResourceParser xrp = getResources().getXml(R.xml.gamecfg);
GameCfg gameCfg = new GameCfg(xrp);
modeCfgs = gameCfg.getModeInfos();
levelCfgs = new SparseArray<LevelCfg>();
for (ModeCfg modeCfg : modeCfgs) {
for (RankCfg rankCfg : modeCfg.getRankInfos()) {
for (LevelCfg levelCfg : rankCfg.getLevelInfos()) {
levelCfgs.append(levelCfg.getLevelId(), levelCfg);
}
}
}
sw.stop();
Log.e("loadXmlCfgs-time", String.valueOf(sw.getElapsedTime()));
}
// 加载全局配置
loadGlobalCfg();
// 加载本地关卡分数
loadLevelScores();
}
/**
* 加载全局配置
*/
private void loadGlobalCfg() {
String globalCfgStr = getGlobalCfg();
if (globalCfgStr.equals("")) {
setGlobalCfg();
} else {
LevelCfg.globalCfg = GlobalCfg.parse(globalCfgStr);
}
}
/**
* 加载本地关卡分数
*/
private void loadLevelScores() {
// 初始化数据库
DbScore.init(this, modeCfgs);
List<LevelScore> levelScores = DbScore.selectAll();
for (LevelScore score : levelScores) {
int levelId = Integer.parseInt(score.getLevel());
LevelCfg cfg = levelCfgs.get(levelId);
if (cfg != null) {
cfg.setMaxScore(score.getMaxScore());
cfg.setMinTime(score.getMinTime());
cfg.setActive(score.getIsActive() == 1);
cfg.setLevelStar(score.getStar());
cfg.setUpload(score.getIsUpload() == 1);
}
}
}
/**
* 加载rankAdapter
*/
protected void loadRankAdapters() {
rankAdapters = new RankAdapter[modeCfgs.size()];
for (int i = 0; i < modeCfgs.size(); i++) {
rankAdapters[i] = new RankAdapter(this, modeCfgs.get(i).getRankInfos());
}
}
/**
* 加载游戏皮肤
*/
protected void loadSkinImages() {
InputStream is = null;
for (String skinName : ViewSettings.SkinNames) {
String imageFile = String.format("%ss.dat", skinName);
try {
is = getResources().getAssets().open(imageFile);
Bitmap bm = BitmapFactory.decodeStream(is);
List<Bitmap> images = ImageUtil.cutImage(bm, ViewSettings.ImageXCount, ViewSettings.ImageYCount);
if (images != null) {
// 加入缓存
skinImages.add(images);
}
} catch (Exception e) {
Log.d("loadSkinImages", e.getMessage());
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 获取全局配置字符串
*
* @return 全局配置字符串
*/
protected String getGlobalCfg() {
return CacheUtil.getBindStr(getApplicationContext(), ViewSettings.GlobalCfgStr);
}
/**
* 设置全局配置
*/
public void setGlobalCfg() {
CacheUtil.setBindStr(getApplicationContext(), ViewSettings.GlobalCfgStr, LevelCfg.globalCfg.toString());
}
@Override
protected void onPause() {
super.onPause();
// 停止背景音乐
stopMusic();
}
@Override
protected void onResume() {
super.onResume();
// 开启背景音乐
playMusic();
}
}