图形化界面的简单应用
先看效果
java小游戏推球球
代码如下
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class PinBall {
JFrame f = new JFrame("弹球小游戏");
//桌面的高度和宽度
private final int Table_Width = 300;
private final int Table_Height = 400;
//球拍的宽度和高度
private final int Racket_width = 60;
private final int Racket_Height = 20;
//小球的尺寸
private final int Ball_Size = 16;
//定义变量,记录小球的坐标
private int ballX = 120;
private int ballY = 20;
//定义变量,记录小球在x和y轴方向上移动的速度
private int speedX = 8;
private int speedY = 4;
//记录球拍的坐标
private int racketX = 120;
private final int racketY = 340;
//标识当前游戏是否结束
private boolean isOver = false;
//声明一个定时器
private Timer timer;
//自定义一个类,继承canvas,充当画布
private class MyCanvas extends Canvas{
//重写paint方法
public void paint(Graphics g){
//绘制内容
if(isOver){
//游戏结束
g.setColor(Color.RED);
g.setFont(new Font("Times",Font.BOLD,30));
g.drawString("游戏结束~",60,200);
}else{
//游戏中
//绘制小球
g.setColor(Color.RED);
g.fillOval(ballX,ballY,Ball_Size,Ball_Size);
//绘制球拍
g.fillRect(racketX,racketY,Racket_width,Racket_Height);
}
}
}
//创建绘画区域
MyCanvas drawArea = new MyCanvas();
public void init(){
//组装视图,游戏逻辑的控制
//完成球拍坐标的变化
KeyListener listener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//获取当前按下的键
int Keycode = e.getKeyCode();
if(Keycode == KeyEvent.VK_LEFT){
if(racketX > 0){
racketX -= 15;
}
}
if(Keycode == KeyEvent.VK_RIGHT){
if (racketX < (Table_Width - Racket_width)) {
racketX += 15;
}
}
}
};
//给Frame和drawArea注册监听器
f.addKeyListener(listener);
drawArea.addKeyListener(listener);
//小球坐标的控制
ActionListener task = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//根据边界范围,修正速度
if(ballX <= 0 || ballX >= (Table_Width-Ball_Size)){
speedX = -speedX;
}
if(ballY <= 0 || (ballY > racketY-Ball_Size && ballX > racketX && ballX < racketX+Racket_width)){
speedY = -speedY;
}
//当前小球超出球范围,游戏结束
if(ballY > racketY-Ball_Size && (ballX < racketX || ballX > racketX+Racket_width)){
//停止定时器
timer.stop();
isOver = true;
//重绘界面
drawArea.repaint();
}
//更新小球的坐标,重绘界面
ballX += speedX;
ballY += speedY;
//重绘界面
drawArea.repaint();
}
};
timer = new Timer(40,task);
timer.start();
drawArea.setPreferredSize(new Dimension(Table_Width,Table_Height));
f.setSize(310,410);
f.setLocation(600,300);
f.add(drawArea);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args) {
new PinBall().init();
}
}