📄 plcanvas.java
字号:
/*
* @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 + -