球球大作战 JAVA项目 UI类 GameUI​ import javax.swing.*; import java.awt.*; import java.util.ArrayList; public class GameUI { ArrayListPlayer playerList new ArrayList(); GameListener gameListener new GameListener(); KeyBoardListener keyBoardListener new KeyBoardListener(); Player hero; JFrame jf new JFrame(球球大作战); public GameUI() { jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(500, 800); jf.setLocationRelativeTo(null); jf.setVisible(true); jf.addMouseListener(gameListener); jf.addMouseMotionListener(gameListener); gameListener.gameUI this; jf.addKeyListener(keyBoardListener); keyBoardListener.gameUI this; hero new Player(225, 375, 50, 0, 0, new Color(255, 0, 218)); GameLoop gameLoop new GameLoop(this); gameLoop.start(); } public static void main(String[] args) { new GameUI(); } } ​采用传统UI构造方法并创建玩家类hero用start开始线程游戏监听类 Gamelitenerimport java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.Random; public class GameListener implements MouseListener, MouseMotionListener { GameUI gameUI; Override public void mouseDragged(MouseEvent e) { int x e.getX(); int y e.getY(); } Override public void mousePressed(MouseEvent e) { Random random new Random(); int x e.getX(); int y e.getY(); int size random.nextInt(40) 30; int speedx random.nextInt(5) - 2; int speedy random.nextInt(5) - 2; Color color new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)); Player player new Player(x, y, size, speedx, speedy, color); gameUI.playerList.add(player); } Override public void mouseClicked(MouseEvent e) { } Override public void mouseReleased(MouseEvent e) { } Override public void mouseEntered(MouseEvent e) { } Override public void mouseExited(MouseEvent e) { } Override public void mouseMoved(MouseEvent e) { } }监听类继承mouselistener和mousemotionlistener两类重写鼠标点击方法当鼠标按下时随机生成不同大小颜色速度的小球并加入动态列表键盘监听类 KeyBoardListenerimport java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class KeyBoardListener implements KeyListener { GameUI gameUI; // 四个方向标记 public boolean up, down, left, right; Override public void keyPressed(KeyEvent e) { int keyCode e.getKeyCode(); switch (keyCode) { case KeyEvent.VK_UP: up true; break; case KeyEvent.VK_DOWN: down true; break; case KeyEvent.VK_LEFT: left true; break; case KeyEvent.VK_RIGHT: right true; break; } } Override public void keyReleased(KeyEvent e) { int keyCode e.getKeyCode(); switch (keyCode) { case KeyEvent.VK_UP: up false; break; case KeyEvent.VK_DOWN: down false; break; case KeyEvent.VK_LEFT: left false; break; case KeyEvent.VK_RIGHT: right false; break; } } Override public void keyTyped(KeyEvent e) { } }继承keylistener监听键盘动作通过上下左右四个按键移动玩家小球移动玩家类 Playerimport java.awt.*; import java.util.ArrayList; public class Player { private int x, y, size; private int speedx; private int speedy; private Color color; public Player(int x, int y, int size, int speedx, int speedy, Color color) { this.x x; this.y y; this.size size; this.speedx speedx; this.speedy speedy; this.color color; } // 绘制方法 public void draw(Graphics g) { g.setColor(color); g.fillOval(x, y, size, size); } // 移动方法 public void move() { if (x 0 || x 500 - size) { speedx -speedx; } if (y 0 || y 800 - size) { speedy -speedy; } x speedx; y speedy; } // 获取圆心X public int getCenterX(){ return this.x size / 2; } // 获取圆心Y public int getCenterY(){ return this.y size / 2; } // 获取半径 public double getRadius(){ return size / 2.0; } // 碰撞检测 public void hit(ArrayListPlayer playerList) { int index playerList.indexOf(this); for (int i index 1; i playerList.size(); i) { Player otPlayer playerList.get(i); double dx otPlayer.getCenterX() - this.getCenterX(); double dy otPlayer.getCenterY() - this.getCenterY(); double dist Math.sqrt(dx * dx dy * dy); double sumRadius this.getRadius() otPlayer.getRadius(); if (dist sumRadius) { double overlap sumRadius - dist; // 单位法线向量 double nx dx / dist; double ny dy / dist; this.x - overlap * nx / 2; this.y - overlap * ny / 2; otPlayer.x overlap * nx / 2; otPlayer.y overlap * ny / 2; int tempSpeedx speedx; int tempSpeedy speedy; speedx otPlayer.getSpeedx(); speedy otPlayer.getSpeedy(); otPlayer.setSpeedx(tempSpeedx); otPlayer.setSpeedy(tempSpeedy); } } } public int getX() { return x; } public void setX(int x) { this.x x; } public int getY() { return y; } public void setY(int y) { this.y y; } public int getSize() { return size; } public void setSize(int size) { this.size size; } public int getSpeedx() { return speedx; } public void setSpeedx(int speedx) { this.speedx speedx; } public int getSpeedy() { return speedy; } public void setSpeedy(int speedy) { this.speedy speedy; } public Color getColor() { return color; } public void setColor(Color color) { this.color color; } }绘制与移动小球创建列表playlist储存小球信息并判断是否碰撞碰撞后速度交换游戏循环线程 GameLoopimport java.awt.*; import java.util.ArrayList; public class GameLoop extends Thread{ private GameUI gameUI; private GameListener gameListener; private KeyBoardListener keyBoardListener; private ArrayListPlayer playerList; private Graphics g; private final int playerSpeed 5; public GameLoop(GameUI gameUI) { this.gameUI gameUI; gameListener gameUI.gameListener; playerList gameUI.playerList; keyBoardListener gameUI.keyBoardListener; ggameUI.jf.getGraphics(); } Override public void run() { while(true){ try { Thread.sleep(30); } catch (InterruptedException e) { throw new RuntimeException(e); } g.clearRect(0,0,500,800); Player hero gameUI.hero; // 重置临时速度 int dx 0; int dy 0; if(keyBoardListener.up) dy - playerSpeed; if(keyBoardListener.down) dy playerSpeed; if(keyBoardListener.left) dx - playerSpeed; if(keyBoardListener.right) dx playerSpeed; hero.setX(hero.getX() dx); hero.setY(hero.getY() dy); int w 500, h 800; int size hero.getSize(); if(hero.getX() 0) hero.setX(0); if(hero.getX() w - size) hero.setX(w - size); if(hero.getY() 0) hero.setY(0); if(hero.getY() h - size) hero.setY(h - size); hero.hit(playerList); for (int i 0; i playerList.size(); i) { Player player playerList.get(i); player.draw(g); player.move(); player.hit(playerList); } hero.draw(g); } } public GameListener getGameListener() { return gameListener; } public GameUI getGameUI() { return gameUI; } }继承thread类重写run方法实现控制玩家小球并参与碰撞