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

📄 a.java

📁 自己做的一个推箱子
💻 JAVA
字号:
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Canvas;
import java.util.Random;

public class a extends Canvas implements Runnable
{
	private int state;//游戏状态
	private final int AAA=10;
	private final int LOGO=14;
	private final int Menu=11;
	private final int Play=12;
	private final int Puase=13;
	private final int GameOver = 15;
	private int init;//初始化状态
	private final int Logo=20;
	private final int menu=21;
	private final int play=22;
	private Image image[];

	private long firstTime;
	Graphics g0;//双缓冲画笔
	Image myback;
	private int k;
	main a;
	Thread t;
	private int f_m;//菜单选择帧
	/*************人物***************/
	private int cx;
	private int cy;
	private int f_n_x;
	private int f_n_y;
	private int n_npcstate;//未碰撞人物状态
	private int y_npcstate;//碰撞人物状态
	private final int s=30;
	private final int j=31;
	private final int l_w=32;
	private final int r_w=33;
	private final int G=1;
	private int speed;
	private int speed_w;
	/*************箱子***************/
	private int box_state;
	private int box[][];
	private int point;//得分
	Random r;


	public a(main a)
	{
		setFullScreenMode(true);
		this.a=a;
		image=new Image[4];
		state=AAA;
		init = Logo;
		t=new Thread(this);
		t.start();
		r=new Random();
		box = new int[60][4];
	}
	public void aaa()//初始化游戏资源
	{
		myback = Image.createImage(getWidth(), getHeight());
		g0 = myback.getGraphics();
		switch(init)
		{
			case Logo:
				image[0]=loadImage("/cmcc.png");
				image[1] = loadImage("/bbox50.png");
				state=LOGO;
				break;
			case menu:
				clear();
				f_m=0;
				image[0] = loadImage("/stroe.png");//背景
				image[1] = loadImage("/zi.png");//标题
				image[2] = loadImage("/mainword.png");//菜单
				state = Menu;
				break;
			case play:
				clear();
				image[0] = loadImage("/man.png");//人物
				image[1] = loadImage("/box.png");//箱子
				image[2] = loadImage("/boxPO.png");//破箱子
				image[3] = loadImage("/GameOver.png");//结束
				cx=(getWidth()-image[0].getWidth()/4)/2;
				cy=getHeight()-image[0].getHeight()/5;
				for(int i=0;i<box.length;i++)
				{
					box[i][0] = 180;//0表示box的X坐标
					box[i][1] = 78;//1表示box的Y坐标
					box[i][2] = 0;//0表示不出现,1表示出现
				}
				f_n_x=3;
				f_n_y=3;
				speed = -8;
				speed_w = 3;
				box_state = 1;
				n_npcstate=s;
				state=Play;
				break;
		}
	}
	/************进入游戏***********/
	public void logo1()
	{
		Clcd();
		g0.drawImage(image[0],(getWidth() - image[0].getWidth()) / 2, (getHeight() - image[0].getHeight()) / 2,0);
		repaint();
		sleep(1000);
	}
	public void logo2()
	{
		Clcd();
		g0.drawImage(image[1],(getWidth() - image[1].getWidth()) / 2, (getHeight() - image[1].getHeight()) / 2,0);
		repaint();
		sleep(1000);
	}
	public void drawmenu()//菜单绘制
	{
		Clcd();
		g0.drawImage(image[0], 0, 0, 0);
		g0.drawImage(image[1],(getWidth()-image[1].getWidth())/2,image[1].getHeight(),0);
		g0.setColor(255,255,255);
		g0.drawRect((getWidth() - image[2].getWidth()) / 2 -6, (getHeight() - image[2].getHeight()) / 2 - 6, image[2].getWidth() + 9, image[2].getHeight() + 9);
		g0.setColor(0x00225599);
		g0.fillRect((getWidth()-image[2].getWidth())/2-5,(getHeight()-image[2].getHeight())/2-5,image[2].getWidth()+8,image[2].getHeight()+8);
		g0.drawImage(image[2], image[2].getWidth(), image[2].getHeight(),0);
		g0.setColor(255,0,0);
		g0.drawRect(image[2].getWidth()-1, (image[2].getHeight()-1)+f_m*(image[2].getHeight()/5), image[2].getWidth()+2, (image[2].getHeight()+2)/5);
		repaint();
	}
	public void ctrMenu()//菜单控制
	{
		if(k==0)
			return;
		if(up())
		{
			if(f_m==0)
			{
				f_m=4;
			}
			else
			{
				f_m--;
			}
		}
		else if(down())
		{
			if(f_m==4)
			{
				f_m=0;
			}
			else
			{
				f_m++;
			}
		}
		else if(fire())
		{
			if(f_m==0)
			{
				init=play;
				state=AAA;
			}else if(f_m==4)
			{
				a.destroyApp(true);
			}
		}
		k=0;
	}
	/************游戏界面***********/
	public void drawplay()
	{
		Clcd();
		g0.setColor(0,0,255);
		g0.fillRect(0,0,getWidth(),78);
		g0.setColor(0x88AAAAAA);
		g0.fillRect(0,78,getWidth(),142);
		g0.setClip(cx,cy,image[0].getWidth()/4,image[0].getHeight()/5);
		g0.drawImage(image[0],cx-image[0].getWidth()/4*f_n_x,cy-image[0].getHeight()/5*f_n_y,0);
		g0.setClip(0,0,getWidth(),getHeight());
		for (int i = 0; i < box.length; i++)
		{
			if (box[i][2] == 1)
			{
				g0.drawImage(image[1], box[i][0], box[i][1], 0);
			}
		}
		repaint();
	}
	public void drawOver()
	{
		g0.setColor(0);
		g0.fillRect(0,0,getWidth(),getHeight());
		g0.drawImage(image[3],(getWidth()-image[3].getWidth())/2,(getHeight()-image[3].getHeight())/2,0);
	}
	public void boxMove()//箱子运动状态
	{
		int Rad;
		long lastTime=System.currentTimeMillis();
		if(lastTime-firstTime>3000)//每固定时间出现一个箱子
		{
			Rad = (r.nextInt() >>> 1) % 162;
			firstTime=System.currentTimeMillis();
			for (int i = 0; i < box.length; i++)
			{
				if (box[i][2] == 0)
				{
					box[i][2] = 1;
					box[i][3] = Rad;
					break;
				}
			}
		}
		for (int i = 0; i < box.length; i++)//遍厉数组
		{
			if (box[i][2] == 1)//寻找出现状态的箱子
			{
				if (box[i][0] > -18 && box[i][0] != box[i][3])
				{
					box[i][0]--;
				}
				if (box[i][0] == box[i][3])
				{
					if (box[i][1] < getHeight() - 18)
					{
						box[i][1] += 2;
					}
				}
				repaint();
			}
		}
	}
	public void n_npc_state()//未碰撞游戏角色状态
	{
		if (speed > -8)
		{
			n_npcstate = j;
		}
		switch(n_npcstate)
		{
			case s:///////////////////站立
				f_n_x=3;
				f_n_y=3;
				break;
			case j:///////////////////跳跃
				if (speed>-8&&cy == getHeight() - image[0].getHeight() / 5)
				{
					speed = -8;
					n_npcstate = s;
				}
				else
				{
					speed += G;
					cy += speed;
					if (speed <= 0)
					{
						f_n_x = 0;
					}
					else if (speed > 0)
					{
						f_n_x = 1;
					}
				}
				break;
			case l_w://///////////////左走
				if (k == 0)
				{
					n_npcstate = s;
					return;
				}
				f_n_y = 0;
				if (f_n_x == 3)
				{
					f_n_x = 0;
				}
				else
				{
					f_n_x++;
				}
				if (cx > 0)
				{
					cx -= speed_w;
				}
				break;
			case r_w://///////////////右走
				if (k == 0)
				{
					n_npcstate = s;
					return;
				}
				f_n_y = 1;
				if (f_n_x == 3)
				{
					f_n_x = 0;
				}
				else
				{
					f_n_x++;
				}
				if (cx < getWidth() - image[0].getWidth()/4)
				{
					cx += speed_w;
				}
				break;
		}
	}
	public void n_ctrplay()//未碰撞控制
	{
		if(k==0)
			return;
		if(up())
		{
			n_npcstate = j;
		}
		else if (left())
		{
			if (speed > -8)
			{
				f_n_y = 2;
				if (cx > 0)
				{
					cx -= speed_w;
				}
			}
			else
			{
				n_npcstate = l_w;
			}
		}
		else if (right())
		{
			if (speed > -8)
			{
				f_n_y = 4;
				if (cx < getWidth() - image[0].getWidth() / 4)
				{
					cx += speed_w;
				}
			}
			else
			{
				n_npcstate = r_w;
			}
		}
	}
	public void y_npc_state()//碰撞状态
	{
		switch (y_npcstate)
		{ 
			case 1://箱子顶烂状态

				break;
		}
	}
	public void ccc()//碰撞判断
	{
		for (int i = 0; i < 60; i++)
		{
			if(cx<box[i][0])
			{
				if (top1_isIntersectingLine(cx, cy, image[0].getWidth() / 4,box[i][0], box[i][1] + 18, 18 ))
				{
					if (speed > -8 && speed < 0)
					{
						box[i][2] = 0;
						y_npcstate = 1;
						y_npc_state();
					}
					else
					{
						state = GameOver;
						step();
					}
				}
			}
			else if (cx >= box[i][0])
			{
				if (top2_isIntersectingLine(cx, cy, image[0].getWidth() / 4,box[i][0], box[i][1] + 18, 18 ))
				{
					if (speed > -8 && speed < 0)
					{
						box[i][2] = 0;
						y_npcstate = 1;
						y_npc_state();
					}
					else
					{
						state = GameOver;
						step();
					}
				}
			}
			if (l1_isIntersectingLine(cx, cy, image[0].getHeight() / 5, box[i][0], box[i][1], 18))
			{
				if (box[i][0] > 0)
				{
					speed_w = 2;
					y_npcstate = 2;
				}
				else 
				{
					speed_w = 0;
				}
			}
			//if (top_isIntersectingLine(box[i][0], box[i][1], 18,box[i][0], box[i][1], 18))//箱子和箱子
			//{ }
		}
	}
	public void step()//游戏状态
	{
		switch(state)
		{
			case AAA:
				aaa();
				break;
			case LOGO:
				logo1();
				logo2();
				init=menu;
				state = AAA;
				break;
			case Menu:
				ctrMenu();
				drawmenu();
				break;
			case Play:
				ccc();
				boxMove();
				n_ctrplay();
				n_npc_state();
				drawplay();
				break;
			case Puase:

				break;
			case GameOver:
				for (int i = 0; i <= getWidth(); i ++)
				{
					g0.setClip(0, 0, i, getHeight());
					drawOver();
					repaint();
				}
				break;
		}
	}
	public void run()//线程
	{
		while(true)
		{
			step();
			try
			{
				Thread.sleep(60);
			}catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	/*********将缓冲图片绘制在桌面********/
	public void paint(Graphics g)
	{
		g.drawImage(myback, 0, 0, 0);
	}
	/***************工具***************/
	protected void keyPressed(int keyCode)
	{
		k = keyCode;
	}
	protected void keyReleased(int keyCode)
	{
		k = 0;
	}
	public boolean left()
	{
		if(LEFT==getGameAction(k))
			return true;
		return false;
	}
	public boolean right()
	{
		if(RIGHT==getGameAction(k))
			return true;
		return false;
	}
	public boolean fire()
	{
		if(FIRE==getGameAction(k))
			return true;
		return false;
	}
	public boolean up()
	{
		if(UP==getGameAction(k))
			return true;
		return false;
	}
	public boolean down()
	{
		if(DOWN==getGameAction(k))
			return true;
		return false;
	}
	public void Clcd()//清屏
	{
		g0.setColor(255, 255, 255);
		g0.fillRect(0,0,getWidth(),getHeight());
	}
	/*************线程睡眠**************/
	protected void sleep(long l)
	{
		if (l <= 0)
			return;

		try
		{
			Thread.sleep(l);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	/*************导入图片**************/
	protected Image loadImage(String str)
	{
		Image image = null;
		try
		{
			image = Image.createImage(str);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			return image;
		}
	}
	public void clear()//数组清空
	{
		for (int i = 0; i < image.length; i++)
		{
			if (image[i] != null)
			{
				image[i] = null;
			}
		}
		System.gc();
	}
	/*************碰撞检测**************/
	public static final boolean top1_isIntersectingLine(int ax, int ay, int aw, int bx, int by, int bw)//底与上碰撞,a在b前
	{
		if (((bx+bw)-ax)<34 && Math.abs(ay - by) < 2)
			return true;
		return false;
	}
	public static final boolean top2_isIntersectingLine(int ax, int ay, int aw, int bx, int by, int bw)//底与上碰撞,a在b后
	{
		if (((ax + aw) - bx) < 34 && Math.abs(ay - by) < 2)
			return true;
		return false;
	}
	public static final boolean l1_isIntersectingLine(int ax, int ay, int ah, int bx, int by, int bh)//边碰撞,a在b后
	{
		if (by-(ay+ah)< 34 && Math.abs(ax - bx) < 2)
			return true;
		return false;
	}
	public static final boolean l2_isIntersectingLine(int ax, int ay, int ah, int bx, int by, int bh)//边碰撞,a在b前
	{
		if (ay - (by + bh) < 34 && Math.abs(bx - ax) < 2)
			return true;
		return false;
	}
}

⌨️ 快捷键说明

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