上周是数据库课程设计周,学校为了让我们做出一个真正能用(能看见框体)的东西,同时为毕业设计做准备,找来了培训机构的老师,讲解了两天java-swing图形界面的东西
虽然swing算是过时了的东西,但学起来还是挺开心的,毕竟终于能自己用图形界面写出东西来了.不过代码思路主要还是老师提供的,
逻辑功能实现图
这是最后给同学更改了部分参数贴上图片后的效果
游戏是简化过的:
jframe加上jpanel实现窗体
玩家控制的鱼是通过监听鼠标坐标更改位置的
其他鱼的行动方向只有四种,左上,左下,右上,右下,遇到边缘则朝相反的方向反弹
通过多线程重复打印画布jpanel实现动态的画面
所有鱼实际上都是一个球体,覆盖了一张图片,然后剩下的就是计算几何的判断了(遇到边缘,两球相碰)
整个代码就只有4个类:
Ball_JF设置窗体的基本属性
import javax.swing.JFrame;
public class Ball_JF extends JFrame {
public Ball_JF(){
this.setTitle("逻辑功能图");
this.setBounds(100,100,800,600); //窗体大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗体停止运行
Ball_JP jp=new Ball_JP();
jp.run_run(); //开始运行多线程
this.add(jp); //画布添加到窗体
this.setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Ball_JF();
}
}
Ball_JP
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.List;
import java.util.ArrayList;
import javax.swing.JPanel;
public class Ball_JP extends JPanel implements MouseMotionListener{ //实现监听鼠标的接口
List balls =new ArrayList(); //存放所有的鱼
public Ball_JP(){
addMouseMotionListener(this); //添加监听
for(int i=0;i<50;i++)
add_ball();
}
void add_ball(){ //随机数产生鱼的初始坐标,大小,方向,颜色等
int x=(int) (Math.random()*700);
int y=(int) (Math.random()*500);
int dir=(int) (Math.random()*4);
int d=(int) (Math.random()*30);
int r=(int) (Math.random()*255);
int g=(int) (Math.random()*255);
int b=(int) (Math.random()*255);
int sp=(int) (Math.random()*1+1);
Color col=new Color(r,g,b);
balls.add(new Ball(x,y,dir,d,sp,col));
}
public void paint(Graphics g) {
super.paint(g);
setBackground(Color.white); //隐含this 设置画布的背景颜色
for(int i=0;i=b2.d){
b1.d+=b2.d/4;
balls.remove(j);
break;
}
else if(b1.d
Ball 将鱼的各种属性保存至一个类
import java.awt.Color;
import java.awt.Graphics;
public class Ball {
int x,y,dir,d;
int speed;
Color col;
static final int left_up=0,right_up=1,left_down=2,right_down=3;
public Ball(int x,int y,int dir,int d,int speed,Color col){
super();
this.x=x;
this.y=y;
this.dir=dir;
this.d=d;
this.speed=speed;
this.col=col;
}
void Draw(Graphics g){ //画出这个小球
g.setColor(col);
g.fillOval(x, y, d, d);
}
void move(){ //小球运动
switch (this.dir) {
case left_up:
x-=speed;y-=speed;
if(x<=0)dir=right_up;
else if(y<=0)dir=left_down;
break;
case right_up:
x+=speed;y-=speed;
if(x>=800-d)dir=left_up;
else if(y<=0)dir=right_down;
break;
case left_down:
x-=speed;y+=speed;
if(x<=0)dir=right_down;
else if(y>=600-d)dir=left_up;
break;
case right_down:
x+=speed;y+=speed;
if(x>=800-d)dir=left_down;
else if(y>=600-d)dir=right_up;
break;
}
}
}
BallandBall将所有判断两条鱼相关的函数合并在一起单独抽象为一个类
public class BallandBall {
static final int left_up=0,right_up=1,left_down=2,right_down=3;
public void collision(Ball a,Ball b){ //两球相碰反弹 并没有调用它
int x1=a.x+a.d/2;
int y1=a.y+a.d/2;
int x2=b.x+b.d/2;
int y2=b.y+b.d/2;
double dis= Math.sqrt( (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
if(dis<=a.d/2+b.d/2){
switch (a.dir) {
case left_up:
a.dir=right_down;
break;
case left_down:
a.dir=right_up;
break;
case right_up:
a.dir=left_down;
break;
case right_down:
a.dir=left_up;
break;
}
switch (b.dir) {
case left_up:
b.dir=right_down;
break;
case left_down:
b.dir=right_up;
break;
case right_up:
b.dir=left_down;
break;
case right_down:
b.dir=left_up;
break;
}
}
}
public int balldestroy(Ball a,Ball b){ //判断两球是否相碰
int ret=0;
int x1=a.x+a.d/2;
int y1=a.y+a.d/2;
int x2=b.x+b.d/2;
int y2=b.y+b.d/2;
double dis= Math.sqrt( (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
if(dis<=a.d/2+b.d/2)ret=1;
return ret;
}
}