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();
}
}