绘制红线以及红线的摇摆
线的类
public class Line {
//起点坐标
int x=380;
int y=180;
//终点坐标
int endx=500;
int endy=500;
//线长
double length=100;//根据线长和角度计算endx和endy
double n=0;
//方向
int dir=1;
void paintSelf(Graphics g){
if(n<0.1){dir=1;}//n的取值应该为0-1,若n<0(转圈到上面了),让线顺时针旋转,dir=1
else if (n>0.9){dir=-1;}//为保证线在地面下,缩小了n的取值范围
n=n+0.005*dir;//使角度发生变化
endx = (int)(x + length * Math.cos(n*Math.PI));//jiaodu是double,endx是int,因此需要强制转化
endy = (int)(y + length * Math.sin (n*Math.PI));
g.setColor(Color.red);//添加颜色
g.drawLine(x,y,endx,endy);//绘制线条
}
}
将红线摇摆抽象为直角三角形,线的摆动可以用线长*cos(角度),则endx为
endx = (int)(x + length * Math.cos(n*Math.PI));
其中要保证线在y的正半轴摆动,则角度的取值范围为(0,),则n的取值范围为(0,1)
此时线的摆动为一圈,限制线的摆动:定义一个方向dir,当线的摆动到达地面时,使方向改变(即if和else if段,详见注释)
并在窗口中不断绘制红线,使用 repaint();
public class GameWin extends JFrame { //创建窗口
bg bg=new bg();
Line line=new Line();
void launch(){
this.setVisible(true); //设置窗口是否可见
this.setSize(768,1000); //直接输入数字即可
this.setLocationRelativeTo(null); //窗口居中
this.setTitle("黄金矿工"); //窗口名称
setDefaultCloseOperation(EXIT_ON_CLOSE);//关闭窗口
while(true){//死循环
repaint();//使线段不停的重新绘制,即使线可以进行摇摆
try {
Thread.sleep(10);//设置时延
} catch (InterruptedException e) {
e.printStackTrace();//编写时会发生异常,直接选择try catch解决
}
}
}
@Override
public void paint(Graphics g) {
bg.paintSelf(g);
line.paintSelf(g);
}
public static void main(String[] args) { //输入psvm直接声明主函数
GameWin gameWin=new GameWin();
gameWin.launch(); //new一个类后才能调用这个类
}
}