📄 tools.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 + -