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

📄 gamecanvas.java

📁 横屏移动地图移动和人物移动横屏幕的移动初级作品
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*画布类,画logo,游戏画面*/package Speeds;import javax.microedition.lcdui.Displayable;import javax.microedition.lcdui.Display;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Font;import javax.microedition.lcdui.Image;import java.util.Random;import com.nokia.mid.ui.FullCanvas;import com.nokia.mid.ui.DirectUtils;public class GameCanvas extends FullCanvas{	protected Man blackMan=null;	protected GameData gda=null;	protected int showCon=0;	private Image logo=null;	private Image bigPic=null;	private Image midPic=null;	private Image glogo=null;	private Image grid=null;	private Image status=null;	private Image menuItem=null;	private int srcW=0;	private int srcH=0;		private int stepW=8;	private boolean loadImg=false;	private Display gDisp=null;	protected short bakBeginX=0;				//背景开始绘制的x坐标(用于背景滚屏移动)	protected short streetBeginX=0;				//道路开始绘制的x坐标(用于道路滚屏移动)	protected short midBeginX=0;				//中层景物的参照x坐标	private int bombX,bombY;	private short bloodY=0;						//绘制补给品的y坐标	private short screenMovX=80;				//滚屏位置	protected short mapDataBeginX=0;			//地图数据起始位置,按每隔8个象素一格	protected Graphics myGraphic=null;		//菜单图对象		protected boolean keyup=false,keyup1=false;	protected boolean keydown=false,keydown1=false;	protected boolean keyleft=false,keyleft1=false;	protected boolean keyright=false,keyright1=false;	protected boolean keyfire=false,keyfire1=false;	protected boolean manWait=false;	protected boolean keyTouched=false;	protected boolean keyRightFunc=false;			//右功能键	protected int bi;	protected int bx;	//protected int curPosX=0;	private Random ra;	protected boolean isGameOver=false;	protected boolean isRunning=false;	protected boolean passInitOk=false;				//画一些过场	protected int passCount=0;	protected int passStep=0;	//记录图素在位置,大小及属于那个大图,编号是存储在地图数据中的图素编号,最后一位用来区分所属大图,0为小图,1为大图	protected short[][] picsPos={{0,191,30,16,16},			//南瓜炸弹								{1,191,45,16,16},			//榴莲炸弹								{2,191,14,16,16},			//苹果炸弹								{3,191,-2,16,16},			//西瓜炸弹								{4,160,3,24,32},			//右向敌人								{5,2,40,24,32},				//左向敌人								{6,239,66,8,10},			//石块								{7,207,66,8,10},			//垃圾桶								{8,0,0,32,90},				//丛林背景								{9,32,0,32,90},				//食人部落背景								{10,64,0,32,90},			//雪地背景								{11,96,0,32,90},			//日落大道背景								{12,0,90,32,47},			//丛林道路								{13,32,90,32,47},			//食人部落道路								{14,64,90,32,47},			//雪地道路								{15,96,90,32,47},			//日落大道道路								{16,43,128,22,18},			//小草从深色								{17,128,100,48,20},			//小草丛浅色								{18,43,147,64,32},			//大草丛								{19,128,1,50,55},			//岩石								{20,0,156,34,23},			//长草丛浅色								{21,108,156,34,22},			//长草丛深色								{22,65,128,22,18},			//短草丛								{23,0,128,44,27},			//栅栏								{24,128,56,49,45},			//斜草丛蓝白色								{25,145,129,40,29},			//斜草丛深色右								{26,108,129,40,29},			//斜草丛深色左								{27,191,64,8,16},			//血包								{28,224,61,16,16}			//机关爆炸							};	protected short[][] mansPos={{41,3,16,32},			//右走1 0							{25,3,16,32},				//右走2 1							{57,3,17,32},				//右走3 2							{1,3,23,32},				//右开枪 3							{74,11,22,24},				//右下蹲 4							{98,11,30,24},				//右拆弹 5							{128,22,32,16},				//右死亡 6							{129,40,16,32},				//左走1 7							{145,40,16,32},				//左走2 8							{112,40,17,32},				//左走3 9							{161,40,23,32},				//左开枪 10							{90,48,22,24},				//左下蹲 11							{58,48,32,24},				//左拆弹 12							{26,55,32,16},				//左死亡 13							{184,3,4,2},				//子弹右							{184,6,4,2}};				//子弹左								protected String[] menuStr={"新游戏","继续上次游戏","游戏帮助","音量控制","退出游戏"};	protected boolean showMenuFlag=false;	protected int menuItemId=0;	protected int menuClass=0;	private String helpStr="注意:请打开手机声音,仔细分辨炸弹鸣音,以便拆除炸弹。\n操作控制:方向键行走,下键下蹲。OK键开枪。手机右功能键开/关菜单。下蹲后再按下键,则根据不同状态,主角做出不同动作。炸弹分四类:A、B、X、T型。B、A型属可解除的节律弹,以某种节拍在危险(红色)和安全(绿色)间闪动,当处于安全状态(绿色)时,对它进行解除(下蹲时按下键),可使其失效。T型弹是定时炸弹,一旦启动就不可解除。在空地前蹲下,按下键即可安放它。再按下键即启动它。X型属不可拆除的集束炸弹,只能其他炸弹引爆它。";	protected int soundMaxVar=10;	protected int soundVar=0;	protected boolean showHelp=false;	protected int beginCol=0;	private short strPointer[]=new short[10];	protected short page=0;	protected int colW=0;		protected boolean showTitle=false;		//是否显示标题	private String levelTitle[]={"第一章","第二章","第三章","第四章","尾声"};	private String levelString[]={"雨林烟起","食人部落","落基山的雪","日落大道"," "};	public GameCanvas(Display disp) {					//构造器		srcW=getWidth();		srcH=getHeight();		gDisp=disp;		blackMan=new Man(160,this);		gda=new GameData(this,blackMan);		ra=new Random();		int i;		//gda.manBeginY=srcH-picsPos[gda.mapGlobe[2]][4]+10;				//curPosX=blackMan.mapPosX;				try		{			logo=Image.createImage("/icons/c_logo.png");			grid=DirectUtils.createImage(100,100,0x925099FF);			menuItem=DirectUtils.createImage(100,20,0x5500FFAA);			glogo=Image.createImage("/icons/g_logo.png");			status=Image.createImage("/icons/status.png");		}		catch (java.io.IOException e)		{			System.out.println("open image file error");		}		try		{			soundVar=PlaySound.getmygain();		}		catch (IllegalStateException e)		{			soundVar=5;		}	}	public void start() {		gDisp.setCurrent(this);	}	public void paint(Graphics g) {		int imgX=0;		int imgY=0;		int i,j;		int imgNum=0;				if(showCon==0) {		//画公司logo			if(passInitOk) {				g.setColor(0x00000000);				g.fillRect(0,0,srcW,srcH);				g.drawImage(logo,0-(srcW-passCount*8),0,Graphics.TOP|Graphics.LEFT);			} else {				g.drawImage(logo,0,0,Graphics.TOP|Graphics.LEFT);			}		}		if(showCon==1) {		//画游戏logo			if(!showMenuFlag) {				if(passInitOk) {					g.setColor(0x00000000);					g.fillRect(0,0,srcW,srcH);					g.drawImage(glogo,0-(srcW-passCount*8),0,Graphics.TOP|Graphics.LEFT);				} else {					g.drawImage(glogo,0,0,Graphics.TOP|Graphics.LEFT);				}			}			//showMenuFlag=true;			g.setColor(0x00000000);			if(showMenuFlag) {				g.fillRect(0,0,srcW,srcH);			}			drawMenu(g);		}		if(showCon==2) {		//游戏内容			if(showTitle) {				g.setClip(0,0,srcW,srcH);				g.setColor(0x00000000);				g.fillRect(0,0,srcW,srcH);				g.setColor(0x00FFFFFF);				g.setFont(Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN,Font.SIZE_SMALL));				g.drawString(levelTitle[gda.gameLevel-1],10,20,Graphics.TOP|Graphics.LEFT);				g.drawString(levelString[gda.gameLevel-1],10,40,Graphics.TOP|Graphics.LEFT);				//showTitle=false;			} else {			if(!loadImg) {				logo=null;				glogo=null;				try				{					bigPic=Image.createImage("/icons/big.png");					midPic=Image.createImage("/icons/mans.png");					//status=Image.createImage("/icons/status.gif");				}				catch (java.io.IOException e)				{					System.out.println("open image file error");				}				loadImg=true;				//System.out.println("load pic ok");			}			//画游戏背景,画三次以实现移动效果			short bakImgNum=(short)gda.mapGlobe[1];						for(i=-1;i<=srcW/picsPos[bakImgNum][3];i++) {				g.setClip(0+i*picsPos[bakImgNum][3]-bakBeginX,0,picsPos[bakImgNum][3],picsPos[bakImgNum][4]);				g.drawImage(bigPic,0-picsPos[bakImgNum][1]+i*picsPos[bakImgNum][3]-bakBeginX,0-picsPos[bakImgNum][2],							Graphics.TOP|Graphics.LEFT);			}									//画其他存储在地图数据中的图素,前方要多画半屏			bi=blackMan.mapPosX/stepW;						bx=blackMan.mapPosX%stepW;						//从mapPosX是屏幕定点所处的位置,从mapPosX前的-20*8开始绘制屏幕			for(i=-20;i<16;i++) {			//下层的中间景物				if(bi+i>=0 && bi+i<gda.colNu) {					//System.out.println("col num:"+(i));					if(gda.mapData[bi+i][0]!=(byte)0xFF && gda.mapData[bi+i][2]==(byte)0x00) {						imgNum=(int)gda.mapData[bi+i][0];						//System.out.println("col num:"+(i));						imgY=(int)gda.mapData[bi+i][1]*stepW;						g.setClip(i*stepW-bx,imgY,picsPos[imgNum][3],picsPos[imgNum][4]);						g.drawImage(bigPic,i*stepW-picsPos[imgNum][1]-bx,imgY-picsPos[imgNum][2],									Graphics.TOP|Graphics.LEFT);					}				}			}			//画路面,也要有移动的效果			short roadImgNum=(short)gda.mapGlobe[2];			for(i=-1;i<=srcW/picsPos[roadImgNum][3];i++) {				g.setClip(0+i*picsPos[roadImgNum][3]-streetBeginX,srcH-picsPos[roadImgNum][4],picsPos[roadImgNum][3],picsPos[roadImgNum][4]);				g.drawImage(bigPic,0-picsPos[roadImgNum][1]+i*picsPos[roadImgNum][3]-streetBeginX,0-picsPos[roadImgNum][2]+srcH-picsPos[roadImgNum][4],							Graphics.TOP|Graphics.LEFT);			}						//System.out.println("bakimgnum:"+bakImgNum);			for(i=-20;i<16;i++) {			//上层的中间景物				if(bi+i>=0 && bi+i<gda.colNu) {					//System.out.println("col num:"+(bi+i));					if(gda.mapData[bi+i][0]!=(byte)0xFF && gda.mapData[bi+i][2]!=(byte)0x00) {						imgNum=(int)gda.mapData[bi+i][0];						//System.out.println("col num:"+(i));						imgY=(int)gda.mapData[bi+i][1]*stepW;						g.setClip(i*stepW-bx,imgY,picsPos[imgNum][3],picsPos[imgNum][4]);						g.drawImage(bigPic,i*stepW-picsPos[imgNum][1]-bx,imgY-picsPos[imgNum][2],									Graphics.TOP|Graphics.LEFT);					}										/////////////////画补给品					if(gda.mapData[bi+i][7]!=(byte)0xFF) {						imgNum=gda.mapData[bi+i][7];						//System.out.println("count:"+bi+" bx:"+bx);						imgY=gda.manBeginY-mansPos[0][0]+5;						g.setClip(i*stepW-bx,imgY,picsPos[imgNum][3],picsPos[imgNum][4]);						g.drawImage(midPic,i*stepW-picsPos[imgNum][1]-bx,imgY-picsPos[imgNum][2],									Graphics.TOP|Graphics.LEFT);					}					//////////////////////////////////画掉落的机关					if(gda.mapData[bi+i][3]!=(byte)0xFF) {						imgY=gda.mapData[bi+i][4];						boolean sb=gda.checkStone(bi+i,imgY);						if(sb) {							imgNum=28;						} else {							imgNum=gda.mapData[bi+i][3];						}												gda.stoneY=imgY;						g.setClip(i*stepW-bx,gda.stoneY,picsPos[imgNum][3],picsPos[imgNum][4]);						g.drawImage(midPic,i*stepW-picsPos[imgNum][1]-bx,gda.stoneY-picsPos[imgNum][2],									Graphics.TOP|Graphics.LEFT);						if(sb) {							gda.mapData[bi+i][4]=(byte)0xFF;						}					}				}			}			for(i=-20;i<16;i++) {		//画敌人				if(bi+i>=0 && bi+i<gda.colNu) {					if(gda.mapMan[bi+i][0]!=(byte)0xFF) {						imgNum=4+(int)gda.mapMan[bi+i][1];						imgY=(int)gda.mapMan[bi+i][0];						if(gda.mapMan[bi+i][2]==(byte)0x00 && gda.enemyFlashCount%2==0) {							if(gda.enemyFlashCount==6) {								gda.mapMan[bi+i][0]=(byte)0xFF;								gda.mapMan[bi+i][1]=(byte)0xFF;								gda.mapMan[bi+i][2]=(byte)0xFF;							}						} else {							g.setClip(i*stepW-bx,imgY,picsPos[imgNum][3],picsPos[imgNum][4]);							g.drawImage(midPic,i*stepW-picsPos[imgNum][1]-bx,imgY-picsPos[imgNum][2],										Graphics.TOP|Graphics.LEFT);							if(gda.enemyFire && imgY>=30) {								//System.out.println("enemy fire!!");								imgX=i*stepW+bx;								Bullet tbt=null;								////////////////////////////////让敌人转身面对主角								if((blackMan.posX+blackMan.mapPosX)/stepW>bi+i) {									gda.mapMan[bi+i][1]=(byte)0x00;								} else {									gda.mapMan[bi+i][1]=(byte)0x01;								}								if(imgNum==4) {									tbt=new Bullet(imgX+12,imgY+3);									tbt.direction=true;								} else {									tbt=new Bullet(imgX,imgY+3);									tbt.direction=false;								}															tbt.age=16;								tbt.owner=1;															gda.register(tbt);														}						}					}				}			}			gda.enemyFire=false;			/////////画飞行的子弹			for(i=0;i<20;i++) {				if(gda.blts[i].age>0) {					if(gda.blts[i].direction) {				//向右开枪						//g.setColor(0x00ff0000);						g.setClip(gda.blts[i].posX,gda.blts[i].posY,4,2);						g.drawImage(midPic,gda.blts[i].posX-mansPos[14][0],gda.blts[i].posY-mansPos[14][1],Graphics.TOP|Graphics.LEFT);					} else {						g.setClip(gda.blts[i].posX,gda.blts[i].posY,4,2);						g.drawImage(midPic,gda.blts[i].posX-mansPos[15][0],gda.blts[i].posY-mansPos[15][1],Graphics.TOP|Graphics.LEFT);						//g.setColor(0x0000ff00);					}				}			}			//			imgNum=blackMan.status;			if(blackMan.visible) {				if(imgNum==12) {					g.setClip(blackMan.posX-6,gda.manBeginY-mansPos[imgNum][3],mansPos[imgNum][2],mansPos[imgNum][3]);					g.drawImage(midPic,blackMan.posX-mansPos[imgNum][0]-6,gda.manBeginY-mansPos[imgNum][3]-mansPos[imgNum][1],									Graphics.TOP|Graphics.LEFT);				}				else if(imgNum==6 || imgNum==13) {					g.setClip(blackMan.posX,gda.manBeginY-mansPos[imgNum][3]+5,mansPos[imgNum][2],mansPos[imgNum][3]);					g.drawImage(midPic,blackMan.posX-mansPos[imgNum][0],gda.manBeginY-mansPos[imgNum][3]-mansPos[imgNum][1]+5,									Graphics.TOP|Graphics.LEFT);				}				else if(imgNum==10) {					g.setClip(blackMan.posX-stepW,gda.manBeginY-mansPos[imgNum][3],mansPos[imgNum][2],mansPos[imgNum][3]);					g.drawImage(midPic,blackMan.posX-mansPos[imgNum][0]-stepW,gda.manBeginY-mansPos[imgNum][3]-mansPos[imgNum][1],									Graphics.TOP|Graphics.LEFT);				} else {					g.setClip(blackMan.posX,gda.manBeginY-mansPos[imgNum][3],mansPos[imgNum][2],mansPos[imgNum][3]);					g.drawImage(midPic,blackMan.posX-mansPos[imgNum][0],gda.manBeginY-mansPos[imgNum][3]-mansPos[imgNum][1],									Graphics.TOP|Graphics.LEFT);				}			}			if(imgNum==5) {				//主角拆完弹把手缩回				blackMan.status=4;			}			if(imgNum==12) {				blackMan.status=11;			}			for(i=-20;i<26;i++) {			//上层的景物				if(bi+i>=0 && bi+i<gda.colNu) {										/////////////////画炸弹					if(gda.mapData[bi+i][5]!=(byte)0xFF) {						if((gda.bombing && bi+i==gda.bombingNu) || gda.bombStatus[bi+i]==101) {							//PlaySound.bomb();

⌨️ 快捷键说明

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