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

📄 tools.java

📁 ACT游戏DEMO 《手机游戏开发全书》附带的源代码
💻 JAVA
字号:


import javax.microedition.lcdui.Graphics;
import com.nokia.mid.ui.*;


public class Tools {
       /**
        * 这里考虑读者清晰的看到数据项,统一将所有数据资源放在Data类里。与书中有略微的区别。
        * @param g Graphics
        * @param objectIndex int对象在动画数据中的编号
        * @param actionIndex int动作编号(动作索引)
        * @param frameIndex int 帧索引
        * @param posX int在地图中的位置
        * @param posY int
        * @param isLeft boolean方向是否向左
        */
       protected static final void drawNpcItemData(Graphics g, int objectIndex, int actionIndex,
           int frameIndex, int posX, int posY,
           boolean isLeft)
       {
              posY -= 8;
              try
              {
                     DirectGraphics dg = DirectUtils.getDirectGraphics(g); //用到NOKIA的翻转
                     /*获得当前帧的组成的切片个数*/
                     int length = Data.npcItemData[objectIndex][actionIndex][frameIndex].length / 3;
                     for (int i = 0; i < length; i++)
                     { //循环将所有切片全部显示出来
                            /*第i个切片的ID(对应allItemData中的某个索引值)*/
                            int ID = Data.npcItemData[objectIndex][actionIndex][frameIndex][i * 3 + 0];
                            /*当前切片的中心点对应posX,posY的偏移量*/
                            int offsetX = Data.npcItemData[objectIndex][actionIndex][frameIndex][i * 3 + 1];
                            int offsetY = Data.npcItemData[objectIndex][actionIndex][frameIndex][i * 3 + 2];
                            int tempX; //定义临时的x,y
                            int tempY;
                            if (isLeft)
                            { //如果面向左,与原资源相符则不需要翻转
                                   /*因为offsetX是中心点的偏移,所以对应的显示位置为
                                    最终切片的位置 = 要显示的位置 + 偏移量 - 图块切片的宽度的一半
                                    */
                                   tempX = posX + offsetX - (Data.allItemData[ID][3] >> 1);
                                   tempY = posY + offsetY - (Data.allItemData[ID][4] >> 1);
                                   /*绘制的位置为我们求得的位置(在地图中的位置) - 屏幕左上角的位置
                                    则是要在屏幕中的绘制位置*/
                                   g.drawImage(Data.allImage[ID], tempX - Map.leftTopX,
                                               tempY - Map.leftTopY, 0);
                            }
                            else
                            { //面向右,则与原资源的方向相反。所有的切片都需要水平镜像翻转一次

                                   /*当数据allItemData中的某一项有6个量意味着此切片需要翻转后才可以使用
                                    *Data.allItemData[ID][5] == 1 || Data.allItemData[ID][5] == 3
                                    *表示需要90度或者270度翻转时,偏移量offsetX  =
                                    *原始偏移量-切片宽度 + 切片高度
                                    *(offsetY 同理)
                                    */
                                   if (Data.allItemData[ID].length == 6 &&
                                       (Data.allItemData[ID][5] == 1 || Data.allItemData[ID][5] == 3))
                                   {
                                          offsetX = Data.npcItemData[objectIndex][actionIndex][frameIndex][i * 3 + 1]
                                              - (Data.allItemData[ID][3] >> 1) + (Data.allItemData[ID][4] >> 1);
                                          offsetY = Data.npcItemData[objectIndex][actionIndex][frameIndex][i * 3 + 2]
                                              + (Data.allItemData[ID][3] >> 1) - (Data.allItemData[ID][4] >> 1);
                                          tempX = posX - offsetX - (Data.allItemData[ID][4] >> 1);
                                          tempY = posY + offsetY - (Data.allItemData[ID][3] >> 1);
                                   }
                                   else
                                   {
                                          /*其他的只需要将偏移量,求绝对值即和不方向向左一样*/
                                          tempX = posX - offsetX - (Data.allItemData[ID][3] >> 1);
                                          tempY = posY + offsetY - (Data.allItemData[ID][4] >> 1);
                                   }
                                   /*绘制过程需要水平镜象*/
                                   dg.drawImage(Data.allImage[ID], tempX - Map.leftTopX,
                                                tempY - Map.leftTopY, 0, dg.FLIP_HORIZONTAL);
                            }
                     }
              }
              catch (Exception ex)
              {
                     ex.printStackTrace();
              }
       }
       /**
        * 根据已知两个矩形,进行碰撞处理
        * @param x1 int
        * @param y1 int
        * @param w1 int
        * @param h1 int
        * @param x2 int
        * @param y2 int
        * @param w2 int
        * @param h2 int
        * @return boolean
        * 需要注意的是:如果输入参数是主角的x,y,w,h时,那么x1就应该输入为:x1- w1/2,y1为:y1-h1,
        * 因为主角类里定义的x,y为主角脚下中心的点为准。故碰撞矩形应为:(x-w/2,y-h,w,h)
        */
       public static final boolean hit(int x1, int y1, int w1, int h1, int x2, int y2,
                                       int w2, int h2) //检测两个矩形是否相交
       {
              if (y2 + h2 < y1 || // 矩形B是否在矩形A上(情况1)
                  y2 > y1 + h1 || // 矩形B是否在矩形A下(情况2)
                  x2 + w2 < x1 || // 矩形B是否在矩形A的左边(情况3)
                  x2 > x1 + w1) // 矩形B是否在矩形A的右边(情况4)
              { //有上述一种情况者不发生碰撞
                     return false;
              }
              else //反之碰撞
              {
                     return true;
              }
       }


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -