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

📄 mappanel.java

📁 小游戏--淘金者 主要用到了双缓冲平面作图
💻 JAVA
字号:
package bin;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;

public class MapPanel extends JPanel implements Runnable,KeyListener
{
	/*
	 *关于地图的变量
	 */
	private int      ImageWidth,ImageHeight,ImageX,ImageY;
	private Thread       newThread; 
	private int rotate = 0;
	private Image ground;		//土地	2
	private Image iron;			//铁	4
	private Image ladder;		//梯子	3
	private Image rod;			//竿	5
	private Image area;			//空地	0
	private Image gold;			//金块	1
	private Image gem;			//门	6


	public static final int GAMEUI_HEIGHT = 600;
	public static final int GAMEUI_WIDTH  = 600;
	
	/*
	 *关于人物的变量
	 */
	private char work;
	private int GameX,GameY,GameboyW,GameboyH,groundW,NpcX,NpcY,X,Y,game,over;
	private int GbImageX,GbImageY;
	private Image personality,npcImgLeft,npcImgRight;
	private String switchI;
	private static JLabel labState;
	public static Play play = new Play();
	
	 
	/*
	 *  30行23列
	 *
	 **/	
	 
	/*以二维数组画地图*/
	int[][] map= {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0},
			    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,2,2,2,2,2,2,2},
				{0,0,0,0,1,0,0,0,0,0,1,0,0,3,0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0},
				{0,0,0,2,2,2,2,2,4,4,4,4,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,3,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,3,0,0,0,0,0,0,0,0,2,2,2,2,2,3,0,0,0,0,0,0,1,0,0,0},
				{1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,3,2,2,2,2,2,2,2,2,2,2},
				{4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,1,0,0,0,0,3,1,1,1,1,3,0,0,0,0,0,0,0,1,0,0},
				{0,0,0,0,3,2,2,2,2,2,2,2,2,2,3,0,0,0,0,3,0,1,0,0,3,4,4,4,4,4},
				{1,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,3,2,2,2,2,3,0,0,0,0,0},
				{4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,0,0,0,0,3,0,1,0,0,3,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,3,2,2,2,2,3,0,0,1,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,3,0,1,0,0,3,4,4,4,4,4},
				{0,0,0,0,0,0,0,3,2,2,2,2,2,2,3,2,2,2,2,3,2,2,2,2,3,0,0,0,0,0},
				{0,0,0,0,3,2,2,2,0,0,0,0,0,0,3,0,0,0,0,3,0,0,0,0,3,0,0,0,0,0},
				{3,2,2,2,2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,3,0,1,0,0,3,0,0,1,0,0},	
				{3,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,2,2,2,2,2,3,2,2,2,2,2},
			    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,3,1,0,0,0,0},//改过
				{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
				{4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}};
	
	Gameboy gb;
	NpcAI npcai;
	
	public MapPanel(final JFrame frame)
	{
		try
		{

			area	= ImageIO.read(new File("image\\2.jpg"));	//空	0
			gold	= ImageIO.read(new File("image\\goldAll.gif"));		//金块  1
			ground	= ImageIO.read(new File("image\\ground2.gif"));	//土地	2
			ladder	= ImageIO.read(new File("image\\ladder.gif"));	//梯子	3
			iron	= ImageIO.read(new File("image\\ground.gif"));	//铁	4
			gem     = ImageIO.read(new File("image\\gem.gif"));
			personality = ImageIO.read(new File("image\\character.gif")); //人物
			npcImgLeft = ImageIO.read(new File("image\\chiropterLeft.gif"));
			npcImgRight = ImageIO.read(new File("image\\chiropterRight.gif"));

		}
		catch(IOException exception)
		{
			exception.printStackTrace();
		}
		
		play.muiscPlay();
		groundW = ground.getWidth(this);
		
		GameboyW = personality.getWidth(this)/4;
		GameboyH = personality.getHeight(this)/4;//人物宽高
		GameX = 0;
		GameY = 504;//人物显示坐标
		GbImageX = 0;
		GbImageY = 0;//源图坐标
		
		NpcX = 0;
		NpcY = 0;
		switchI = "Right";
		 
		MediaTracker MT= new MediaTracker(this);
		
		
		MT.addImage(area,0);
		MT.addImage(gold,1);
		MT.addImage(ground,2);
		MT.addImage(ladder,3);
		MT.addImage(iron,4);
		MT.addImage(personality,5);//添加图片
		MT.addImage(gem,6);
      	
      	this.setFocusable(true);
      	
      	addKeyListener(this);
      	
      	gb = new Gameboy(GameX,GameY,GameboyW,GameboyH,map);
      	npcai = new NpcAI(gb);

		
		try
	    {
	    	MT.waitForAll();							 // 开始加载由此媒体跟踪器跟踪的所有图像。
	    }
	    catch(InterruptedException E){ }
	
      	newThread = new Thread(this);
      	newThread.start();//启动线程
      	
      	this.setLayout(null);
      	
      	Icon iconState=new ImageIcon("image//state1.gif");
      	labState=new JLabel(iconState);
      	labState.setBounds(550,535,30,30);
      	Border bord = BorderFactory.createEtchedBorder(BevelBorder.LOWERED,Color.BLACK,Color.BLACK);
      	labState.setBorder(bord);
      	labState.setBackground(Color.ORANGE);
		this.add(labState);
		
		final JLabel rectangle=new JLabel();
	  	Border bord1 = BorderFactory.createEtchedBorder(BevelBorder.LOWERED,Color.GREEN,Color.CYAN);
	  	rectangle.setBorder(bord1 );
	   	rectangle.setBounds(545,530,40,40);
	   	rectangle.setBackground(Color.BLACK);
	   	rectangle.setVisible(false);
     	this.add(rectangle);
               	
		labState.addMouseListener(new 
     		MouseAdapter(){
     		public void mouseClicked(MouseEvent e) {
				StateFrame.createFrmState(frame);
				labState.setVisible(false);
			}
			
			public void mouseEntered(MouseEvent e) {
				rectangle.setVisible(true);
			}
	
			public void mouseExited(MouseEvent e) {
				rectangle.setVisible(false);	
			
			}  
	         
     		
     		
     		
     		});	
     
		
	}
	public static void setLabState(boolean bool)
	{
		labState.setVisible(bool);
	}
	
	public void run()
   	{
   		
   		while(true){
   			if(rotate==4 || GbImageX == 60)//判断截图源图坐标是否超限
   			{
   				rotate = 0;
   				GbImageX = 0;
   			}
   			
   			if(X == 60)
            {
                Y += 24;
                X = 0;
                if(Y > 24)
                {
                    Y = 0;
                }
            }
   			GbImageX += 20;//源图坐标增加
   			rotate++;
   			X += 20;
   			this.NpcX = npcai.npcX;
   			this.NpcY = npcai.npcY;
			repaint();
			this.switchI = npcai.switchImage;
			this.game = gb.game;
			this.over = npcai.over;
			
			if (this.game == 1 || this.over == 1)
			{					
				this.game = 2;
				this.over = 2;
				try                            //以下对人物死亡的处理
				{
					Thread.sleep(1000);
	
					this.setVisible(false);
					play.muiscStop();
					TaxisFrame.start();
					
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
				break;
			}
			
			if (Gameboy.gold == 0)
			{
				try
				{
					Thread.sleep(1000);
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
				map[6][25] = 6;
				Gameboy.gold = 10;
			}
			try{
				Thread.sleep(150);//休眠0.15秒
			}catch(Exception e){
				e.printStackTrace();
			}
   		}
   	}
	
	public void paintComponent(Graphics g)
	{	
		super.paintComponent(g);
		if(gold==null) 
		{return;}
		final int imageWidth  = 20;
		final int imageHeight = 24;
		 
		 
		g.drawImage(area,0,0,600,600,this);
		
		int x=20,y=24;
		
		for(int i=0; i <24; i++)   //地板不能超过窗体的大小
		{
		 	for(int j=0; j <30; j++)	 //用源矩形绘制目标矩形,并通知this
		 	{
		 		if(map[i][j] == 1){
   					
   					if(rotate==1)
   					g.drawImage(gold,j*imageWidth,i*imageHeight,(j+1)*imageWidth,(i+1)*imageHeight,
				                 0,0,20,24,this);		 	 		
		 			if(rotate==2)
		 			g.drawImage(gold,j*imageWidth,i*imageHeight,(j+1)*imageWidth,(i+1)*imageHeight,
				                 21,0,40,24,this);
					if(rotate==3)
					g.drawImage(gold,j*imageWidth,i*imageHeight,(j+1)*imageWidth,(i+1)*imageHeight,
				                 0,24,20,48,this);
					if(rotate==4)
					g.drawImage(gold,j*imageWidth,i*imageHeight,(j+1)*imageWidth,(i+1)*imageHeight,
				                 20,24,40,48,this);	
   				}	
   				/*
   				 *绘制地图
   				 */	 
		 										 
			   if(map[i][j] == 2)
				{
					//g.drawImage()
					g.drawImage(ground,j*imageWidth,i*imageHeight,(j+1)*imageWidth,(i+1)*imageHeight,
				                 0,0,imageWidth,imageHeight,this);
				}   	 
				else if(map[i][j] == 3) 
				{
					g.drawImage(ladder,j*imageWidth,i*imageHeight,(j+1)*imageWidth,(i+1)*imageHeight,
				                 0,0,imageWidth,imageHeight,this);
				} 	 
				else if(map[i][j] == 4) 	
				{
					g.drawImage(iron,j*imageWidth,i*imageHeight,(j+1)*imageWidth,(i+1)*imageHeight,
				    			 0,0,imageWidth,imageHeight,this);
				}
				else if(map[i][j] == 5) 	
				{
					g.drawImage(rod,j*imageWidth,i*imageHeight,(j+1)*imageWidth,(i+1)*imageHeight,
				    			 0,0,imageWidth,imageHeight,this);
				} 
				
				else if(map[i][j] == 6)
				{
					g.drawImage(gem,j*imageWidth,i*imageHeight,(j+1)*imageWidth,(i+1)*imageHeight,
				    			 0,0,imageWidth,imageHeight,this);
				}
			}
		 }
		
		/*
		 *绘制人物
		 */
		if (work == 'U')
		{
			g.drawImage(personality,gb.GameboyX,gb.GameboyY,gb.GameboyX+GameboyW,
						gb.GameboyY+GameboyH,GbImageX,GbImageY,GbImageX+GameboyW
						,GbImageY+GameboyH,this);
		}
		
		else if (work == 'D')
		{
			g.drawImage(personality,gb.GameboyX,gb.GameboyY,gb.GameboyX+GameboyW,
						gb.GameboyY+GameboyH,GbImageX,GbImageY+GameboyH*2,
						GbImageX+GameboyW,GbImageY+GameboyH*3,this);
		}
		
		else if (work == 'L')
		{
			g.drawImage(personality,gb.GameboyX,gb.GameboyY,gb.GameboyX+GameboyW,
						gb.GameboyY+GameboyH,GbImageX,GbImageY+GameboyH*3,
						GbImageX+GameboyW,GbImageY+GameboyH*4,this);
		}
		
		else if (work == 'R')
		{
			g.drawImage(personality,gb.GameboyX,gb.GameboyY,gb.GameboyX+GameboyW,
						gb.GameboyY+GameboyH,GbImageX,GbImageY+GameboyH,
						GbImageX+GameboyW,GbImageY+GameboyH*2,this);
		}
		else
		{
			g.drawImage(personality,gb.GameboyX,gb.GameboyY,gb.GameboyX+GameboyW,
						gb.GameboyY+GameboyH,GbImageX,GbImageY+GameboyH*2,
						GbImageX+GameboyW,GbImageY+GameboyH*3,this);
		}
		
		/*
		 *绘制怪物
		 */
		 try
		 {
			 if (switchI.equals("Right"))
			 {
			 	g.drawImage(npcImgRight, NpcX, NpcY, NpcX+20, NpcY+24, X, Y, X + 20, 
			 				Y + 24, this);
			 }
		 
			 else if (switchI.equals("Left"))
			 {
			 	g.drawImage(npcImgLeft, NpcX, NpcY, NpcX+20, NpcY+24, X, Y, X + 20,
			 				 Y + 24, this);
			 }
		 }
		 catch (Exception e) { }
	}
	
	/*
	 *监听键盘事件 
	 *并给不同的键赋值
	 */
	public void keyReleased(KeyEvent e) 
	{
		int key = e.getKeyCode(); 
		
		if (key == KeyEvent.VK_UP)
		{
			work = 'U';
			gb.workup();
		}
		
		else if (key == KeyEvent.VK_DOWN)
		{
			work = 'D';
			gb.workdown();
		}
		
		else if (key == KeyEvent.VK_LEFT)
		{
			work = 'L';
			gb.workleft();
		}
		
		else if (key == KeyEvent.VK_RIGHT)
		{
			work = 'R';
			gb.workright();
		}
		
		else if (key == KeyEvent.VK_Z)
		{
			work = 'Z';
			gb.workdiglift();
		}
		
		else if (key == KeyEvent.VK_C)
		{
			work = 'C';
			gb.workdigright();
		}
	}
	
	public void keyTyped(KeyEvent e){}
	   
	public void keyPressed(KeyEvent e){}
}

⌨️ 快捷键说明

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