www.pudn.com > MobiCraft_src.rar > MainCanvas.java


// style: tabs, tabsize=4, style=ANSI 
//+----------------------------------------------------------------------+ 
// Copyright (c) 2006 Company Name 
// Made by Andrew and Zahar 
//+----------------------------------------------------------------------+ 
// Filename: MainCanvast.java 
//+----------------------------------------------------------------------+ 
// Comment: Main GameCanvas. Draw all here. 
//+----------------------------------------------------------------------+ 
 
package app; 
 
import battle.Battle; 
import menu.*; 
import fonts.FontManager; 
import location.BuildingTypes; 
import world.Map; 
import world.LogoManager; 
import network.*; 
 
import java.io.*; 
import javax.microedition.lcdui.*; 
import javax.microedition.lcdui.game.*; 
 
public class MainCanvas extends Canvas implements Runnable//, CommandListener 
{ 
    public GameMIDlet mMIDlet; 
    private boolean bExit; 
    public Thread mThread; 
    public GameOptions mGameOptions; 
	public FontManager mFontManager; 
	public LogoManager mLogoManager; 
	public KeyHelper mKeyHelper; 
	public MyRandom mRandom; 
	public NetSender mNetSender; 
	public LocalServer mLocalServer; 
	public ProfileManager mProfileManager; 
	public Gui mGUI; 
 
    // -Modules --------------------------- 
    public Menu mMenu = null; 
    public Battle mBattle = null; 
    public Map mMap = null; 
	public MenuRoom mMenuRoom = null; 
	public MenuServerList mMenuServerList = null; 
	public MenuRoomCreate mMenuRoomCreate = null; 
	public MenuProfiles mMenuProfiles = null; 
	public MenuAbout mAboutMenu = null; 
	public MenuChat mMenuChat = null; 
	public MenuNewUser mMenuNewUser = null; 
	public MenuRoomsList mMenuRoomsList = null; 
	public MenuPlayersList mMenuPlayersList = null; 
	public Message mMessage = null; 
	 
	// ------------------------------------ 
	// Для хранения результата запуска StringInputer 
	public String mStringInputted; 
	// ------------------------------------ 
    // Tools classes 
    public Panel mPanel = null; 
    public Keys mKeys = null; 
    // ------------------------------------ 
    // Current state ( active module ) 
    public final static int STATE_MENU=			1; 
    public final static int STATE_BATTLE=		2; 
    public final static int STATE_MAP=			4; 
	public final static int STATE_MENU_SLIST=		5;	// Server List 
	public final static int STATE_MENU_CREATE=		6;	// Создание карты 
	public final static int STATE_MENU_ROOM=		7;	// Ожидаем на созданном сервере игроков. 
	public final static int STATE_MENU_ABOUT=		8; 
    public final static int STATE_MENU_PROFILES=	9; 
    public final static int STATE_MENU_CHAT=		10; 
    public final static int STATE_MENU_NEWUSER=		11; 
    public final static int STATE_MENU_ROOMS_LIST=	12; 
    public final static int STATE_MENU_PLAYERS_LIST=13; 
	public final static int STATE_OTHER=		100; 
	 
    public int iState = STATE_MENU;//STATE_BATTLE;//STATE_MENU; 
     
    public boolean bPaused; // Устанавливается в hideNotify() 
    // ------------------------------------ 
    // Time 
    public long iTimeLast; // Last absolute time. low use rate.  
    public long iTimeDelta;// Delta between current and previous frame. 
     
    // ------------------------------------ 
	public int bThreadLockRequest; 
	public boolean bThreadIsLocked; 
	 
    // ------------------------------------ 
    // Глобальный загрузчик ресурсов 
    public Loader mLoader; 
     
    public MainCanvas() 
    { 
		super(); 
		bPaused = false; 
		bThreadLockRequest = 0; 
		bThreadIsLocked = false;		 
    } 
	 
 
    public void Init(GameMIDlet MIDlet) throws IOException 
    { 
		mMIDlet = MIDlet; 
 
		setFullScreenMode(true); 
 
		mGameOptions = new GameOptions(); 
		mFontManager = new FontManager(this); 
		mFontManager.LoadFont(mFontManager.SMALL);	// Для вывода fps: 
		 
		mMenu = new Menu(this); 
		mBattle = new Battle(this); 
		mMap = new Map(this); 
		mLoader = new Loader(this.mFontManager); 
		mLoader.Init(); 
		mPanel = new Panel(mMIDlet); 
		mKeys = new Keys(this); 
		mKeys.Init(); 
		mKeyHelper = new KeyHelper(this); 
 
		mMessage = new Message(this); 
		mMessage.Init(); 
		 
		mLogoManager = new LogoManager(this); 
		mLogoManager.Init(); 
 
		mRandom = new MyRandom(); 
 
		mNetSender = new NetSender(this); 
		mLocalServer = new LocalServer(this); 
		mLocalServer.RM_Init(); 
		 
		mProfileManager = new ProfileManager(); 
		mProfileManager.Init(); 
		 
		mGUI = new Gui(this); 
		mGUI.Init(); 
		 
		iTimeLast = 0; 
	} 
     
    public void Start() 
    { 
		bExit = false; 
		mProfileManager.LoadFromRMS();		 
		mThread = new Thread(this); 
		mThread.start(); 
    } 
    public void Exit() 
    { 
		if ( !bExit ) 
		{ 
			bExit = true; 
			mProfileManager.SaveToRMS(); 
		} 
    } 
	 
	// МЕНЮ. Список серверов 
    public void ShowMenuServerList() 
    { 
		ResetTime(); 
		mMenuServerList = new MenuServerList(this); 
		mMenuServerList.Init(); 
		iState = STATE_MENU_SLIST; 
    } 
	// МЕНЮ. Список пользоваталей, для коннекта ( выбор профиля ) 
    public void ShowMenuProfiles() 
    { 
		if (mMenuServerList!= null) 
		{ 
			mMenuServerList.Destroy(); 
			mMenuServerList = null; 
		} 
		ResetTime(); 
		mMenuProfiles = new MenuProfiles(this); 
		mMenuProfiles.Init(); 
		iState = STATE_MENU_PROFILES; 
    } 
	// МЕНЮ. Форма создания нового пользователя 
    public void ShowMenuRegisterNewUser() 
	{ 
		if (mMenuServerList!= null) 
		{ 
			mMenuServerList.Destroy(); 
			mMenuServerList = null; 
		} 
		ResetTime(); 
		mMenuNewUser = new MenuNewUser(this); 
		mMenuNewUser.Init(); 
		iState = STATE_MENU_NEWUSER; 
	} 
    public void ShowMenuRoomsList() 
	{ 
		ResetTime(); 
		mMenuRoomsList = new MenuRoomsList(this); 
		mMenuRoomsList.Init(); 
		iState = STATE_MENU_ROOMS_LIST; 
	} 
	public void BackFromMenuRoomsList() 
	{ 
		ResetTime(); 
		iState = STATE_MENU_CHAT; 
		if (mMenuRoomsList!= null) 
		{ 
			mMenuRoomsList.Destroy(); 
			mMenuRoomsList = null; 
		} 
	} 
	// МЕНЮ. Список игр, к которым можно присоединиться. 
    public void ShowMenuPlayersList() 
	{ 
		ResetTime(); 
		mMenuPlayersList = new MenuPlayersList(this); 
		mMenuPlayersList.Init(); 
		iState = STATE_MENU_PLAYERS_LIST; 
	} 
	public void BackFromMenuPlayersList() 
	{ 
		ResetTime(); 
		iState = STATE_MENU_CHAT; 
		if (mMenuPlayersList!= null) 
		{ 
			mMenuPlayersList.Destroy(); 
			mMenuPlayersList = null; 
		} 
	} 
	public void BackFromMenuRoomCreate() 
    { 
		ResetTime(); 
		if (mMenuRoomCreate!= null) 
		{ 
			mMenuRoomCreate.Destroy(); 
			mMenuRoomCreate = null; 
		}	 
		if ( mNetSender.iProto == NetSender.PROTO_LOCAL ) 
			iState = STATE_MENU; 
		else 
		if ( mNetSender.iProto == NetSender.PROTO_HTTP ) 
			iState = STATE_MENU_CHAT; 
	 
	} 
    public void BackFromMenuRoom() 
    { 
		ResetTime(); 
		mNetSender.RM_Disconnect(); 
		if (mMenuRoom!= null) 
		{ 
			mMenuRoom.Destroy(); 
			mMenuRoom = null; 
		}	 
		if ( mNetSender.iProto == NetSender.PROTO_LOCAL ) 
			iState = STATE_MENU_CREATE; 
		else 
		if ( mNetSender.iProto == NetSender.PROTO_HTTP ) 
			iState = STATE_MENU_CHAT; 
	} 
	// МЕНЮ. В состоянии чата. 
    public void ShowMenuChat() 
    { 
		if (mMenuProfiles!= null) 
		{ 
			mMenuProfiles.Destroy(); 
			mMenuProfiles = null; 
		} 
		ResetTime(); 
		mMenuChat = new MenuChat(this); 
		mMenuChat.Init(); 
 
		iState = STATE_MENU_CHAT; 
    } 
	// МЕНЮ. Состояние в котором ждут игроков, устанавливают расы и т.п. 
	public void ShowMenuRoom() 
    { 
		/* 
		// Пока не уничтожать. 
		// TODO: надо будет при запуске игры удалять mMenuRoomCreate  
		if (mMenuRoomCreate!= null) 
		{ 
			mMenuRoomCreate.Destroy(); 
			mMenuRoomCreate = null; 
		}*/ 
		if (mMenuRoomsList!= null) 
		{ 
			mMenuRoomsList.Destroy(); 
			mMenuRoomsList = null; 
		} 
		ResetTime(); 
		mMenuRoom = new MenuRoom(this); 
		//mMenuRoom.Init(); 
		iState = STATE_MENU_ROOM; 
    }  
	// МЕНЮ. Создание игры. Выбор карты и настроек 
    public void ShowGameCreateMenu() 
    { 
		ResetTime(); 
		mMenuRoomCreate = new MenuRoomCreate(this); 
		mMenuRoomCreate.Init(); 
		iState = STATE_MENU_CREATE; 
    } 
	// Если кикнули во время нахождения в комнате. 
	public void KickedFromRoom() 
	{ 
		ResetTime(); 
		if (mMenuRoom!= null) 
		{ 
			mMenuRoom.Destroy(); 
			mMenuRoom = null; 
		}	 
		iState = STATE_MENU_CHAT; 
		mGUI.SetMessage("We are sorry but", "You were kicked!"); 
	} 
	public void ShowAboutMenu() 
    { 
		if (mMenu!= null) 
			mMenu.Destroy(); 
		ResetTime(); 
		mAboutMenu = new MenuAbout(this); 
		mAboutMenu.Init(); 
		iState = STATE_MENU_ABOUT; 
    } 
	 
    public void paint(Graphics g) 
    { 
		if (iTimeLast==0) 
			return; // Ещё поток не запустился. 
 
		// Если нас попросили затормозиться и ничего не делать. 
		if ( bThreadLockRequest>0 && !bThreadIsLocked) 
		{ 
			bThreadIsLocked = true; 
		} 
 
		while (bThreadIsLocked) 
		{ 
//				Thread.currentThread().yield(); // Когда нам дадут "зеленый" bThreadIsLocked==false - пойдем дельше. 
			/*try 
			{ 
				Thread.currentThread().sleep(10);// Когда нам дадут "зеленый" bThreadIsLocked==false - пойдем дельше. 
			} 
			catch(InterruptedException e){}*/ 
			return; 
		} 
			 
		// Если в паузе - выводить надпись и выходить. 
		if ( bPaused ) 
		{ 
			g.setColor(0x000000); 
			g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight()); 
			 
			String s1 = "&n-= MobiCraft =-"; 
			String s2 = "&nThe game is paused"; 
			String s3 = "&nPress any key to continue"; 
			mFontManager.Print(mFontManager.SMALL, g, s1, getWidth()/2 - s1.length()*6/2,  getHeight()/2-20 ); 
			mFontManager.Print(mFontManager.SMALL, g, s2, getWidth()/2 - s2.length()*6/2,  getHeight()/2 ); 
			mFontManager.Print(mFontManager.SMALL, g, s3, getWidth()/2 - s3.length()*6/2,  getHeight()/2+20 ); 
			return; 
		} 
		long current_time = System.currentTimeMillis(); 
		iTimeDelta = current_time-iTimeLast; 
		iTimeLast=current_time; 
		 
		if (mGUI.bMessageShow) 
		{ 
			mGUI.CheckKeys(); 
			mKeys.UpdateTimes(iTimeDelta); 
			mKeys.KeysWereShown(); 
		} 
		switch ( iState ) 
		{ 
			case STATE_MENU: 
			if ( mMenu != null ) 
				mMenu.paint(g, iTimeDelta); 
			break; 
			case STATE_BATTLE: 
			if ( mBattle != null ) 
				mBattle.paint(g, iTimeDelta); 
			break; 
			case STATE_MAP: 
			if ( mMap != null ) 
				mMap.paint(g, iTimeDelta); 
			break; 
			case STATE_MENU_SLIST: 
			if ( mMenuServerList != null ) 
				mMenuServerList.paint(g, iTimeDelta); 
			break; 
			case STATE_MENU_PROFILES: 
			if ( mMenuProfiles != null ) 
				mMenuProfiles.paint(g, iTimeDelta); 
			break; 
			case STATE_MENU_NEWUSER: 
			if ( mMenuNewUser != null ) 
				mMenuNewUser.paint(g, iTimeDelta); 
			break; 
			case STATE_MENU_CHAT: 
			if ( mMenuChat != null ) 
				mMenuChat.paint(g, iTimeDelta); 
			break;		 
			case STATE_MENU_ROOM: 
			if ( mMenuRoom != null ) 
				mMenuRoom.paint(g, iTimeDelta); 
			break; 
			case STATE_MENU_CREATE: 
			if ( mMenuRoomCreate != null ) 
				mMenuRoomCreate.paint(g, iTimeDelta); 
			break; 
			case STATE_MENU_ABOUT: 
			if ( mAboutMenu != null ) 
				mAboutMenu.paint(g, iTimeDelta); 
			break; 
			case STATE_MENU_ROOMS_LIST: 
			if ( mMenuRoomsList != null ) 
				mMenuRoomsList.paint(g, iTimeDelta); 
			break;		 
			case STATE_MENU_PLAYERS_LIST: 
			if ( mMenuPlayersList != null ) 
				mMenuPlayersList.paint(g, iTimeDelta); 
			break;			 
			default: 
				// ignore 
			break; 
		} 
		if (!mGUI.bMessageShow) 
		{ 
			mKeys.UpdateTimes(iTimeDelta); 
			mKeys.KeysWereShown(); 
		} 
		mMessage.Update(iTimeDelta); 
		mMessage.Draw(g); 
 
		if (mGameOptions.bShowDebugGUI) 
		{ 
			Runtime.getRuntime().gc(); 
			String s = "&n"+(Runtime.getRuntime()).freeMemory(); 
			mFontManager.Print(mFontManager.SMALL, g, s, getWidth()-FontManager.GetStringLength(s)*6, 1); 
			// Вывод FPS 
			if (iTimeDelta >0) 
				mFontManager.Print(mFontManager.SMALL, g, "&nFPS: "+(1000/iTimeDelta), 0, 1); 
		} 
		if (mGUI.bMessageShow) 
		{ 
			mGUI.DrawMessage(g); 
		} 
	} 
     
    public void ResetTime() 
    { 
		iTimeLast = System.currentTimeMillis(); 
    } 
     
    public void run() 
    { 
		iTimeLast = System.currentTimeMillis(); 
		while (!bExit) 
		{ 
			while (bThreadIsLocked) 
			{ 
				; 
			} 
			try 
			{ 
				repaint(); 
				//serviceRepaints(); 
				//Thread.currentThread().yield(); 
				 Thread.sleep(30); 
			} 
			catch (Throwable e) 
			{ 
				mMIDlet.mErrorReporter.ShowError("MainCanvas.run()", e.toString()); 
			} 
		} 
		DestoyApp();	 
    } 
    
    protected void keyPressed(int code) 
    { 
		// Если в паузе - То выйти из нее 
		if ( bPaused ) 
		{ 
			bPaused = false; 
			return;	     
		} 
		else 
			mKeys.keyPressed(code); 
    } 
    protected void keyReleased(int code)  
    { 
		mKeys.keyReleased(code); 
    } 
    
    public void showNotify() 
    { 
		bPaused = false; 
    } 
    public void hideNotify() 
    { 
		bPaused = true; 
    } 
    public void DestoyApp() 
    { 
		Display.getDisplay(mMIDlet).setCurrent((Displayable)null); 
		mMIDlet.destroyApp(true); 
		mMIDlet.notifyDestroyed(); 
    } 
}