📄 mappanel.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 + -