作者:手机用户2502921201 | 来源:互联网 | 2023-09-01 12:09
java实现简单窗体小游戏----球球大作战
需求分析
1、分析小球的属性:
坐标、大小、颜色、方向、速度
2、抽象类:Ball
设计类:BallMain—创建窗体
BallJPanel—画小球
BallAndBall—处理小球之间的关系
3、流程:
1)小球的绘制
2)产生小球,让一个小球进行运动,多个小球的运动
3)小球进行碰撞
4)实现大球吃小球
源代码如下:
Ball.java
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
public class Ball {
/* 小球的基本属性 */ int x, y;//定义x, y坐标 int d;//直径 Color ballColor;//小球的颜色 int speed;//小球的运动速度 int position;//小球的运动方向 /*小球的运动方向*/ public static final int LEFT_UP = 0;//左上 public static final int RIGHT_UP = 1;//右上 public static final int LEFT_DOWN = 2;//左下 public static final int RIGHT_DOWN = 3;//右下 /*构造方法*/ public Ball(int x, int y, int position, int d, int speed, Color ballColor){ this.x = x; this.y = y; this.position = position; this.d = d; this.speed = speed; this.ballColor = ballColor; } //构造玩家球 public Ball(int x, int y, int d, int speed, Color ballColor){ this.x = x; this.y = y; this.d = d; this.speed = speed; this.ballColor = ballColor; } //画小球 public void drawBall(Graphics g){ g.setColor(ballColor); g.fillOval(x, y, d, d); } public void drawBall2(Graphics g){ g.setColor(ballColor); g.fillOval(x, y, d, d); //球加文字 g.setColor(Color.RED); //设置字体大小 Font fOnt= new Font(Font.DIALOG, Font.BOLD, 14); g.setFont(font); g.drawString("^_^", x+d/2, y+d/2); }
//小球的运动方向
public void ballMove(){
switch (this.position) { case LEFT_UP: x -= speed; y -= speed; if (x <= 0) { this.position = RIGHT_UP; }else if (y <= 0) { this.position = LEFT_DOWN; } break; case RIGHT_UP: x += speed; y -= speed; if (x >= BallMain.SCREEN_WIDTH - d) { this.position = LEFT_UP; }else if (y <= 0) { this.position = RIGHT_DOWN; } break; case LEFT_DOWN: x -= speed; y += speed; if (x <= 0) { this.position = RIGHT_DOWN; }else if (y >= BallMain.SCREEN_HEIGHT - d) { this.position = LEFT_UP; } break; case RIGHT_DOWN: x += speed; y += speed; if (x >= BallMain.SCREEN_WIDTH - d) { this.position = LEFT_DOWN; }else if (y >= BallMain.SCREEN_HEIGHT - d) { this.position = RIGHT_UP; } break; } }
}
BallMain.java
import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.JFrame;
import sun.audio.AudioData;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;
/创建窗体/
public class BallMain extends JFrame{
//窗体的宽高 public static final int SCREEN_WIDTH = 1360; public static final int SCREEN_HEIGHT = 760; //全屏 Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); int width = (int)d.getWidth(); int height = (int)d.getHeight(); public BallMain(){ this.setTitle("V1.0"); //设置位置 this.setBounds(0,0,SCREEN_WIDTH,SCREEN_HEIGHT); //添加小球到窗体 BallJPanel bj = new BallJPanel(); this.add(bj); //添加键盘的监听事件 this.addKeyListener(bj); /*frame.addKeyListener(tj); tj.addKeyListener(tj); */ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } public static void main(String[] args) { BallMain b = new BallMain(); //添加音乐 try { FileInputStream f =new FileInputStream("music/yyyy.wav"); AudioStream as = new AudioStream(f); AudioPlayer.player.start(as); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
}
BallJPanel.java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/画小球/
public class BallJPanel extends JPanel implements KeyListener{
//存储小球的集合 List ballList = new ArrayList(); int x1 = 450; int y1 = 450; int d1 = 40; private Color white; //玩家球 Ball game = new Ball(x1, y1, d1, 50, white); //小球的数量 private int ballNumber = 100; public BallJPanel(){ addBall(); startBalls(); } //产生小球的方法 public void addBall(){ for (int i = 0; i = b2.d) { b1.d += b2.d/3; ballList.remove(b2); break; }else if(b1.d game.d) { System.out.println("GAME OEVR"); JOptionPane.showMessageDialog(null, "GAME OVER"); return; }else{ game.d += b1.d/3; ballList.remove(b1); break; } } } } } repaint();//重绘 try { Thread.sleep(5); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; }.start(); } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub if (e.getKeyCode() == KeyEvent.VK_UP) { // System.out.println("点击了上方向键"); game.y -= 10; } if (e.getKeyCode() == KeyEvent.VK_DOWN) { // System.out.println("点击了下方向键"); game.y += 10; } if (e.getKeyCode() == KeyEvent.VK_LEFT ) { // System.out.println("点击了左方向键"); game.x -= 15; } if (e.getKeyCode() == KeyEvent.VK_RIGHT) { // System.out.println("点击了右方向键"); game.x += 15; } if (e.getKeyCode() == KeyEvent.VK_1) { // System.out.println("点击了右方向键"); game.x += 10; game.y -= 10; } if (e.getKeyCode() == KeyEvent.VK_2) { // System.out.println("点击了右方向键"); game.x -= 10; game.y -= 10; } if (e.getKeyCode() == KeyEvent.VK_3) { // System.out.println("点击了右方向键"); game.x -= 10; game.y += 10; } if (e.getKeyCode() == KeyEvent.VK_4) { // System.out.println("点击了右方向键"); game.x += 10; game.y += 10; } repaint(); } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub }
}
BallAndBall.java
/处理小球之间的关系/
public class BallAndBall {
//两小球碰撞 public void ballCrach(Ball b1, Ball b2){ int x1 = b1.x + b1.d/2; int y1 = b1.y + b1.d/2; int x2 = b2.x + b2.d/2; int y2 = b2.y + b2.d/2; double e = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); //如果碰撞上 if (e <= b1.d/2 + b2.d/2) { //b1小球 switch (b1.position) { case Ball.LEFT_UP: b1.position = Ball.RIGHT_DOWN; break; case Ball.RIGHT_UP: b1.position = Ball.LEFT_DOWN; break; case Ball.LEFT_DOWN: b1.position = Ball.RIGHT_UP; break; case Ball.RIGHT_DOWN: b1.position = Ball.LEFT_UP; break; } //b2小球 switch (b2.position) { case Ball.LEFT_UP: b2.position = Ball.RIGHT_DOWN; break; case Ball.RIGHT_UP: b2.position = Ball.LEFT_DOWN; break; case Ball.LEFT_DOWN: b2.position = Ball.RIGHT_UP; break; case Ball.RIGHT_DOWN: b2.position = Ball.LEFT_UP; break; } } } //检查是否碰撞上 public boolean isBallCrach(Ball b1, Ball b2){ boolean flag = false; int x1 = b1.x + b1.d/2; int y1 = b1.y + b1.d/2; int x2 = b2.x + b2.d/2; int y2 = b2.y + b2.d/2; //计算圆心距 double e = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); if (e <= b1.d/2 + b2.d/2) { return true; } return false; }
}
其中音乐和图片可自行修改,只需要修改路径即可,音乐格式为wav,我个人用的音乐是彩豆森林**https://www.kugou.com/song/#hash=91968197C4524D5D9CDE382E824F0B01&album_id=15251465
下载之后转变格式即可
作者:『诗伯青柠』诗伯@
来源:CSDN
原文:https://blog.csdn.net/qq_40603408/article/details/90145769
版权声明:本文为博主原创文章,转载请附上博文链接!