⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameviewbase.java

📁 J2ME游戏引擎,直接在JBUILDER2006下运行,不包含需要的SDK和虚拟机
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 =20;    //抽象后的按键编码,@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 + -