📄 ccollision.java
字号:
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
/*
* 碰撞类
* 要求碰撞文件中的碰撞信息第一个数字表示此地图可行走的块的总块数
* 第二个数字表示此地图是否大地图,1 表示大地图,2 表示小地图
* 大地图:数据体表示可以行走的块的序号
* 小地图:数据体表示可以行走的块的序号
* 碰撞文件:*.cls
*/
public class CCollision
{
private int m_arrCollisionGrid[]; //存放可以走的地图块序号
private boolean m_inBigMap; //是否在大地图
//---------------------------
// 构造函数
// 将含有碰撞信息的文件读入
//---------------------------
public CCollision(String filepath)
{
InputStream is = this.getClass().getResourceAsStream(filepath);
DataInputStream dis = new DataInputStream(is);
byte canGoGridNum = 0; //记录共有多少格地图块可以行走
try
{
canGoGridNum = dis.readByte(); //可以行走的总块数
if (dis.readByte() == 1) //大地图
m_inBigMap = true;
else
m_inBigMap = false; //小地图
} catch (IOException ex)
{
ex.printStackTrace();
}
m_arrCollisionGrid = new int[canGoGridNum];
try
{
for (int i = 0; i < canGoGridNum; i++)
{
m_arrCollisionGrid[i] = dis.readByte();
if (m_arrCollisionGrid[i] < 0)
{
m_arrCollisionGrid[i] += 256;
}
}
} catch (IOException ex)
{
ex.printStackTrace();
}
}
//---------------------------
// 返回是否在非碰撞区域之内
//---------------------------
public boolean InCanGoGrid(int grid)
{
for (int i = 0; i < m_arrCollisionGrid.length; i++)
{
if (m_arrCollisionGrid[i] == grid)
return true;
}
return false;
}
//---------------------------
// 返回某点是否在两点所在的直线的右边
//---------------------------
public boolean IsRightOfLine(int x1, int y1, int x2, int y2, int x, int y)
{
int tmp = (x1 - x2) / (y1 - y2) * (y - y2) + x2;
if (x > tmp)
return true;
else
return false;
}
//---------------------------
// 返回是否在可行区域之内(房间)
//---------------------------
public boolean InCanGoRegion(int posX, int posY)
{
int x0 = m_arrCollisionGrid[0]; //上点
int y0 = m_arrCollisionGrid[1];
int x1 = m_arrCollisionGrid[2]; //左点
int y1 = m_arrCollisionGrid[3];
int x2 = m_arrCollisionGrid[4]; //下点
int y2 = m_arrCollisionGrid[5];
int x3 = m_arrCollisionGrid[6]; //右点
int y3 = m_arrCollisionGrid[7];
if (posY <= y1)
{
if (IsRightOfLine(x0, y0, x1, y1, posX, posY) &&
!IsRightOfLine(x0, y0, x3, y3, posX, posY))
return true;
}
else
{
if (IsRightOfLine(x2, y2, x1, y1, posX, posY) &&
!IsRightOfLine(x2, y2, x3, y3, posX, posY))
return true;
}
return false;
// 这里的代码是 RectInRect 的源码
// int RectX = m_arrCollisionGrid[0];
// int RectY = m_arrCollisionGrid[1];
// int RectWid = m_arrCollisionGrid[2];
// int RectHei = m_arrCollisionGrid[3];
// if (posX + width < RectX ||
// posX > RectX + RectWid ||
// posY + height < RectY ||
// posY > RectY + RectHei)
// return false;
// else
// return true;
}
//---------------------------
// 返回当前是否在大地图
//---------------------------
public boolean InBigMap()
{
return m_inBigMap;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -