java AWT 绘图,实现弹球游戏,有实现keylistener,timer功能

来源:互联网 发布:淘宝助理百世快递模板 编辑:程序博客网 时间:2024/06/06 20:43

Timer(int delay, ActionListener listener):每间隔delay毫秒,系统自动触发ActionListener监听器里的事件处理器(actionPerformed()方法)。

package javaAWT;import java.awt.Canvas;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.Frame;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.util.Random;import javax.swing.Timer;public class PinBall {    // 桌面大小    private final int TABLE_WIDTH = 300;    private final int TABLE_HEIGHT = 400;    // 球拍的垂直位置     private final int RACKEY_Y = 340;    // 球拍大小    private final int RACKET_HEIGHT = 20;    private final int RACKET_WIDTH = 60;    // 球大小    private final int BALL_SIZE = 16;    private Frame frame = new Frame("PinBall");    Random random = new Random();    // 小球纵向运行速度    private int ySpeed = 10;    // 返回一个-0.5~0.5的比率,用于控制小球 的运行方向    private double xyRate = random.nextDouble() - 0.5;    // 小球的横向运行速度    private int xSpeed = (int)(ySpeed * xyRate *2);    // 小球的坐标    private int ballX = random.nextInt(200) + 20;    private int ballY = random.nextInt(10) + 20;    // 球拍的水平位置     private int racketX = random.nextInt(200);    private MyCanvas tableArea = new MyCanvas();    Timer timer;    // 游戏结束标志    private boolean isLose = false;    public void init() {        // 设置桌面区域的最佳大小        tableArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));        frame.add(tableArea);        // 定义键盘监听器        KeyAdapter keyProcessor = new KeyAdapter() {            @Override            public void keyPressed(KeyEvent e) {                // TODO Auto-generated method stub                super.keyPressed(e);                // 按下向左,向右键时,球拍左右称动                if (e.getKeyCode() == KeyEvent.VK_LEFT) {                    if (racketX > 0)                         racketX -= 10;                }                if (e.getKeyCode() == KeyEvent.VK_RIGHT) {                    if (racketX < TABLE_WIDTH - RACKET_WIDTH)                         racketX += 10;                }            }        };        // 为窗口和tableArea对象分别添加键盘监听器        frame.addKeyListener(keyProcessor);        tableArea.addKeyListener(keyProcessor);        // 定义每0.1秒执行一次的事件监听器        ActionListener taskPerformer = new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                // TODO Auto-generated method stub                // 如果小球碰到左边框                 if (ballX <= 0 || ballX >= TABLE_WIDTH - BALL_SIZE) {                    xSpeed = -xSpeed;                }                // 如果小球高度超过球拍的位置 ,且横向不在球拍范围内,游戏结束。                if (ballY >= RACKEY_Y - BALL_SIZE &&                         (ballY < racketX || ballX > racketX + RACKET_WIDTH)) {                    timer.stop();                    isLose = true;                    tableArea.repaint();                }                // 如里小球位于球拍之内,且到达球拍的位置,小球反弹                else if (ballY <= 0 || (ballY >= RACKEY_Y - BALL_SIZE                        && ballX > racketX && ballX <= racketX + RACKET_WIDTH)) {                    ySpeed = - ySpeed;                }                // 小球坐标增加                ballY += ySpeed;                ballX += xSpeed;                tableArea.repaint();                }        };        timer = new Timer(100, taskPerformer);        timer.start();        frame.pack();        frame.setVisible(true);    }    class MyCanvas extends Canvas {        @Override        public void paint(Graphics g) {            // TODO Auto-generated method stub            super.paint(g);            // 如果游戏已结整             if (isLose) {                g.setColor(new Color(255, 0, 0));                g.setFont(new Font("Times", Font.BOLD, 30));                g.drawString("Game Over!", 50, 200);            }            // 如果游戏未结整             else {                // 设置颜色,并绘制小不球                 g.setColor(new Color(240, 240, 80));                g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);                // 设置颜色,并绘制球拍                g.setColor(new Color(80, 80, 200));                g.fillRect(racketX, RACKEY_Y, RACKET_HEIGHT, RACKET_HEIGHT);            }        }    }    public static void main(String[] args) {        new PinBall().init();    }}

这里写图片描述
这里写图片描述