📄 gameviewbase.java~10~
字号:
package GoGoGo;//import com.nokia.mid.ui.FullCanvas;import javax.microedition.lcdui.*;import javax.microedition.lcdui.Image;import javax.microedition.lcdui.Graphics;import java.util.Random;import java.util.Timer;import java.util.TimerTask;/** * <p>Title: </p> * <p>Description: </p> * <p>游戏视图类,继承自Canvas(Canvas、FullCanvas或GameCanvas)。 * 通常情况下,在游戏的整个过程中,只存在一个GameViewBase对象,它并不代表 * 某种具体的游戏页面。游戏中的各种不同的页面通过GameFrameBase的子类来体现, * 当前的游戏页面的引用记录为m_pge_CurrentPage,GameViewBase负责向当前的 * GameFrameBase提供诸如显示和按键事件捕获之类的接口。可以把它看作GameFrameBase * 和设备之间的桥梁,此外,GameViewBase还具备一些其他的功能,详细说明如下。 * </p> * <p><H3>绘图:</H3> * GameViewBase提供了一个对屏幕进行图形(或图像)绘制的功能。可以通过成员 * 变量m_g_BackGraphy和成员方法Blt()来完成一些绘制的操作。 * </p> * <p><H3>事件响应:</H3> * GameViewBase中捕获按键和手写笔等事件,但是它并不直接对其做出响应,而是 * 简单的将事件及其相关参数传递给当前的GameFrameBase。 * </p> * <p><H3>游戏循环:</H3> * GameViewBase中设定了一个游戏线程,从GameViewBase对象被setCurrent后, * 这个线程便开始游戏循环。游戏线程的每一个周期内调用一次成员方法Show()。 * </p> * <p><H3>图像资源管理:</H3> * 管理游戏中需要用到的所有图像资源。GameViewBase中设置一个Surface资源池, * 资源池中保存着当前的GameFrameBase中用到的所有Surface资源。GameFrameBase之间 * 切换时,首先释放掉前一个GameFrameBase中的所有Surface,然后加载后一页中 * 所需的图像资源。 * </p> * <p><H3>随机数:</H3> * GameViewBase中提供了一个获取指定范围内的随机整数的方法。 * </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * <p>修改记录:</p> * <p><b>Ver 1.0.0 / Date: 2004-03-30</b><br> * 1.代理信息:(Ver 1.0.0新增)<br> * static 变量 HAS_PROXY 用来标示游戏中是否需要包含发行代理商的相关信息。 * 可能涉及内容为,游戏的Splash页和帮助页。此变量的值受Jad描述中的DigitalRed-Define-1项 * 的项值决定,当项值为1时,HAS_PROXY为true;其余值或该项为空,则HAS_PROXY都为false。<br> * 2.游戏版本:(Ver 1.0.0新增)<br> * static 变量 STR_GAMEVERSION 用来标示游戏版本号。其值取Jad描述中MIDlet-Version项 * 的前三位。例如MIDlet-Version为1.2.3,则STR_GAMEVERSION为“Ver 1.0”。<br> * 3.设置初试页:(Ver 1.0.0修改)<br> * 直接调用m_pge_gameswitch.SwitchFrame(null, firstFrame)即可。 * 参考GameSwitch.SwitchFrame(GameFrameBase, GameFrameBase)。<br> * @author not attributable * @version 1.0.0 */class GameViewBase extends Canvas{ /** * 游戏周期的时间间隔,单位毫秒。 */ static final int FLIP_MSEL = 100; /** * 图像堆栈的长度。 */ static final byte MAX_STACK_NUM = 10; //抽象后的按键编码,@see getKeyAction(int) static final int KEY_SOFTKEY1 = -6; //左功能键 static final int KEY_SOFTKEY2 = -7; //右功能键 static final int KEY_FIRE = -5; //决定键,对应于数字键5和中心键。 static final int KEY_UP = -1; //上键,对应于数字键2和方向键上 static final int KEY_DOWN = -2; //下键,对应于数字键8和方向键下 static final int KEY_LEFT = -3; //左键,对应于数字键4和方向键左 static final int KEY_RIGHT = -4; //右键,对应于数字键和方向键右 /** * 主MIDlet类的引用,用于回调。 */ GameAppBase m_App; /** * 是否有代理商信息,涉及LOGO页和帮助页。 */ static boolean HAS_PROXY = false; /** * 游戏版本号,取版本号前两端。例如“1.2.1”,取其中的“1.2”. */ static String STR_GAMEVERSION = "Ver 1.0"; /** * <p>屏幕外的缓冲Image。为了避免闪屏等现象,一个游戏周期之内的所有图形图像的绘制操作 * 都首先做在这个缓冲上,待所有的绘制操作完成后,再将这个缓冲Image绘制到屏幕上。<br> * <b>注意:</b><br> * 1.这种机制的使用是为了避免闪屏,在支持Double-Buffer的设备上一般无需使用。 * 2.在支持MIDP2.0的设备上也无需使用。 * </p> */ public Image m_BackImage = null; /** * <p>GameViewBase类的绘图工具,所有的绘图操作都通过这个Graphics对象完成。<b>注意:</b><br> * 1.在使用“屏幕外缓冲”的机制时,这个Graphics对象由m_BackImage.getGraphics()方法获取。<br> * 2.不使用的情况下,这个对象指向paint(Graphics)方法的参数。<br> * 3.在MIDP2.0中,指向GameCanvas的Off-Screen Buffer。<br> * @see GameCanvas的成员方法getGraphics() * @see m_BackImage */ public Graphics m_g_BackGraphy = null; // Surface池,游戏中各Frame用到的图像资源都由GameViewBase来管理。 short m_i_CurrStackNum = 0 ; // 当前Surface池中的可用图像数 short m_i_NextSurfaceIdx = 0; // 下一个Surface对象的索引值,用于从池中获取Surface引用,参见成员方法nextSurface() Surface[] surface; // Surface池,在构造函数中new长度为MAX_STACK_NUM的surface对象数组 public GameFrameBase m_pge_CurrentPage = null; // 当前Frame的引用 //public GameFrameBase m_pge_LastPage = null; // 上一页的引用 //public byte m_i_LastPageState = 0; /** * 绘图开关,m_b_Drawing为true表示正在向屏幕上绘图,此时不允许其他绘图操作的执行。 * 在新引擎中,这个成员变量的意义已经不大。 */ boolean m_b_Drawing; /** * Timer对象,用于设定游戏周期。 */ Timer timer; //屏幕尺寸 static int m_i_ScreenHeight, m_i_ScreenWidth; //游戏中用到的Frame对象 GamePlay m_pge_gameplay = null; // 游戏主界面 GameRank m_pge_gamerank = null; // 排行榜相关界面 GamePage m_pge_gamepage = null; // Splash、主菜单和帮助等界面 GameSwitch m_pge_gameswitch = null; // 切换页 GameLogo m_pge_gamelogo = null; // splash,版权页 /** * 系统信息弹出。当有诸如电话打入之类的系统信息弹出时,hideNotify()将被调用,此时 * 标记这个布尔变量为true,以便当游戏重新返回时,在showNotify()中做出相应的处理。 */ boolean isSystemInfoRaised = false; private Random random = new Random(); /** * 获取指定范围内的随机整数。 * @param nMin 随机数范围的下限 * @param nMax 随机数范围的上限 * @return 指定范围内的一个整数 */ public int GetRandom(int nMin, int nMax) { //utility function of generating randome integer int iRet = random.nextInt(); if (iRet < 0) { iRet = -iRet; } iRet = iRet % (nMax + 1 - nMin) + nMin; return iRet; } /** * <p>构造。</p> * @param App 游戏MIDlet的引用,用于回调。 */ protected GameViewBase(GameAppBase App) { m_App = App; // 获取 DigitalRed-Define-1,该参数为1时,表示游戏中显示代理商信息,否则不显示。 try{ String _strDefine1 = m_App.getAppProperty("DigitalRed-Define-1"); if(_strDefine1.equals("1")) HAS_PROXY = true; } catch(Exception e) { HAS_PROXY = false; } // 获取游戏的版本号,该版本号将会被显示在游戏封面的右下角和游戏帮助中。 try{ String _strVersion = m_App.getAppProperty("MIDlet-Version"); if(_strVersion != null) STR_GAMEVERSION = "Ver " + _strVersion.substring(0, 3); } catch(Exception e) { STR_GAMEVERSION = "Ver 1.0"; } // 获取屏幕大小 m_i_ScreenHeight =getHeight(); m_i_ScreenWidth = getWidth(); // 初始化m_g_BackGraphy对象 /* MIDP2.0中初始化方法 m_g_BackGraphy = this.getGraphics(); //*/ /* 在不支持Double-Buffer的设备上的初始化方法 m_BackImage = Image.createImage(m_i_ScreenWidth, m_i_ScreenHeight); m_g_BackGraphy = m_BackImage.getGraphics(); //*/ m_b_Drawing = true; // 初始化Surface资源池 surface=new Surface[MAX_STACK_NUM]; for (int i = MAX_STACK_NUM - 1; i >= 0; i --) surface[i] = new Surface(); // 初始化游戏中的Frame m_pge_gameplay = new GamePlay(); m_pge_gamepage = new GamePage(); m_pge_gamerank = new GameRank(); m_pge_gameswitch = new GameSwitch(); m_pge_gamelogo = new GameLogo(); // 设置当前Frame Ver 1.0.0修改 m_pge_gameswitch.Create(this); if(HAS_PROXY) { m_pge_gamelogo.GotoSplashScreen(GameLogo.LOGOS_SPLASH_MONTERNET); } else { m_pge_gamelogo.GotoSplashScreen(GameLogo.LOGOS_SPLASH_DIGITALRED); } m_pge_gameswitch.SwitchFrame(null, m_pge_gamelogo); } /** * 释放左右的Surface资源。 */ protected void ReleaseAllSurfaces() { for(int i = surface.length - 1; i >= 0; i --) { surface[i].Release(); } m_i_CurrStackNum=0; m_i_NextSurfaceIdx = 0; } /** * 按照指定的路径为当前Surface池的顶部对象读进图像资源。 * @param path 图像资源的路径名 * @return 已经读进图像资源的Surface对象 */ protected Surface loadSurface(String path) { surface[m_i_CurrStackNum].Create(path); m_i_CurrStackNum++; return surface[m_i_CurrStackNum - 1]; } /** * <p>从Surface资源池中顺序获取Surface对象的引用。</p> * <p> * 含有Surface资源的Frame,在其所需的图像都读进Surface池后,通过 * 此方法获取资源池中的Surface引用。</p> * 需要注意的是,此方法的调用顺序。 * @return Surface对象,第一次调用时,返回Surface对象数组的第1个元素,之后依次递增。 */ protected Surface nextSurface() { if( ++ m_i_NextSurfaceIdx > m_i_CurrStackNum + 1) m_i_NextSurfaceIdx = 1; return surface[m_i_NextSurfaceIdx - 1]; } /**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -