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

📄 plcanvas.java

📁 名作puyo 移植的手机版
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * @autor Zhang JunQin
 */
import java.io.*;
import java.util.*;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
//import com.nokia.mid.ui.*;

class PlCanvas extends Canvas implements Runnable{
	//方格的宽和高
	private static int CELLW=20;
	private static int CELLH=15;
	//消失效果的宽和高
	private static int CLEARW=32;
	private static int CLEARH=21;
	//场景中横竖方向摆放方格的数量
	private static int BGW=6;
	private static int BGH=12;
	//场景中左上角的坐标
	private static int STARTX=5;
	private static int STARTY=5;
	//场景中绘制下一个方块的左上角坐标
	private static int NEXTX=145;
	private static int NEXTY=92;
	//stage num 和 score num 的宽和高
	private static int STAGEW=10;
	private static int STAGEH=15;
	private static int SCOREW=10;
	private static int SCOREH=11;
	
	//info
	private static int POPW=82;
	private static int POPH=51;
	
	//用于生成随机数的
	private static Random RANDOMIZER=new Random();
	//指示不同的帧
	private static String[] FRAMES=new String[]{"0000","0100","0001","0010","1000",
												"1111","0101","1001","1100","0011",
												"0110","1010","1101","1011","1110","0111"};
	private static int[] CHECKX=new int[]{0,1,0,-1};
	private static int[] CHECKY=new int[]{-1,0,1,0};
	
	//记录每一个方格中的颜色0没有,1~6有
	private int[] cellColor;
	//记录每一个方格是否有cell 0无1有
	private int[] cellOccupied;
	//标记可以消除的方格
	private int[] cellDown;
	//标记是否当前检查过
	private int[] checkArr;
	private int[] holdSame;
	private int sameNum;
	
	
	private Image buffer;
	private Graphics bufferGraphics;
	private Image bg;
	
	private Image blueImage,greenImage,pinkImage,purpleImage,redImage,yellowImage;
	private Image blueClear,greenClear,pinkClear,purpleClear,redClear,yellowClear;
	private Image stageImage,scoreImage;
	private Image popImage;
	private Image prImage;
	private Image[] imageArr;
	private Image[] clearArr;
	
	private int[] framesInfo;
	private int[] clearInfo;
	private int[] stageInfo;
	private int[] scoreInfo;
	private int[] popInfo;
	private int[] prInfo;
	private int stageNum;
	private int scoreNum;
	
	//保存下一个方块的颜色
	private int[] nextColor;
	private boolean haveNext;
	private boolean first;
	//下降方块的idx idy 本应该falling
	private int[] fallCellX,fallCellY;
	private int[] fallStartX,fallStartY;
	private int[] fallColor;
	private int[] fallFlag;
	//纪录下降的步数
	private int fallCount;
	//每次下降的距离
	private static int FALLD=5; 
	
	//run相关
	private boolean isPlay;
	private int delay;
	private int delayValue;
	
	//移动
	private boolean moveRight;
	private boolean moveLeft;
	//
	private boolean downable;
	private boolean clearable;
	private int clearCount;
	private boolean fallDown;
	//变形
	private int changeIndex;
	private boolean changeable;
	private static int[] CHANGEX=new int[]{1,-1,-1,1};
	private static int[] CHANGEY=new int[]{1,1,-1,-1};
	private static int[] JUDGEX=new int[]{1,0,-1,0};
	private static int[] JUDGEY=new int[]{0,1,0,-1};
	
	/*
	public static final int UP_PRESSED = 0x0002;
    public static final int DOWN_PRESSED = 0x0040;
    public static final int LEFT_PRESSED = 0x0004;
    public static final int RIGHT_PRESSED = 0x0020;
    public static final int FIRE_PRESSED = 0x0100;
    public static final int GAME_A_PRESSED = 0x0200;
    public static final int GAME_B_PRESSED = 0x0400;
    public static final int GAME_C_PRESSED = 0x0800;
    public static final int GAME_D_PRESSED = 0x1000;
    */
	
    private int pressKeyStates;
	private int releaseKeyStates;
    private int pressedKeys;
	private int releasedKeys;
	
	private boolean overed;
	private boolean paused;
	
	private Thread t;
	
	private int oldStageNum;
	
	private MainMIDlet midlet;
	private Score highScore;
	
	private boolean checkable;
	private boolean moveRL;
	
	public PlCanvas(MainMIDlet midlet,Score highScore){
		this.midlet=midlet;
		this.highScore=highScore;
		try{
			//背景
			bg=Image.createImage("/scene.png");
			//六种颜色的心
			blueImage=Image.createImage("/blue.png");
			greenImage=Image.createImage("/green.png");
			pinkImage=Image.createImage("/pink.png");
			purpleImage=Image.createImage("/purple.png");
			redImage=Image.createImage("/red.png");
			yellowImage=Image.createImage("/yellow.png");	
			
			blueClear=Image.createImage("/blue_s.png");
			greenClear=Image.createImage("/green_s.png");
			pinkClear=Image.createImage("/pink_s.png");
			purpleClear=Image.createImage("/purple_s.png");
			redClear=Image.createImage("/red_s.png");
			yellowClear=Image.createImage("/yellow_s.png");
			
			scoreImage=Image.createImage("/score.png");
			stageImage=Image.createImage("/stage.png");
			popImage=Image.createImage("/popInfo.png");
			prImage=Image.createImage("/pr.png");
			//还需要读入数字的图片
		}catch(IOException ie){
			bg=null;
			
			blueImage=null;
			greenImage=null;
			pinkImage=null;
			purpleImage=null;
			redImage=null;
			yellowImage=null;
			
			blueClear=null;
			greenClear=null;
			pinkClear=null;
			purpleClear=null;
			redClear=null;
			yellowClear=null;
			
			scoreImage=null;
			stageImage=null;
			popImage=null;
			prImage=null;
			System.out.println("error");
		}
		buffer=Image.createImage(this.getWidth(),this.getHeight());
		bufferGraphics=buffer.getGraphics();
		framesInfo=ImageTool.getImageSequenceInfo(greenImage,CELLW,CELLH);
		clearInfo=ImageTool.getImageSequenceInfo(greenClear,CLEARW,CLEARH);
		stageInfo=ImageTool.getImageSequenceInfo(stageImage,STAGEW,STAGEH);
		scoreInfo=ImageTool.getImageSequenceInfo(scoreImage,SCOREW,SCOREH);
		popInfo=ImageTool.getImageSequenceInfo(popImage,POPW,POPH);
		prInfo=ImageTool.getImageSequenceInfo(prImage,28,15);
		init();
	}
	
	private void init(){
		//0表示没有 1到7分别代表6种不同颜色的heart
		cellColor=new int[BGH*BGW];
		//0表示无 1表示有
		cellOccupied=new int[BGH*BGW];
		//0表示不可消 1表示可
		cellDown=new int[BGH*BGW];
		//checkArr=new int[BGH*BGW];
		imageArr=new Image[]{greenImage,purpleImage,redImage,yellowImage};
		clearArr=new Image[]{greenClear,purpleClear,redClear,yellowClear};
		nextColor=new int[]{-1,-1};
		haveNext=false;
		first=true;
		fallCellX=new int[]{3,3};
		fallCellY=new int[]{0,1};
		fallStartX=new int[]{3,3};
		fallStartY=new int[]{0,1};
		fallColor=new int[2];
		fallCount=0;
		fallFlag=new int[]{0,0};

		moveRight=false;
		moveLeft=false;
		changeIndex=0;
		changeable=false;
		
		downable=true;
		clearable=false;
		clearCount=0;
		fallDown=false;
		
		stageNum=1;
		oldStageNum=stageNum;
		scoreNum=0;
		//loop=true;
		
		delayValue=150-stageNum*10;
		delay=delayValue;
		 
		overed=false;
		paused=false;
		
		checkable=false;
		moveRL=false;
	}
	
	private void drawNext(){
		//System.out.println("OK");
		int max=imageArr.length-1;
		int next0=getRandom(0,max);
		int next1=getRandom(0,max);
		nextColor[0]=next0;
		nextColor[1]=next1;
		ImageTool.drawFrame(bufferGraphics,imageArr[next0],NEXTX,NEXTY,CELLW,CELLH,framesInfo,0);
		ImageTool.drawFrame(bufferGraphics,imageArr[next1],NEXTX,NEXTY+CELLH,CELLW,CELLH,framesInfo,0);
	}
	
	protected void displayNext(){
		ImageTool.drawFrame(bufferGraphics,imageArr[nextColor[0]],NEXTX,NEXTY,CELLW,CELLH,framesInfo,0);
		ImageTool.drawFrame(bufferGraphics,imageArr[nextColor[1]],NEXTX,NEXTY+CELLH,CELLW,CELLH,framesInfo,0);
	}
	
	protected void displayStage(){
		//起始点150,37
		ImageTool.drawFrame(bufferGraphics,stageImage,150,37,STAGEW,STAGEH,stageInfo,stageNum);
	}
	
	protected void displayScore(){
		//四位数,起始点135,163
		//速度问题有待考察
		int[] temp=new int[]{0,0,0,0};
		temp[0]=scoreNum/1000;
		temp[1]=(scoreNum-temp[0]*1000)/100;
		temp[2]=(scoreNum-temp[0]*1000-temp[1]*100)/10;
		temp[3]=scoreNum-temp[0]*1000-temp[1]*100-temp[2]*10;
		for(int i=0;i<4;i++){
			ImageTool.drawFrame(bufferGraphics,scoreImage,134+i*SCOREW,163,SCOREW,SCOREH,scoreInfo,temp[i]);
		}
	}
	
	//考虑连锁(snum)和一次消除的数量(num)
	//效率还有待改善
	protected void updateScore(int num,int snum){
		//snum连锁次数
		scoreNum+=snum*10+num*5;
		stageNum=scoreNum/1000+1;
		delayValue=150-stageNum*10;
		delay=delayValue;
	}
	
	
	protected void drawBg(){
		//bufferGraphics.setColor(0xffffff);
		//bufferGraphics.fillRect(0,0,this.getWidth(),this.getHeight());
		bufferGraphics.setClip(0,0,176,208);
		bufferGraphics.drawImage(bg,0,0,Graphics.TOP|Graphics.LEFT);
		drawStaticCell();
		displayStage();
		displayScore();
		if(nextColor[0]>=0){
			displayNext();
		}
		//显示右软键label
		ImageTool.drawFrame(bufferGraphics,prImage,145,192,28,15,prInfo,0);
	}
	
	//绘制静止的heart,帧信息需要计算******
	protected void drawStaticCell(){
		for(int j=0;j<BGH;j++){
			for(int i=0;i<BGW;i++){
				if(cellDown[j*BGW+i]==1){
					
				}else{
				int dummy=cellColor[j*BGW+i];
				if(dummy!=0){
					StringBuffer str=new StringBuffer();
					for(int k=0;k<4;k++){
						if((j+CHECKY[k])<0||(j+CHECKY[k])>(BGH-1)||(i+CHECKX[k])<0||(i+CHECKX[k])>(BGW-1)){
							str.append(0);
						}else if(dummy==cellColor[(j+CHECKY[k])*BGW+(i+CHECKX[k])]){
							str.append(1);
						}else{
							str.append(0);
						}
					}
					int temp=0;
					
					for(int m=0;m<FRAMES.length;m++){
						//System.out.println();
						if(str.toString().equals(FRAMES[m])){
							temp=m;
							break;
						}
					}
					//System.out.println("frameNume:  "+temp);
					ImageTool.drawFrame(bufferGraphics,imageArr[dummy-1],STARTX+i*CELLW,STARTY+j*CELLH,CELLW,CELLH,framesInfo,temp);
				}
				}
			}
		}
	}
	
	protected void drawClearCell(){
		for(int j=0;j<BGH;j++){
			for(int i=0;i<BGW;i++){
				if(cellDown[j*BGW+i]==1){
					int dummyx=STARTX+i*CELLW-6;
					int dummyy=STARTY+j*CELLH-3;
					//System.out.println(cellColor[j*BGW+i]-1);
					ImageTool.drawFrame(bufferGraphics,clearArr[cellColor[j*BGW+i]-1],dummyx,dummyy,CELLW,CELLH,clearInfo,clearCount);
				}
			}
		}
		clearCount++;
		if(clearCount>3){
			clearCount=0;
			clearable=false;
			//downable=true;
			fallDown=true;
		}
	}
	
	protected void cellFallDown(){
		fallDown=false;
		clearable=true;
		boolean lineHave=false;
		for(int i=0;i<BGW;i++){
			for(int j=0;j<BGH;j++){
				if(cellDown[j*BGW+i]==1){
					//可能还存在最上面一行的问题(ms解决)
					for(int k=j;k>0;k--){
						cellDown[k*BGW+i]=cellDown[(k-1)*BGW+i];
						cellColor[k*BGW+i]=cellColor[(k-1)*BGW+i];
						cellOccupied[k*BGW+i]=cellOccupied[(k-1)*BGW+i];
					}
					cellDown[0*BGW+i]=0;
					cellColor[0*BGW+i]=0;
					cellOccupied[0*BGW+i]=0;
					lineHave=true;
					break;
				}
			}
		}
		if(lineHave){
			fallDown=true;
			clearable=false;
			return;
		}
		checkSame();
	}
	protected void drawFallCell(){
		moveRL=true;
		//gameover
		/*for(int i=0;i<2;i++){
			if(cellOccupied[fallCellY[i]*BGW+fallCellX[i]]==1){
				isPlay=false;
				return;
			}
		}*/
		if(!haveNext){
			drawNext();
			haveNext=true;
		}
		
		//move right
		if(moveRight){
			moveRight=false;
			for(int i=0;i<2;i++){
				if(fallFlag[i]==0)fallCellX[i]++;
			}
		}else if(moveLeft){   // move left
			moveLeft=false;
			for(int i=0;i<2;i++){
				if(fallFlag[i]==0)fallCellX[i]--;
			}
		}else if(changeable){
			fallCellX[0]+=CHANGEX[changeIndex];
			fallCellY[0]+=CHANGEY[changeIndex];
			fallStartY[0]+=CHANGEY[changeIndex];
			changeIndex++;
			//System.out.println("changeIndex:   "+changeIndex);
			if(changeIndex>3){
				changeIndex=0;
			}
			changeable=false;
		}
		for(int i=0;i<2;i++){
			if(fallFlag[i]==0){
					int dummyx=STARTX+fallCellX[i]*CELLW;
					int dummyy=STARTY+fallStartY[i]*CELLH+fallCount*FALLD;
					//System.out.println(dummyy);
					ImageTool.drawFrame(bufferGraphics,imageArr[fallColor[i]],dummyx,dummyy,CELLW,CELLH,framesInfo,0);
			}
		}
		//在此出添加判断是否可以下降的代码 主要是针对方块刚出来的状况(很重要)

⌨️ 快捷键说明

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