小游戏
边界检测,事件监听。
源码
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class XiaoGame {
//背景图片
private BufferedImage background;
private BufferedImage gameOver;
private JFrame game = new JFrame("小游戏");
//窗口大小
private final int GAME_SIZE_X = 1067;
private final int GAME_SIZE_Y = 600;
//小球直径
private final int QIU_SIZE = 20;
//球拍大小
private final int QIU_PAI_SIZE_X = 40;
private final int QIU_PAI_SIZE_Y = 20;
//小球速度
private int speedX = 10;
private int speedY = 10;
//小球坐标
private int qiuX = 100;
private int qiuY = 10;
//球拍坐标
private int qiuPaiX = 300;
private final int qiuPaiY = 500;
//游戏是否继续
private boolean isOver = false;
//时间计时
private Timer timer;
//画板
private class MyHuaBu extends JPanel{
@Override
public void paintComponent(Graphics g) {
//清除之前绘制的,重新绘制
super.paintComponent(g);
//判断游戏是否结束
if(isOver){
//游戏结束,画出游戏结束
g.drawImage(gameOver, 300,150 ,gameOver.getWidth(),gameOver.getHeight(),null );
}
else{
//绘制背景
g.drawImage(background, 0,0 ,getWidth(),getHeight(),null );
//游戏继续
//画小球
g.setColor(Color.RED);
g.fillOval(qiuX,qiuY,QIU_SIZE,QIU_SIZE);
//画球拍
g.setColor(Color.BLACK);
g.fillRect(qiuPaiX,qiuPaiY,QIU_PAI_SIZE_X,QIU_PAI_SIZE_Y);
}
}
}
//创建画布对象
private MyHuaBu drawArea = new MyHuaBu();
//监听球拍移动
KeyListener keyListener = new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_LEFT){
//左箭头
if(qiuPaiX > 0)//球拍没到到左边界
qiuPaiX = qiuPaiX - 10;
}
if(keyCode == KeyEvent.VK_RIGHT){
if(qiuPaiX < (GAME_SIZE_X - QIU_PAI_SIZE_X))//球拍没到右边界
qiuPaiX = qiuPaiX + 10;
}
}
};
//时间监听并重绘(每隔一定时间更新小球坐标及小球速度)
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//小球坐标
if(qiuX <= 0 || qiuX >= (GAME_SIZE_X - QIU_SIZE))
speedX = - speedX;
if(qiuY <= 0 || (qiuY >= (qiuPaiY - QIU_SIZE) && qiuX >= qiuPaiX && qiuX <= (qiuPaiX + QIU_PAI_SIZE_X) ))
speedY = -speedY;
if(qiuY > qiuPaiY || (qiuX < qiuPaiX && qiuX > (qiuPaiX + QIU_PAI_SIZE_X))){
isOver = true;
timer.stop();
}
qiuX = qiuX + speedX;
qiuY = qiuY +speedY;
drawArea.repaint();
}
};
public void init(){
try {
background = ImageIO.read(new File("H:\\图片\\主题背景.jpg"));
gameOver = ImageIO.read(new File("C:\\Users\\lenovo\\Desktop\\fail.png"));
} catch (IOException e) {
e.printStackTrace();
}
game.setSize(GAME_SIZE_X,GAME_SIZE_Y);
game.setLocationRelativeTo(null);
game.setResizable(false);
//添加监听器
game.addKeyListener(keyListener);
drawArea.addKeyListener(keyListener);
//时间计时
timer = new Timer(50,listener);
timer.start();
//添加组件
game.add(drawArea);
game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
game.setVisible(true);
}
public static void main(String[] args) {
new XiaoGame().init();
}
}