package org.tjuscs.bulletgame.model;
import java.util.ArrayList;
import org.tjuscs.bulletgame.BulletGame;
import org.tjuscs.bulletgame.collide.CollisionCheck;
import org.tjuscs.bulletgame.collide.GeometryBase;
import org.tjuscs.bulletgame.collide.GeometryEllipse;
import org.tjuscs.bulletgame.collide.GeometryRec;
import org.tjuscs.bulletgame.model.player.PlayerReimu;
import org.tjuscs.bulletgame.task.Tasks;
import org.tjuscs.bulletgame.util.GameUtil;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.TextInputListener;
import com.badlogic.gdx.Preferences;
import com.badlogic.gdx.utils.Pool;
public class GameModel {
private static GameModel Instance = null;
private GameModel() {
}
public static GameModel getInstance() {
if (Instance == null) {
Instance = new GameModel();
}
return Instance;
}
private int screenWidth, screenHeight;
private int worldWidth, worldHeight;
private ArrayList<StageGroup> gameStage = new ArrayList<StageGroup>();
private Stage currentStage = null;
private boolean isPratice, pauseFlag, quitFlag, bossWait;
private PlayerClass player = null;
private int diffcultid, stageid;
private ArrayList<BaseObject> objList = new ArrayList<BaseObject>();
private int life = 0, power = 0, faith = 0, chip = 0, graze = 0, score = 0;
private boolean blockSpell = false, chipBonus = false;
private Background gameBG = null;
// 下面4个boolean变量每帧有相应自机操作时设为true,否则为false
private boolean keyShoot, keySpell, keySlow, keyMove;
// 当前帧自机移动的角度
private double playerMoveAngel = 0;
private Pool<Bullet> bulletPool = new Pool<Bullet>(500) {
@Override
protected Bullet newObject() {
return new Bullet();
}
};
public Pool<Bullet> getBulletPool() {
return bulletPool;
}
public void init() {
// 初始化stagegroup 及 stage
Tasks.readScript("script/loadStage.xml").act();
Item.playerInit();
startStage(0, 0);
this.player = new PlayerReimu();
getObjList().add(player.getGrazer());
getObjList().add(player);
}
public void frame() {
if(life < 0){
Gdx.input.getTextInput(new TextInputListener() {
@Override
public void input(String text) {
Preferences pref = Gdx.app.getPreferences("highscore");
pref.putInteger(text, GameModel.this.getScore());
pref.flush();
}
@Override
public void canceled() {
}
}, "大侠!请从头来过!请留下您的大名:", "玩家");
BulletGame.setCurrentScreen(BulletGame.homeScreen);
objList.clear();
return;
}
currentStage.getTask().act();
if(this.gameBG != null)
this.gameBG.frame();
for (int i = 0; i < getObjList().size(); i++) {
BaseObject obj = objList.get(i);
if (!GameUtil.IsValid(obj)) {
if (obj instanceof Bullet) {
getBulletPool().free((Bullet) obj);
}
getObjList().remove(i);
i--;
} else {
obj.frame();
}
}
for (BaseObject obj : getObjList()) {
GameUtil.Movement(obj);
}
// 碰撞检测
for (int i = 0; i < getObjList().size(); i++) {
BaseObject obj1 = getObjList().get(i);
if (!obj1.isColli())
continue;
for (int j = 0; j < getObjList().size(); j++) {
BaseObject obj2 = getObjList().get(j);
if (obj1 == obj2 || !obj2.isColli())
continue;
if ((obj1.getGroup() == GameUtil.GROUP_PLAYER && obj2
.getGroup() == GameUtil.GROUP_ENEMY_BULLET)
|| (obj1.getGroup() == GameUtil.GROUP_PLAYER && obj2
.getGroup() == GameUtil.GROUP_ENEMY)
|| (obj1.getGroup() == GameUtil.GROUP_PLAYER && obj2
.getGroup() == GameUtil.GROUP_INDES)
|| (obj1.getGroup() == GameUtil.GROUP_ENEMY && obj2
.getGroup() == GameUtil.GROUP_PLAYER_BULLET)
|| (obj1.getGroup() == GameUtil.GROUP_ITEM && obj2
.getGroup() == GameUtil.GROUP_PLAYER)) {
if (CollisionCheck.check(getGeometry(obj1),
getGeometry(obj2))) {
obj1.colli(obj2);
}
}
}
}
}
/**
* 根据{@link BaseObject}获取用于碰撞检测的几何外形对象
*
* @param obj
* @return
*/
private GeometryBase getGeometry(BaseObject obj) {
if (obj.isRect())
return new GeometryRec(obj.getX(), obj.getY(), 2 * obj.getA(),
2 * obj.getB(), obj.getRot());
else
return new GeometryEllipse(obj.getX(), obj.getY(), 2 * obj.getA(),
obj.getRot());
}
public void startStage(int diffcultid, int stageid) {
this.diffcultid = diffcultid;
this.stageid = stageid;
this.currentStage = getStageGroupbyId(diffcultid).getStagebyId(stageid);
this.life = getCurrentStage().getLife();
this.power = getCurrentStage().getPower();
this.faith = getCurrentStage().getFaith();
// TODO 开始当前关卡游戏
currentStage.getTask().reset();
}
public void addStageGroup(String sgname) {
gameStage.add(new StageGroup(sgname));
}
public void nextStage() {
this.stageid++;
if (stageid >= getStageGroupbyId(this.diffcultid).getStage_group()
.size()) {
// TODO 游戏通关
Gdx.input.getTextInput(new TextInputListener() {
@Override
public void input(String text) {
Preferences pref = Gdx.app.getPreferences("highscore");
pref.putInteger(text, GameModel.this.getScore());
pref.flush();
}
@Override
public void canceled() {
}
}, "恭喜通关!请留下您的大名:", "玩家");
BulletGame.setCurrentScreen(BulletGame.homeScreen);
objList.clear();
} else {
// TODO 开始下一关
this.currentStage = getStageGroupbyId(diffcultid).getStagebyId(stageid);
currentStage.getTask().reset();
objList.clear();
getObjList().add(player.getGrazer());
getObjList().add(player);
}
}
public void pauseGame() {
// TODO
}
public void resumeGame() {
// TODO
}
public void quitGame() {
// TODO
}
public StageGroup getStageGroupbyId(int id) {
return gameStage.get(id);
}
public int getLife() {
return life;
}
public void setLife(int life) {
this.life = life;
}
public int getPower() {
return power;
}
public void setPower(int power) {
this.power = power;
}
public int getFaith() {
return faith;
}
public void setFaith(int faith) {
this.faith = faith;
}
public int getScreenWidth() {
return screenWidth;
}
public void setScreenWidth(int screenWidth) {
this.screenWidth = screenWidth;
}
public int getScreenHeight() {
return screenHeight;
}
public void setScreenHeight(int screenHeight) {
this.screenHeight = screenHeight;
}
public int getWorldWidth() {
return worldWidth;
}
public void setWorldWidth(int worldWidth) {
this.worldWidth = worldWidth;
}
public int getWorldHeight() {
return worldHeight;
}
public void setWorldHeight(int worldHeight) {
this.worldHeight = worldHeight;
}
public ArrayList<StageGroup> getGameStage() {
return gameStage;
}
public void setGameStage(ArrayList<StageGroup> gameStage) {
this.gameStage = gameStage;
}
public Stage getCurrentStage() {
return currentStage;
}
public void setCurrentStage(Stage currentStage) {
this.currentStage = currentStage;
}
public boolean isPratice() {
return isPratice;
}
public void setPratice(boolean isPratice) {
this.isPratice = isPratice;
}
public boolean isPauseFlag() {
return pauseFlag;
}
public void setPauseFlag(boolean pauseFlag) {
this.pauseFlag = pauseFlag;
}
public boolean isQuitFlag() {
return quitFlag;
}
public void setQuitFlag(boolean quitFlag) {
this.quitFlag = quitFlag;
}
public boolean isBossWait() {
return bossWait;
}
public void setBossWait(boolean bossWait) {
this.bossWait = bossWait;
}
public PlayerClass getPlayer() {
return player;
}
public void setPlayer(PlayerClass player) {
this.player = player;
}
public int getDiffcultid() {
return diffcultid;
}
public void setDiffcultid(int diffcultid) {
this.diffcultid = diffcultid;
}
public int getStageid() {
return stageid;
}
public void setStageid(int stageid) {
this.stageid = stageid;
}
public ArrayList<BaseObject> getObjList() {
return objList;
}
public void setObjList(ArrayList<BaseObject> objList) {
this.objList = objList;
}
public Background getGameBG() {
return gameBG;
}
public void setGameBG(Background gameBG) {
this.gameBG = gameBG;
}
public int getChip() {
return chip;
}
public void setChip(int chip) {
this.chip = chip;
}
public int getGraze() {
return graze;
}
public void setGraze(int graze) {
this.graze = graze;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public boolean isBlockSpell() {
return blockSpell;
}
public void setBlockSpell(boolean blockSpell) {
this.blockSpell = blockSpell;
}
public boolean isChipBonus() {
return chipBonus;
}
public void setChipBonus(boolean chipBonus) {
this.chipBonus = chipBonus;
}
public boolean isKeyShoot() {
return keyShoot;
}
public void setKeyShoot(boolean keyShoot) {
this.keyShoot = keyShoot;
}
public boolean isKeySlow() {
return keySlow;
}
public void setKeySlow(boolean keySlow) {
this.keySlow = keySlow;
}
public boolean isKeySpell() {
return keySpell;
}
public void setKeySpell(boolean keySpell) {
this.keySpell = keySpell;
}
public boolean isKeyMove() {
return keyMove;
}
public void setKeyMove(boolean keyMove) {
this.keyMove = keyMove;
}
public double getPlayerMoveAngel() {
return playerMoveAngel;
}
public void setPlayerMoveAngel(double playerMoveAngel) {
this.playerMoveAngel = playerMoveAngel;
}
}