抽象矿工demo

编程入门 行业动态 更新时间:2024-10-27 06:18:47

抽象<a href=https://www.elefans.com/category/jswz/34/1706412.html style=矿工demo"/>

抽象矿工demo

前言

今天闲着没事写了一个黄金矿工的demo,但是越看越觉得过于简陋,就只好命名为抽象矿工了。

我的目标是搭建一个窗口的应用程序,之前没有学过窗口应用程序的搭建,因此还自学了一些JFrame的知识,文末会附上完整代码。

项目搭建

搭建窗口

首先需要先建立一个窗口和程序的主入口。用来设置窗口的一些属性

public class GameWindow extends JFrame {void launch(){this.setVisible(true);this.setSize(600,600);this.setLocationRelativeTo(null);this.setTitle("黄金矿工");setDefaultCloseOperation(EXIT_ON_CLOSE);}public static void main(String[] args){GameWindow gameWindow = new GameWindow();gameWindow.launch();}
}

这样就搭建好了一个空白的窗口。

附上背景

 这边新建一个类,用于加载背景图片和人物图片。图片可以放在项目的兄弟文件夹,或者是在resource文件夹下,图片可以随意处置。

public class GameBackground {String baseUrl = "imgs/chapterOfGame";Image bgOfSky = Toolkit.getDefaultToolkit().getImage(baseUrl + "/bgOfSky.jpg");Image bgOfGround = Toolkit.getDefaultToolkit().getImage(baseUrl + "/bgOfGround.jpg");Image person = Toolkit.getDefaultToolkit().getImage(baseUrl + "/person.png");void paintSelf(Graphics g){g.drawImage(bgOfSky,0,0,null);g.drawImage(bgOfGround,0,100,null);g.drawImage(person,260,40,null);}
}

然后在主方法中添加绘制方法,绘制该图像

    GameBackground gb = new GameBackground();//绘制方法@Overridepublic void paint(Graphics g){gb.paintSelf(g);}

这样就可以把背景图绘制出来了

绘制抓取红线 

代码如图

public class Line {//起点坐标private int startx = 300;private int starty = 100;//终点坐标private int endx = 300;private int endy = 500;//设置线的长度private double len = 50;//设置延长速度private double lengthen = 15;//表示线的角度/PIprivate double n = 1;//方向private int dir = 1;//表示红线的状态 0:旋转 1:延长 2:收缩 3:抓取int state = 0;GameWindow frame;Line(GameWindow frame){this.frame = frame;}//碰撞检测,用于检测是否进入金块或石块的区域AllObject isCollision(){AllObject obj = null;for(AllObject object: frame.objList){if(endx >= object.x && endx <= object.x + object.width&& endy >= object.y && endy <= object.y + object.height){obj = object;break;}}return obj;}void paintLine(Graphics g){//由于红线的长度是固定的,因此可以使用cos和sin以及角度求得当前的endx和endyendx = (int) (startx + Math.cos(n * Math.PI) * len);endy = (int) (starty + Math.sin(n * Math.PI) * len);g.setColor(Color.red);g.drawLine(startx,starty,endx,endy);}void printSelf(Graphics g){AllObject obj = isCollision();if(obj != null){state = 3;}//根据红线的状态标记,绘制此时的红线switch (state){//当状态为0的时候使得红线左右摇摆case 0://这里通过n表示角度if(n >= 1 || n <= 0){dir = -1 * dir;}n = n + dir * 0.01;paintLine(g);break;//延长红线case 1:if(len <= 500){len += lengthen;paintLine(g);}else{state = 2;}break;//正常收缩红线case 2:if(len >= 50){len -= lengthen;paintLine(g);}else{state = 0;}break;//拉取到物块进行收缩case 3:if(len >= 50){len -= lengthen * obj.quality;paintLine(g);obj.x = endx - (int)lengthen;obj.y = endy;}else{obj.x = -150;obj.y = -150;state = 0;}}}}

 物块的绘制

由于金块和石块种类有点多,因此可以定义一个基本的物块类,用于存放共有的属性

public class AllObject {//设置坐标int x;int y;//设置宽高int width;int height;//设置速度比double quality;//设置初始地址String baseUrl = "imgs/chapterOfGame";//图片Image img;//判段是否重叠boolean isOverlap(int x,int y,int width,int height){return false;}void paintSelf(Graphics g){g.drawImage(img,x,y,null);}
}
public class Gold extends AllObject{Gold(){this.x = (int)(Math.random() * 550);this.y = (int)(Math.random() * 450 + 100);this.width = 45;this.height = 45;this.quality = 0.6;this.img = Toolkit.getDefaultToolkit().getImage(this.baseUrl + "/100.png");}
}
class GoldMiNi extends Gold{GoldMiNi(){this.x = (int)(Math.random() * 550);this.y = (int)(Math.random() * 450 + 100);this.width = 20;this.height = 20;this.quality = 0.9;this.img = Toolkit.getDefaultToolkit().getImage(this.baseUrl + "/20.png");}
}
class Gold300 extends Gold{Gold300(){this.width = 60;this.height = 60;this.quality = 0.4;this.img = Toolkit.getDefaultToolkit().getImage(this.baseUrl + "/300.png");}
}
class Gold600 extends Gold{Gold600(){this.width = 80;this.height = 80;this.quality = 0.3;this.img = Toolkit.getDefaultToolkit().getImage(this.baseUrl + "/600.png");}
}
class Rock extends Gold{Rock(){this.width = 40;this.height = 40;this.quality = 0.1;this.img = Toolkit.getDefaultToolkit().getImage(this.baseUrl + "/rock.png");}
}

这是就完成了所有的代码工作

项目完整代码

public class GameWindow extends JFrame {List<AllObject> objList = new ArrayList<AllObject>();GameBackground gb = new GameBackground();Line line = new Line(this);Image offImage;{Gold gold;for (int i = 0; i < 10; i++) {if(Math.random() < 0.2){gold = new GoldMiNi();}else if(Math.random() < 0.6){gold = new Gold();}else if(Math.random() < 0.8){gold = new Gold300();}else{gold = new Gold600();}objList.add(gold);}for (int i = 0; i < 3; i++) {objList.add(new Rock());}}void launch(){this.setVisible(true);this.setSize(600,600);this.setLocationRelativeTo(null);this.setTitle("黄金矿工");setDefaultCloseOperation(EXIT_ON_CLOSE);//定义鼠标点击事件addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {super.mouseClicked(e);if(e.getButton() == 1){if(line.state == 0){line.state = 1;}}}});//使用循环重复绘制刷新while(true){repaint();try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}}//绘制方法@Overridepublic void paint(Graphics g){offImage = this.createImage(600,600);Graphics gImage = offImage.getGraphics();gb.paintSelf(gImage);line.printSelf(gImage);for(AllObject object: objList){object.paintSelf(gImage);}g.drawImage(offImage,0,0,null);}public static void main(String[] args){GameWindow gameWindow = new GameWindow();gameWindow.launch();}
}public class AllObject {//设置坐标int x;int y;//设置宽高int width;int height;//设置速度比double quality;//设置初始地址String baseUrl = "imgs/chapterOfGame";//图片Image img;//判段是否重叠boolean isOverlap(int x,int y,int width,int height){return false;}void paintSelf(Graphics g){g.drawImage(img,x,y,null);}
}public class Gold extends AllObject{Gold(){this.x = (int)(Math.random() * 550);this.y = (int)(Math.random() * 450 + 100);this.width = 45;this.height = 45;this.quality = 0.6;this.img = Toolkit.getDefaultToolkit().getImage(this.baseUrl + "/100.png");}
}
class GoldMiNi extends Gold{GoldMiNi(){this.x = (int)(Math.random() * 550);this.y = (int)(Math.random() * 450 + 100);this.width = 20;this.height = 20;this.quality = 0.9;this.img = Toolkit.getDefaultToolkit().getImage(this.baseUrl + "/20.png");}
}
class Gold300 extends Gold{Gold300(){this.width = 60;this.height = 60;this.quality = 0.4;this.img = Toolkit.getDefaultToolkit().getImage(this.baseUrl + "/300.png");}
}
class Gold600 extends Gold{Gold600(){this.width = 80;this.height = 80;this.quality = 0.3;this.img = Toolkit.getDefaultToolkit().getImage(this.baseUrl + "/600.png");}
}
class Rock extends Gold{Rock(){this.width = 40;this.height = 40;this.quality = 0.1;this.img = Toolkit.getDefaultToolkit().getImage(this.baseUrl + "/rock.png");}
}public class Line {//起点坐标private int startx = 300;private int starty = 100;//终点坐标private int endx = 300;private int endy = 500;//设置线的长度private double len = 50;//设置延长速度private double lengthen = 15;//表示线的角度/PIprivate double n = 1;//方向private int dir = 1;//表示红线的状态 0:旋转 1:延长 2:收缩 3:抓取int state = 0;GameWindow frame;Line(GameWindow frame){this.frame = frame;}//碰撞检测,用于检测是否进入金块或石块的区域AllObject isCollision(){AllObject obj = null;for(AllObject object: frame.objList){if(endx >= object.x && endx <= object.x + object.width&& endy >= object.y && endy <= object.y + object.height){obj = object;break;}}return obj;}void paintLine(Graphics g){//由于红线的长度是固定的,因此可以使用cos和sin以及角度求得当前的endx和endyendx = (int) (startx + Math.cos(n * Math.PI) * len);endy = (int) (starty + Math.sin(n * Math.PI) * len);g.setColor(Color.red);g.drawLine(startx,starty,endx,endy);}void printSelf(Graphics g){AllObject obj = isCollision();if(obj != null){state = 3;}//根据红线的状态标记,绘制此时的红线switch (state){//当状态为0的时候使得红线左右摇摆case 0://这里通过n表示角度if(n >= 1 || n <= 0){dir = -1 * dir;}n = n + dir * 0.01;paintLine(g);break;//延长红线case 1:if(len <= 500){len += lengthen;paintLine(g);}else{state = 2;}break;//正常收缩红线case 2:if(len >= 50){len -= lengthen;paintLine(g);}else{state = 0;}break;//拉取到物块进行收缩case 3:if(len >= 50){len -= lengthen * obj.quality;paintLine(g);obj.x = endx - (int)lengthen;obj.y = endy;}else{obj.x = -150;obj.y = -150;state = 0;}}}}

更多推荐

抽象矿工demo

本文发布于:2024-03-08 00:30:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1719361.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:矿工   抽象   demo

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!