📄 gamelayer.java
字号:
private void initLayer(TiledLayer layer, int[][] data) {
for (int iRow = 0; iRow < ARRAY_ROW; iRow++) {
for (int iCol = 0; iCol < ARRAY_COLUMN; iCol++) {
layer.setCell(iCol, iRow, data[iRow][iCol]);
}
}
}
/**
* 对数据的读写必须synchronized; 鉴于游戏的整体设计中,执行到此的线程已经synchronized(GameLayer),
* 所以这里不再要求synchronized。
*/
public void setLayersCell(int iCol, int iRow, int iContent) {
viewLayer.setCell(iCol, iRow, iContent);
bulletLayer.setCell(iCol, iRow, iContent);
tankLayer.setCell(iCol, iRow, iContent);
}
/**
* 因为游戏的设计将Status和paint()分离,所以以下在paint()时候的遍历不会引起时间上的错误。
*/
public void paintLayer(Graphics g) {
viewLayer.paint(g);
Enumeration em = null;
em = vPlayerBullets.elements();
while (em.hasMoreElements()) {
((PlayerBullet) em.nextElement()).paintPlayerBullet(g);
}
em = vGameBullets.elements();
while (em.hasMoreElements()) {
((GameBullet) em.nextElement()).paintGameBullet(g);
}
em = vGameTanks.elements();
while (em.hasMoreElements()) {
((GameTank) em.nextElement()).paintGameTank(g);
}
em = vPlayerTanks.elements();
while (em.hasMoreElements()) {
((PlayerTank) em.nextElement()).paintPlayerTank(g);
}
/**
* 绘制"剩余的PlayerTank"图片。
*/
PlayerTankManager.paintRemainedSprite(g, PLAYER_REMAIN_X_BASE,
AREA_HEIGHT);
/**
* 对注册的Multiple drawer(individule instance)paint, 每次remove single drawer
* instance。
*/
em = vDrawer.elements();
boomDrawer drawer = null;
// Vector vShouldRemoved = new Vector();
while (em.hasMoreElements()) {
drawer = ((boomDrawer) em.nextElement());
drawer.drawBoom(g);
unRegistSingleDrawer(drawer);
// vShouldRemoved.addElement(drawer);
}
/*
* em = vShouldRemoved.elements(); while (em.hasMoreElements()) {
* unRegistSingleDrawer((boomDrawer) em.nextElement()); }
*/
}
/**
* 采用Sprite的多个Frame而不是defineRefPixel的方式后,使用 "X + iWidth"和"Y + iHeight"来计算。
*/
public static boolean isOutsideLayer(Sprite sprite) {
int X = sprite.getX();
int Y = sprite.getY();
int iWidth = sprite.getWidth();
int iHeight = sprite.getHeight();
if (X < AREA_UP_LEFT_X || X + iWidth > AREA_UP_LEFT_X + AREA_WIDTH)
return true;
/*
* if (X < AREA_UP_LEFT_X || X > AREA_UP_LEFT_X + AREA_WIDTH) return
* true;
*/
if (Y < AREA_UP_LEFT_Y || Y + iHeight > AREA_UP_LEFT_Y + AREA_HEIGHT)
return true;
/*
* if (Y < AREA_UP_LEFT_Y || Y > AREA_UP_LEFT_Y + AREA_HEIGHT) return
* true;
*/
return false;
}
/**
* @param iDim
* 维度的长度,如TiledLayer的Cell的Width或Height,46、16或9、4。
* @param iBegin
* 计算的起始坐标。
* @param iLength
* (iBegin + iLength) 为计算的结束坐标。
*/
public static Hashtable dimensionCollision(int iDim, int iBegin, int iLength) {
Hashtable htDimension = new Hashtable();
int iDimValue;
/**
* 从起始到结束,依次计算每"根"像素对应的Cell坐标值。
*/
for (int i = iBegin; i <= iBegin + iLength; i++) {
iDimValue = i % iDim == 0 ? i / iDim - 1 : i / iDim;
/**
* 这样可以防止重复的dimension值。
*/
htDimension.put(new Integer(iDimValue), new Integer(iDimValue));
}
return htDimension;
}
TiledLayer getBulletLayer() {
return bulletLayer;
}
TiledLayer getTankLayer() {
return tankLayer;
}
TiledLayer getViewLayer() {
return viewLayer;
}
void registPlayerTank(PlayerTank tank) {
vPlayerTanks.addElement(tank);
}
void unRegistPlayerTank(PlayerTank tank) {
vPlayerTanks.removeElement(tank);
}
void registGameTank(GameTank tank) {
vGameTanks.addElement(tank);
}
void unRegistGameTank(GameTank tank) {
vGameTanks.removeElement(tank);
}
void registPlayerBullets(PlayerBullet bullet) {
vPlayerBullets.addElement(bullet);
}
void unRegistPlayerBullets(PlayerBullet bullet) {
vPlayerBullets.removeElement(bullet);
}
void registGameBullets(GameBullet bullet) {
vGameBullets.addElement(bullet);
}
void unRegistGameBullets(GameBullet bullet) {
vGameBullets.removeElement(bullet);
}
Vector getVGameBullets() {
return vGameBullets;
}
Vector getVGameTanks() {
return vGameTanks;
}
Vector getVPlayerBullets() {
return vPlayerBullets;
}
Vector getVPlayerTanks() {
return vPlayerTanks;
}
/**
* 由于paint Boom图片的需要,利用Vector的removeElement()工作方式(remove first occurence),
* 按照GameLayer的BOOM_DRAW_TIMES值注册多次(Multiple), 并"自然地"能够完成对single的remove。
*/
void registMultipleDrawer(boomDrawer drawer) {
// for (int i = 0; i < BOOM_DRAW_TIMES; i++) {
vDrawer.addElement(drawer);
// }
}
private void unRegistSingleDrawer(boomDrawer drawer) {
vDrawer.removeElement(drawer);
}
void paintException(String strMessage) {
canvas.paintException(strMessage);
}
void nextPlayerTank() {
canvas.nextPlayerTank();
}
/**
* 遍历各个Vector,将各个elements pause。
*/
void pauseGame() {
Enumeration em = null;
em = getVGameTanks().elements();
while (em.hasMoreElements()) {
((GameTank) em.nextElement()).pauseGameTank();
}
em = getVGameBullets().elements();
while (em.hasMoreElements()) {
((GameBullet) em.nextElement()).pauseGameBullet();
}
em = getVPlayerBullets().elements();
while (em.hasMoreElements()) {
((PlayerBullet) em.nextElement()).pausePlayerBullet();
}
}
/**
* 遍历各个Vector,将各个elements restart。
*/
void restartGame() {
Enumeration em = null;
em = getVGameTanks().elements();
while (em.hasMoreElements()) {
((GameTank) em.nextElement()).restartGameTank();
}
em = getVGameBullets().elements();
while (em.hasMoreElements()) {
((GameBullet) em.nextElement()).restartGameBullet();
}
em = getVPlayerBullets().elements();
while (em.hasMoreElements()) {
((PlayerBullet) em.nextElement()).restartPlayerBullet();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -