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

📄 rdgamecanvas.java

📁 是基于J2ME的一个模拟手机的界面可以实现手机收发短信基于客户端和服务器端的功能
💻 JAVA
字号:
package phone.mediaSound.game.tetris;

import java.io.IOException;
import java.util.Random;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class RDGameCanvas extends GameCanvas implements Runnable {
	/**
	 * @author Hou Liang Wei
	 * @deprecated
	 * @see time 2009-04-20-22:00
	 */
	private NewLayerManager lyManager = new NewLayerManager();

	private TiledLayer RDTiledLayer;// 背景图层

	private Picture tempSpriteArray = new Picture();

	private Sprite RDSprite;

	private Image image;// 边框的图像

	private int picChangeState, picChangeNum;

	private int arrayX, arrayY;

	private int score = 0;// 计分

	private Graphics g;

	private int currentX = 0;// 当前图像的横坐标位置

	private int currentY = 0;// 当前图像的纵坐标位置

	private int[][] RDSpriteArray;

	private int[][] TLMap;

	private int[] isRow = new int[16];

	private Random rand = new Random(System.currentTimeMillis());

	public RDGameCanvas() {
		super(true);
		g = this.getGraphics();
	}

	public void equalzaro() {
		picChangeNum = picChangeState = arrayY = arrayX = currentY = currentX = 0;
	}

	public void run() {
		init();
		while (true) {
			keyPressed();
			RDSprite.setPosition(currentX, currentY++);
			arrayY = currentX / 10;
			arrayX = currentY / 10;
			if (isHit()) {
				if (currentY <= RDSprite.getHeight()) {
					break;
				} else {
					clearBoard();
					changeTiledLayer();
					equalzaro();
					randSprite();
				}
			}
			clearScreen();
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO 自动生成 catch 块
				e.printStackTrace();
			}
		}

	}

	// TiledLayer初始化,及添加层管理面板
	public void init() {
		try {
			image = Image.createImage("/phone/mediaSound/game/tetris/pictures/0.png");
		} catch (IOException e) {
			e.printStackTrace();
		}
		RDTiledLayer = new TiledLayer(12, 16, image, 10, 10);
		TLMap = new int[][] { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
				{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } };
		for (int i = 0; i < 12; i++) {
			for (int j = 0; j < 16; j++) {
				RDTiledLayer.setCell(i, j, TLMap[j][i]);// *********************************
			}
		}
		randSprite();
		lyManager.append(RDSprite);
		lyManager.append(RDTiledLayer);
	}

	// 处理用户按键
	private void keyPressed() {
		if ((this.getKeyStates() == this.UP_PRESSED)) {
			picChangeState++;
			picChangeState %= 4;
			changePic(picChangeNum, picChangeState);
			if ((isHit() == true) & (picChangeState > 0)) {
				picChangeState--;
				picChangeState %= 4;
				changePic(picChangeNum, picChangeState);
			}
		}
		if ((this.getKeyStates() == this.LEFT_PRESSED)) {
			if (currentX > 10) {
				currentX = currentX - 10;
				RDSprite.setPosition(currentX, currentY);
			}
		}
		if ((this.getKeyStates() == this.RIGHT_PRESSED)) {
			if (currentX < RDTiledLayer.getWidth() - RDSprite.getWidth() - 10) {
				currentX = currentX + 10;
				RDSprite.setPosition(currentX, currentY);
			}
		}
		if ((this.getKeyStates() == this.DOWN_PRESSED)) {
			if (currentY < RDTiledLayer.getHeight() - RDSprite.getHeight() - 10) {
				currentY = currentY + 10;
				RDSprite.setPosition(currentX, currentY);
			}
		}
	}

	// 产生随机图像
	private void randSprite() {
		int picNum = Math.abs(rand.nextInt()) % 7;
		int picState = Math.abs(rand.nextInt()) 
		% 4;
		picChangeState = picState;
		picChangeNum = picNum;
		String picName = "/phone/mediaSound/game/tetris/pictures/" + String.valueOf(picNum + 1)
				+ ".png";
		try {
			image = Image.createImage(picName);
		} catch (IOException e) {
			e.printStackTrace();
		}
		RDSprite = new Sprite(image);
		currentX = RDTiledLayer.getWidth() / 2;
		currentY = RDSprite.getHeight();
		RDSprite.setPosition(currentX, currentY);
		RDSprite.defineReferencePixel(RDSprite.getWidth() / 2, 0);
		lyManager.append(RDSprite);
		changePic(picNum, picState);
	}

	public void start() {
		Thread t = new Thread(this);
		t.start();
	}

	public void writeArray(int[][] writearray) {
		for (int i = 0; i < writearray.length; i++) {
			for (int j = 0; j < writearray[i].length; j++) {
				System.out.print(" " + writearray[i][j]);
			}
			System.out.println();
		}
	}

	private void writeArray(int[] writearray) {
		for (int i = 0; i < writearray.length; i++) {
			System.out.print(" " + writearray[i]);
		}
		System.out.println();
	}

	// 判断下落图像是否跟屏幕中的任何一个图像相遇
	public boolean isHit() {
		if (RDSprite.collidesWith(RDTiledLayer, true) == true) {
			return true;
		}
		return false;
	}

	// 改变图像形状
	public void changePic(int picChangeNum, int picChangeState) {
		if (picChangeState == 0) {
			RDSprite.setTransform(RDSprite.TRANS_NONE);
		}
		if (picChangeState == 1) {
			RDSprite.setTransform(RDSprite.TRANS_ROT270);
		}

		if (picChangeState == 2) {
			RDSprite.setTransform(RDSprite.TRANS_ROT180);
		}

		if (picChangeState == 3) {
			RDSprite.setTransform(RDSprite.TRANS_ROT90);
		}
		RDSpriteArray = tempSpriteArray.getSpriteArray(picChangeNum * 4
				+ picChangeState);// *************************
		// writeArray(RDSpriteArray);

	}

	//
	public void clearScreen() {
		g.setColor(255, 255, 255);
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
		lyManager.paint(g, 10, 10);
		this.flushGraphics();
	}

	// 图像从上往下落的时候,当落到最底层的时,或者遇到其它图像的时候,图像停止下落并且成为背景图像的一部分
	private void changeTiledLayer() {
		for (int i = 0; i < RDSpriteArray.length; i++) {
			if (arrayX + i < 16) {
				for (int j = 0; j < RDSpriteArray[i].length; j++) {
					if ((arrayY + j < 12) && (RDSpriteArray[i][j] == 1)) {
						TLMap[arrayX + i][arrayY + j] = RDSpriteArray[i][j] + 1;
					}
				}
			}
		}
		listTLMap();
		isROW();

		removeD();
		lyManager.remove(RDSprite);
	}

	// 图像下落的时候,背景图像的改变
	public void listTLMap() {
		for (int i = 0; i < 12; i++) {
			for (int j = 0; j < 16; j++) {
				RDTiledLayer.setCell(i, j, TLMap[j][i]);// ***************************
			}
		}
	}

	public void isROW() {
		int i, j;
		isRow[0] = isRow[15];
		for (j = 1; j < 15; j++) {
			for (i = 1; i < 11; i++) {
				if (TLMap[j][i] == 2) {
					if (i >= 10)
						isRow[j] = 1;
					continue;
				} else {
					isRow[j] = 0;
					break;
				}
			}
		}
	}

	// 某一行已经完全被填满,这一行消失,并且加分
	public void removeD() {
		int j = 0;
		for (int i = 0; i < isRow.length - 1; i++) {
			if (isRow[i] == 1) {
				changeArray(i);
				listTLMap();
				j++;
			}
		}
		score += j / 2 * 10;
	}

	// 改变数组的值,将数组的后一个元素的值,赋值为前一个元素
	public void changeArray(int i) {
		int j;
		for (j = i; j > 1; j--) {
			TLMap[j] = TLMap[j - 1];
		}
		TLMap[1] = new int[] { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
		score += 10;
		System.out.println("你现在的得分是: " + score);
	}

	// 图层的管理器
	class NewLayerManager extends LayerManager {

		public NewLayerManager() {
			super();
		}

		public void paint(Graphics g, int i, int j) {
			super.paint(g, i, j);
			g.setColor(255, 0, 0);
			g.drawString("得分:" + String.valueOf(score),
					RDTiledLayer.getWidth() + 10, 10, Graphics.LEFT
							| Graphics.TOP);
		}

	}

	private void clearBoard() {
		for (int j = 0; j < 12; j++) {
			TLMap[0][j] = 1;
			TLMap[15][j] = 1;
		}
		for (int i = 0; i < 16; i++) {
			TLMap[i][0] = 1;
			TLMap[i][11] = 1;
		}
	}
}

⌨️ 快捷键说明

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