用java awt跟着b站黑马程序员写的
简易d球游戏: d球游戏代码:package myAwt.myDraw; import javax.swing.*; import java.awt.*; import java.awt.event.*; //d球游戏 public class PinBall { //创建窗口对象 private frame frame = new frame("d球游戏"); //桌面高度 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 = 10; private int speedY = 5; //记录球拍的坐标 private int racketX = 120; private final int racketY = 340; //记录当前游戏是否已经结束 private boolean isOver = false; //声明一个定时器 private Timer timer; //定义一个类,继承canvas,充当画布 private class MyCanvas extends Canvas { @Override public void paint(Graphics g) { if (isOver) { //游戏结束 g.setColor(Color.BLUE); g.setFont(new Font("Times", Font.BOLD, 30)); g.drawString("GAME OVER!", 50, 200); } else { //游戏中 //绘制小球 g.setColor(Color.RED); g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE); //绘制球拍 g.setColor(Color.PINK); g.fillRect(racketX, racketY, RACKET_WIDTH, RACKET_HEIGHT); } } } //创建绘图区域 MyCanvas drawArea = new MyCanvas(); public void init() { //点叉号时关闭程序 frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); //组装视图,游戏逻辑控制 //完成球拍坐标的变化 KeyListener listener = new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { //获取当前按下的键 int keyCode = e.getKeyCode(); if (keyCode == KeyEvent.VK_LEFT) { //<- 向左移 if (racketX > 0) { racketX -= 10; } } if (keyCode == KeyEvent.VK_RIGHT) { //-> 向右移 if (racketX < TABLE_WIDTH - RACKET_WIDTH) { racketX += 10; } } } }; //给frame和drawArea注册监听器 frame.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(100, task); timer.start(); drawArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT)); frame.add(drawArea); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new PinBall().init(); } }简易绘图程序(鼠标右键选择颜色):
绘图程序代码:
package myAwt.myDraw; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; public class HandDrawDemo { private frame frame = new frame("简单手绘程序"); //定义画图区的宽高 private final int AREA_WIDTH = 500; private final int AREA_HEIGHT = 400; private PopupMenu colorMenu = new PopupMenu(); private MenuItem redItem = new MenuItem("red"); private MenuItem greenItem = new MenuItem("green"); private MenuItem blueItem = new MenuItem("blue"); private Color forceColor = Color.BLACK; BufferedImage image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); private class MyCanvas extends Canvas { @Override public void paint(Graphics g) { g.drawImage(image, 0, 0, null); } } MyCanvas drawArea = new MyCanvas(); //记录鼠标拖动过程中,上一次所处的坐标 private int preX = -1; private int preY = -1; public void init() { frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String actionCommand = e.getActionCommand(); switch (actionCommand) { case "red": forceColor = Color.RED; break; case "green": forceColor = Color.GREEN; break; case "blue": forceColor = Color.BLUE; break; } } }; redItem.addActionListener(listener); greenItem.addActionListener(listener); blueItem.addActionListener(listener); colorMenu.add(redItem); colorMenu.add(greenItem); colorMenu.add(blueItem); drawArea.add(colorMenu); drawArea.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { boolean popupTrigger = e.isPopupTrigger(); if (popupTrigger) { colorMenu.show(drawArea, e.getX(), e.getY()); } //重置prex和prey preX = -1; preY = -1; } }); //设置位图的背景为白色 g.setColor(Color.WHITE); g.fillRect(0, 0, AREA_WIDTH, AREA_HEIGHT); //监听鼠标的移动,完成线条绘制 drawArea.addMouseMotionListener(new MouseMotionAdapter() { //当鼠标左键按下,并进行拖动,会被调用 @Override public void mouseDragged(MouseEvent e) { if (preX > 0 && preY > 0) { g.setColor(forceColor); //画线条,要两组坐标,分别代表线条的起点和终点 g.drawLine(preX, preY, e.getX(), e.getY()); } //修正prex和prey preX = e.getX(); preY = e.getY(); //重绘组件 drawArea.repaint(); } }); drawArea.setPreferredSize(new Dimension(AREA_WIDTH, AREA_HEIGHT)); frame.add(drawArea); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new HandDrawDemo().init(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)