您现在的位置是:首页 > 文章详情

java实现简单窗体小游戏----球球大作战

日期:2019-07-08点击:393

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<Ball> ballList = new ArrayList<Ball>(); 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 < ballNumber; i++) { //随机产生100个小球 int x = (int)(Math.random()*BallMain.SCREEN_WIDTH); int y = (int)(Math.random()*BallMain.SCREEN_HEIGHT); int position = (int)(Math.random()*4); // int d = (int)(Math.random()*50 + 1); int d = 20; int speed = 1; //颜色 三原色 R G B int red = (int)(Math.random()*255 + 1); int green = (int)(Math.random()*255 + 1); int blue = (int)(Math.random()*255 + 1); Color ballColor = new Color(red, green, blue); Ball b = new Ball(x, y, position, d, speed, ballColor); //将小球添加到集合中 ballList.add(b); } } public void paint(Graphics g){ super.paint(g); BufferedImage img =null; //添加图片 try { img = ImageIO.read(new File("music/timg.png")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } g.drawImage(img, 0, 0, 1360, 760, this); this.setBackground(Color.CYAN); for (int i = 0; i < ballList.size(); i++) { Ball ball = ballList.get(i); ball.drawBall(g); } //玩家 game.drawBall2(g); } public void startBalls(){ //启动线程-----匿名内部类 new Thread(){ public void run() { while (true) { //遍历小球集合 for (int i = 0; i < ballList.size(); i++) { //取出小球 Ball b = ballList.get(i); //让每一个小球进行移动 b.ballMove(); } for (int i = 0; i < ballList.size(); i++) { //先取第一个小球 Ball b1 = ballList.get(i); for (int j = i+1; j < ballList.size(); j++) { Ball b2 = ballList.get(j); BallAndBall bad = new BallAndBall(); //bad.ballCrach(b1, b2); if(bad.isBallCrach(b1, b2)){ if (b1.d >= b2.d) { b1.d += b2.d/3; ballList.remove(b2); break; }else if(b1.d < b2.d){ b2.d += b1.d/3; ballList.remove(b1); break; } } if (bad.isBallCrach(b1, game)) { if (bad.isBallCrach(b1, game)) { 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
版权声明:本文为博主原创文章,转载请附上博文链接!

原文链接:https://yq.aliyun.com/articles/708239
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章