package com.google.gwt.maeglin89273.game.mengine.core;
import com.google.gwt.canvas.client.Canvas;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ContextMenuEvent;
import com.google.gwt.event.dom.client.ContextMenuHandler;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseWheelEvent;
import com.google.gwt.event.dom.client.MouseWheelHandler;
import com.google.gwt.event.dom.client.MouseMoveHandler;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.maeglin89273.game.mengine.game.Game;
import com.google.gwt.maeglin89273.game.mengine.game.GameInfo;
import com.google.gwt.maeglin89273.game.mengine.game.GeneralGame;
import com.google.gwt.maeglin89273.game.mengine.layer.Camera;
import com.google.gwt.maeglin89273.game.mengine.physics.CoordinateConverter;
import com.google.gwt.maeglin89273.game.mengine.physics.Point;
import com.google.gwt.storage.client.Storage;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
/**
* @author Maeglin Liao
*
*/
public class MEngine{
private static Canvas canvas;
private static Storage storage;
private static GameInfo gameInfo;
private static GeneralGame game;
private static GameExecutor gameExecutor;
private static AssetManager assetManager;
private static MousePosition mousePosition;
private static HandlersManager handlersManager;
private static Cipher cipher;
public static void init(Game game,String assetsPrefix){
if(!(Canvas.isSupported()&&Storage.isLocalStorageSupported())){
RootPanel.get().add(new Anchor("Sorry,your browser doesn't support HTML5.Go get Chrome!",
"http://chrome.google.com"));
return;
}
canvas=Canvas.createIfSupported();
storage=Storage.getLocalStorageIfSupported();
gameInfo=game.getGameInfo();
gameExecutor=new GameExecutor(game,canvas);
assetManager=new AssetManager(assetsPrefix);
mousePosition=new MousePosition(canvas);
handlersManager=new HandlersManager(canvas);
cipher=new Cipher();
assetManager.loadAssetsBundle(gameInfo.getAssetsBundle());
Camera.setCameraSize(gameInfo.getWidth(), gameInfo.getHeight());
CoordinateConverter.init(gameInfo.getWidth(), gameInfo.getHeight());
setupCanvas();
game.init();
}
public static void init(GeneralGame game,String assetsPrefix){
MEngine.game=game;
MEngine.init((Game)game, assetsPrefix);
}
public static GeneralGame getGeneralGame(){
return game;
}
public static void setRedrawAlpha(float alpha){
try{
gameExecutor.setRedrawAlpha(alpha);
}catch(NullPointerException e){
throwsUninitException();
}
}
private static void setupCanvas(){
canvas.setPixelSize(gameInfo.getWidth(),gameInfo.getHeight());
canvas.setCoordinateSpaceWidth(gameInfo.getWidth());
canvas.setCoordinateSpaceHeight(gameInfo.getHeight());
canvas.addStyleName("canvas");
canvas.addMouseMoveHandler(mousePosition);//do not use handlersManager to add MouseMoveEventHandler,because the deliverer may remove it.
canvas.addDomHandler(new ContextMenuHandler(){
@Override
public void onContextMenu(ContextMenuEvent event) {
event.preventDefault();
event.stopPropagation();
}
}, ContextMenuEvent.getType());
canvas.addMouseWheelHandler(new MouseWheelHandler(){
@Override
public void onMouseWheel(MouseWheelEvent event) {
event.preventDefault();
event.stopPropagation();
}
});
hideDraggingCursor(canvas.getCanvasElement());
VerticalPanel vp=new VerticalPanel();
vp.addStyleName("center");
vp.add(canvas);
RootPanel.get("content").add(vp);
Window.scrollTo(canvas.getAbsoluteLeft()+(canvas.getOffsetWidth()-Window.getClientWidth())/2,
canvas.getAbsoluteTop()+(canvas.getOffsetHeight()-Window.getClientHeight())/2);
}
public static void start(){
try{
gameExecutor.start();
}catch(NullPointerException e){
throwsUninitException();
}
}
public static boolean isPause(){
try{
return gameExecutor.isPause();
}catch(NullPointerException e){
throwsUninitException();
return true;
}
}
public static void pause(){
try{
gameExecutor.pause();
}catch(NullPointerException e){
throwsUninitException();
}
}
public static void play(){
try{
gameExecutor.play();
}catch(NullPointerException e){
throwsUninitException();
}
}
public static AssetManager getAssetManager(){
return assetManager;
}
public static GameExecutor getGameExecutor(){
return gameExecutor;
}
public static HandlersManager getHandlersManager(){
return handlersManager;
}
public static Point getMousePosition(){
try{
return mousePosition.getPosition();
}catch(NullPointerException e){
throwsUninitException();
return null;
}
}
public static Storage getLocalStorage(){
return storage;
}
public static Cipher getCipher(){
return cipher;
}
public static void addKeyDownHandler(KeyDownHandler h){
try{
handlersManager.addKeyDownHandler(h);
}catch(NullPointerException e){
throwsUninitException();
}
}
public static void addKeyUpHandler(KeyUpHandler h){
try{
handlersManager.addKeyUpHandler(h);
}catch(NullPointerException e){
throwsUninitException();
}
}
public static void addMouseMoveHandler(MouseMoveHandler h){
try{
handlersManager.addMouseMoveHandler(h);
}catch(NullPointerException e){
throwsUninitException();
}
}
public static void addMouseDownHandler(MouseDownHandler h){
try{
handlersManager.addMouseDownHandler(h);
}catch(NullPointerException e){
throwsUninitException();
}
}
public static void addMouseUpHandler(MouseUpHandler h){
try{
handlersManager.addMouseUpHandler(h);
}catch(NullPointerException e){
throwsUninitException();
}
}
public static void addMouseWheelHandler(MouseWheelHandler h){
try{
handlersManager.addMouseWheelHandler(h);
}catch(NullPointerException e){
throwsUninitException();
}
}
public static void addKeyPressHandler(KeyPressHandler h){
try{
handlersManager.addKeyPressHandler(h);
}catch(NullPointerException e){
throwsUninitException();
}
}
public static void addClickHandler(ClickHandler h){
try{
handlersManager.addClickHandler(h);
}catch(NullPointerException e){
throwsUninitException();
}
}
public static void addMouseOutHandler(MouseOutHandler h){
try{
handlersManager.addMouseOutHandler(h);
}catch(NullPointerException e){
throwsUninitException();
}
}
public static Canvas getCanvas(){
return canvas;
}
private static void throwsUninitException(){
throw new IllegalStateException("The MEngine hasn't been initialized.Please call the init method to initialize it.");
}
private static native void hideDraggingCursor(Element e) /*-{
e.onselectstart = function() {
return false;
};
e = null;
}-*/;
}