package org.tjuscs.bulletgame.view; import java.util.Calendar; import java.util.Date; import org.tjuscs.bulletgame.model.BaseObject; import org.tjuscs.bulletgame.model.GameModel; import org.tjuscs.bulletgame.task.Task; import org.tjuscs.bulletgame.task.Tasks; import org.tjuscs.bulletgame.util.MathUtils; import org.tjuscs.bulletgame.view.component.AudioPlayer; import org.tjuscs.bulletgame.view.component.Renderer; import org.tjuscs.bulletgame.view.component.Resources; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.InputMultiplexer; import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.g2d.BitmapFont.TextBounds; import com.badlogic.gdx.input.GestureDetector; import com.badlogic.gdx.input.GestureDetector.GestureListener; import com.badlogic.gdx.math.Vector2; public class GameScreen implements Screen { GameModel model; Renderer render; Resources res; AudioPlayer audio; long frameCount = 0; public GameScreen() { render = Renderer.getInstance(); res = Resources.getInstance(); audio = AudioPlayer.getInstance(); model = GameModel.getInstance(); int w = Gdx.graphics.getWidth(), h = Gdx.graphics.getHeight(); model.setWorldWidth(w); model.setWorldHeight(h); model.setScreenWidth(w); model.setScreenHeight(h); } @Override public void render(float delta) { // System.out.println("Rendering[" + frameCount + "]\tFPS=" // + Gdx.graphics.getFramesPerSecond()); Gdx.graphics.setTitle("BulletGame [FPS:"+Gdx.graphics.getFramesPerSecond()+"][Objects:"+model.getObjList().size()+"]"); frameCount++; model.frame(); render.startRender(); render.RenderClear(0, 0, 0, 1); if(model.getGameBG()!=null) model.getGameBG().render(); // Collections.sort(model.getObjList(),new Comparator<BaseObject>() { // @Override // public int compare(BaseObject o1, BaseObject o2) { // if(o1.getLayer() > o2.getLayer()) // return 1; // else if(o1.getLayer() < o2.getLayer()) // return -1; // else // return 0; // } // }); for (BaseObject obj : model.getObjList()) { if (obj.isHide()) continue; obj.render(); } renderText(); render.endRender(); } private void renderText() { render.RenderText("yahei", "Power:"+model.getPower()+ " Score:"+model.getScore() ,0, Gdx.graphics.getHeight()); String rightTxt = "Life:"+model.getLife(); TextBounds bounds = render.getTextBounds("yahei", rightTxt); render.RenderText("yahei", rightTxt,(int) (Gdx.graphics.getWidth()-bounds.width), Gdx.graphics.getHeight()); String stageName = model.getCurrentStage().getTitle(); bounds = render.getTextBounds("yahei", stageName); render.RenderText("yahei", stageName,0,30); } @Override public void resize(int width, int height) { } @Override public void show() { Task task = Tasks.readScript("script/loadRes.xml"); task.setBinding("res", Resources.getInstance()); task.act(); Gdx.input.setInputProcessor(new InputMultiplexer(new InputProc(), new GestureDetector(new GestureHandler()))); model.init(); } @Override public void hide() { //res.Clear(); //audio.StopMusic("TH128_02"); } @Override public void pause() { } @Override public void resume() { } @Override public void dispose() { } public class InputProc implements InputProcessor { // private int dragx = 0,dragy = 0; boolean up, down, left, right; @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { model.setKeyMove(false); model.setKeyShoot(false); model.setKeySpell(false); return true; } @Override public boolean touchDragged(int screenX, int screenY, int pointer) { int dx = (int) (screenX - model.getPlayer().getX()); int dy = (int) (Gdx.graphics.getHeight() - screenY - model .getPlayer().getY()); if (dx == 0 && dy == 0) { model.setKeyMove(false); return true; } else { model.setKeyMove(true); } double angle; if (dx == 0) angle = dy > 0 ? 90 : 270; else if (dy == 0) angle = dx > 0 ? 0 : 180; else { angle = Math.atan(dy / dx) / MathUtils.degRad; if (dx < 0) angle += 180; } // System.out.println("dx="+dx+",dy="+dy+",angle="+angle); model.setPlayerMoveAngel(angle); // model.getPlayer().setX(screenX); // model.getPlayer().setY(Gdx.graphics.getHeight() - screenY); return true; } private long lastTime = 0; private Calendar cal = Calendar.getInstance(); @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { // dragx = screenX; // dragy = screenY; // return true; if(button == Input.Buttons.LEFT){ cal.setTime(new Date()); long current = cal.getTimeInMillis(); if(current-lastTime <= 500){ model.setKeySpell(true); } lastTime = current; model.setKeyShoot(true); } else if(button == Input.Buttons.RIGHT) model.setKeySpell(true); return false; } @Override public boolean scrolled(int amount) { return false; } @Override public boolean mouseMoved(int screenX, int screenY) { return false; } @Override public boolean keyUp(int keycode) { switch (keycode) { case Input.Keys.UP: up = false; break; case Input.Keys.DOWN: down = false; break; case Input.Keys.LEFT: left = false; break; case Input.Keys.RIGHT: right = false; break; case Input.Keys.Z: model.setKeyShoot(false); break; case Input.Keys.X: model.setKeySpell(false); break; case Input.Keys.SHIFT_LEFT: model.setKeySlow(false); break; default: break; } updateDirection(); return true; } @Override public boolean keyTyped(char character) { return false; } @Override public boolean keyDown(int keycode) { switch (keycode) { case Input.Keys.UP: up = true; down = false; break; case Input.Keys.DOWN: down = true; up = false; break; case Input.Keys.LEFT: left = true; right = false; break; case Input.Keys.RIGHT: right = true; left = false; break; case Input.Keys.Z: model.setKeyShoot(true); break; case Input.Keys.X: model.setKeySpell(true); break; case Input.Keys.SHIFT_LEFT: model.setKeySlow(true); break; default: break; } updateDirection(); return true; } private void updateDirection() { model.setKeyMove(true); if (up) { if (left) model.setPlayerMoveAngel(135); else if (right) model.setPlayerMoveAngel(45); else model.setPlayerMoveAngel(90); } else if (down) { if (left) model.setPlayerMoveAngel(225); else if (right) model.setPlayerMoveAngel(315); else model.setPlayerMoveAngel(270); } else { if (left) model.setPlayerMoveAngel(180); else if (right) model.setPlayerMoveAngel(0); else model.setKeyMove(false); } } } public class GestureHandler implements GestureListener { @Override public boolean zoom(float initialDistance, float distance) { return false; } @Override public boolean touchDown(float x, float y, int pointer, int button) { return false; } @Override public boolean tap(float x, float y, int count, int button) { return false; } @Override public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2, Vector2 pointer1, Vector2 pointer2) { return false; } @Override public boolean pan(float x, float y, float deltaX, float deltaY) { return false; } @Override public boolean longPress(float x, float y) { return false; } @Override public boolean fling(float velocityX, float velocityY, int button) { return false; } } }