📄 gameviewbase.java~8~
字号:
* <p>通过索引值获取Surface资源池中的Surface引用。</p> * @param iSurfaceIdx 所要获取的引用在池中的索引值。 * @return 如果iSurfaceIdx有效,则返回相应的引用;反之,返回NULL。 */ protected Surface getSurface(int iSurfaceIdx) { if (iSurfaceIdx < 0 || iSurfaceIdx >= MAX_STACK_NUM) { return null; } return surface[iSurfaceIdx]; } /** * <p>此方法将在每次Canvas被显示在Display上之前调用。一般分为2种情况:<br> * 1.Canvas被Display对象setCurrent;<br> * 2.系统信息弹出,操作结束后游戏重新返回返回。在这种情况下通常要判断游戏 * 被系统挂起之前的状态,如有需要则把游戏置为暂停状态。</p> * <p><b>特殊情况:</b><br> * 在某些手机上showNotify()不会被正常调用。例如A768上不会被调用; * 而对于Nokia S60,某些情况下可能会被连续调用2次。请开发人员注意! */ protected void showNotify() { m_b_Drawing = false; if (isSystemInfoRaised) { // 判断是否要把游戏置为暂停状态 /* if(m_pge_CurrentPage.equals(m_pge_gameplay)) { // 添加代码判断游戏是否应该被置为暂停状态 } //*/ isSystemInfoRaised = false; StartFlip(); //setFullScreenMode(true); } } /** * <p>此方法将在每次Canvas被从Display上移除之前调用,当系统对话框 * 弹出时也会被调用。</p> * <p><b>特殊情况:</b><br> * 和showNotify()一样,此方法在某些手机上也不会被正常调用,请开发人员注意! */ protected void hideNotify() { //m_pge_LastPage = m_pge_CurrentPage; //m_i_LastPageState = m_pge_CurrentPage.m_i_FrameState; isSystemInfoRaised = true; StopFlip(); } /** * <p>实现Canvas的绘制方法。</p> * <p>对于不同的设备,具体的实现方法有一定的差异:<br> * 1.对于采用了“屏幕外缓冲”机制的设备,直接将m_BackImage绘制在屏幕上;<br> * 2.对于有Double-Buffer支持的设备,将此方法的Grahics参数赋给m_g_BackGraphy, * 然后进行绘图操作;<br> * 3.对于MIDP2.0的设备,此方法无需实现。 * @param g 用来绘制Canvas的Grahpics对象。 */ protected void paint(Graphics g) { if (!m_b_Drawing) { return; } //*有Double-Buffer支持的设备 this.m_g_BackGraphy = g; this.m_pge_CurrentPage.m_BackGraphy = g; this.m_pge_CurrentPage.Show(); this.m_g_BackGraphy = null; this.m_pge_CurrentPage.m_BackGraphy = null; //*/ /*无Double-Buffer支持的MIDP 1.0设备 if (m_BackImage != null) { g.drawImage(m_BackImage, 0, 0, Graphics.TOP | Graphics.LEFT); } //*/ m_b_Drawing = false; } /** * 开始游戏线程的循环。 */ public void StartFlip()//int aRefreshInterval) { Flipper flipper; flipper = new Flipper(); timer = new Timer(); timer.schedule(flipper, 0, FLIP_MSEL);//aRefreshInterval); } /** * 停止游戏线程。 */ public void StopFlip() { if (timer == null) { return; } timer.cancel(); timer = null; } /** * 是否退出游戏应用。如果需要退出整个游戏应用,则将此变量设置为true。 */ boolean exit = false; /** * <p>一个游戏周期内的所有动作,每个游戏周期之内被调用一次。</p> * 在这个方法中会调用m_pge_CurrentPage.Show()(或间接引起其被调用)。 */ public void Show() { /* 在不支持Double-Buffer的设备上,判断 if(m_g_BackGraphy == null) { return; }//*/ if ( /*(m_g_BackGraphy == null) ||*/ (m_b_Drawing) || (m_pge_CurrentPage == null)) { return; } //m_pge_CurrentPage.Show(); 不支持Double-Buffer的设备上 m_b_Drawing = true; //*在MIDP 1.0设备上 repaint(0, 0, m_i_ScreenWidth, m_i_ScreenHeight); serviceRepaints(); //*/ /*在MIDP 2.0设备上 this.flushGraphics(); // */ if(exit) // 每个周期结束前检测是否退出应用 { StopFlip(); m_App.notifyDestroyed(); } } /** * <p>将指定图像的指定区域拷贝到屏幕上的指定位置。<b>Blt</b>(Block Transfer?)</p> * 功能类似于MIDP 2.0中的Grahpics的成员方法drawRegion(Image src, int x_src, int y_src, int width, int height, int transform, int x_dest, int y_dest, int anchor)。 * @param XDest 目标点横坐标 * @param YDest 目标点纵坐标 * @param Width 拷贝区域的宽 * @param Height 拷贝区域的高 * @param XSrc 拷贝区域左上角在源图像上的横坐标 * @param YSrc 拷贝区域左上角在源图像上的纵坐标 * @param SrcSurface 源图像 */ public void Blt(int XDest, int YDest, int Width, int Height, int XSrc, int YSrc, Surface SrcSurface) { if ( (SrcSurface.m_Image == null) || (m_g_BackGraphy == null)) { return; } m_g_BackGraphy.setClip(XDest, YDest, Width, Height); m_g_BackGraphy.drawImage(SrcSurface.m_Image, XDest - XSrc, YDest - YSrc, Graphics.TOP | Graphics.LEFT); System.out.println(YDest); m_g_BackGraphy.setClip(0, 0, m_i_ScreenWidth, m_i_ScreenHeight); } /** * <p>按键按下的事件响应。</p> * 此方法首先将按键编码抽象,然后把抽象后的编码传递给m_pge_CurrentPage.OnKeyDown(int)。 * 案件抽象的方法参见getKeyAction(int)。 * @param keyCode 被按下按键的按键编码。 */ protected void keyPressed(int keyCode) { m_pge_CurrentPage.OnKeyDown(getKeyAction(keyCode)); } /** * <p>按键弹起的事件响应。</p> * 此方法首先将按键编码抽象,然后把抽象后的编码传递给m_pge_CurrentPage.OnKeyUp(int)。 * 案件抽象的方法参见getKeyAction(int)。 * @param keyCode 弹起按键的按键编码 */ protected void keyReleased(int keyCode) { m_pge_CurrentPage.OnKeyUp(getKeyAction(keyCode)); } /** * <p>获取所给按键编码的抽象编码。</p> * <p>为了提高游戏的可移植性,Canvas中设置了一个叫做Game Action的机制。 * 这个机制中存在的问题是,对于各种不同的设备GameAction的映射方法有很大 * 的差异,不利于统一用户习惯。所以在引擎中实现一个类似的机制,以统一不同 * 设备之间的映射规则。 * @param keyCode 按键的设备编码。 * @return 如果所给的按键编码需要进行映射,则返回映射后的编码;反之返回原值。 */ private int getKeyAction(int keyCode) { switch(keyCode) { case -6: case Canvas.KEY_STAR: return KEY_SOFTKEY1; case -7: case Canvas.KEY_POUND: return KEY_SOFTKEY2; case Canvas.UP: case Canvas.KEY_NUM2: return KEY_UP; case Canvas.DOWN: case Canvas.KEY_NUM8: return KEY_DOWN; case Canvas.LEFT: case Canvas.KEY_NUM4: return KEY_LEFT; case Canvas.RIGHT: case Canvas.KEY_NUM6: return KEY_RIGHT; default: return keyCode; } } /* protected void pointerPressed(int x, int y) { m_pge_CurrentPage.OnPointerDown(x, y); } protected void pointerReleased(int x, int y) { m_pge_CurrentPage.OnPointerUp(x, y); } protected void pointerDragged(int x, int y) { m_pge_CurrentPage.OnPointerDrag(x, y); }*/ /** * <p>Title: </p> * <p>Description: asdf</p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ class Flipper extends TimerTask { //private int m_Count; public Flipper() { //m_Count = 0; } public void run() { Show(); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -