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

📄 gamelayer.java

📁 一个非常不错的J2ME坦克大战的游戏,可以在机顶盒上实际运行.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	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 + -