package com.sxt;
import java.awt.*;
//创建Object类来存放金块和石块的相同属性
public class Object
{
//坐标
int x;
int y;
//宽高
int width;
int height;
//图片
Image img;
//创建标记flag用于修改BUG金块同时消失
boolean flag;
//定义绘制方法
void paintSelf(Graphics g)
{
g.drawImage(img,x,y,null);
}
}
package com.sxt;
import java.awt.*;
//创建Object类来存放金块和石块的相同属性
public class Gold extends Object{
Gold()
{
//坐标
this.x=(int)(Math.random()*700);
this.y=(int)(Math.random()*550+300);
//宽高
this.width=52;
this.height=52;
//设置标记
this.flag=false;
//图片
this.img= Toolkit.getDefaultToolkit().getImage("imgs/gold1.gif");
}
}
package com.sxt;
import java.awt.*;
public class Line {
//起点坐标,保证线左右摇摆时起点不变,仅是终点坐标改变
int x=380;
int y=180;
//终点坐标
int endx=500;
int endy=500;
//定义线长length,角度n,方向dir
double length=100;
double n=0;
int dir=1;
//定义状态 0摇摆 1延长 2收回 3抓取放回
int state;
//用有参构造方法来接收窗口GameWin中元素
GameWin frame;
Line(GameWin frame)
{
this.frame=frame;
}
//设置碰撞判断
void logic()
{
//用for来遍历元素
for (Object obj: this.frame.objectList)
{
if (endx>obj.x&&endx<obj.x+obj.width
&&endy>obj.y&&endy<obj.y+obj.height){
state=3;
//碰撞后flag标记改变
obj.flag=true;
}
}
}
//定义lines来放置重复代码
void lines(Graphics g)
{
endx=(int)(x+length*Math.cos(n*Math.PI));
endy=(int)(y+length*Math.sin(n*Math.PI));
g.setColor(Color.red);
g.drawLine(x,y,endx,endy);
}
//定义线的绘制方法
void paintSelf(Graphics g)
{
//调用判断方法
logic();
//用switch语句来判断状态
switch (state)
{
case 0:
if (n<0.1){dir=1;}
else if (n>0.9){dir=-1;}
//让n变化来实现线的移动,同时线的终点坐标也要发生变化
n=n+0.005*dir;
lines(g);
break;
case 1:
//实现线的延长
if (length<500)
{
length=length+10;
lines(g);
}
else
{
state=2; //线实现延长,返回状态2来减短
}
break;
case 2:
if (length>100)
{
length=length-10;
lines(g);
}
else
{
state=0; //线变短后要变回摇摆状态;
}
break;
//实现抓取放回,线返回,金块也要接着放回
case 3:
if (length>100)
{
length=length-10;
lines(g);
for (Object obj:this.frame.objectList)
{
//加入flag为true,则返回,flase不返回
if (obj.flag)
{
obj.x=endx-26; //金块要随着线返回
obj.y=endy;
if (length<=100)
{
//金块返回后要消失
obj.x=-150; //金块要随着线返回
obj.y=-150;
state=0; //线变短后要变回摇摆状态;
//再改变flag标记
obj.flag=false;
}
}
}
}
break;
default:
}
//判断方向,让它一只在1,2,象限移动
}
}