最近女朋友天天找我吵架得想着办法哄哄她,恰巧我还在找Java面向对象练手的小程序,两个需求一结合,ok,这个小程序诞生了。

主要目的:做一个以女朋友照片为背景的画布,装饰点小花小草小气球小爱心,另设一个女朋友的小图片可以自由的移动.
那么就需要创建一个小花类一个气球类,一个爱心类一个移动的人物类。想要实现小图片可以发射爱心,目前还没实现。。

分别创建四个类,这里我放一起了:


//创建移动的人物类
public class peopleprivate int x;private int y;private int width;private int height;private int speed;private String dir;private GameClient gameClient;private List<heart> heartLists = new ArrayList<();
//创建爱心类
public class heartprivate int x;private int y;private int width;private int height;private int speed;private GameClient gameClient;
//创建花朵类
public class flowerprivate int x;private int y;private int width;private int height;private GameClient gameClient;
//创建气球类
public class balloonprivate int x;private int y;private int width;private int height;private GameClient gameClient;

这几个类参数分别有xy坐标高度宽度,游戏控制台类型的参数gameClient。people类参数还有speed(速度),dir(控制移动方向),装heart类型的哈希表heartlists。
首先我们要知道xy是控制什么的,我们要先知道windows界面的坐标轴

这几个类创建完了,那么还缺什么呢?对了就是画在画布上的图片,如果没有图片 那么传进去的参数x、y、width、height等等是描述什么的呢?

我们需要先获取图片流,那么怎么获取呢?
我们就要先创建一个获取图片流的功能类啦:

public class CommonUtils {/** 读取图片资源,转变为Java对象 Image*/public static Image getImage(String imgPath) {ImageIcon imageIcon = new ImageIcon(imgPath);return imageIcon.getImage();}
}

然后就可以使用这个功能类分别在各自的类中来获取图片:

//传入people图片
public static final Image RENWU_IMAGE = CommonUtils.getImage("人物.jpg");
//传入爱心图片
public static final Image HEART_IMAGE = CommonUtils.getImage("th.jpg");
//传入花朵图片
public static final Image FLOWER_IMAGE = CommonUtils.getImage("花.jpg");
//传入气球图片
public static final Image BALLOON_IMAGE = CommonUtils.getImage("气球.jpg");

好的现在图片都已经加载进去了,那么我们怎么把图片画在画布上呢?如果计算机仅仅读取到图片却不把它放在画布上那不就没啥用了吗,所以我们要定义一个paint方法来将图片画出来:

分别在各自的类中创建paint方法:

//people类中定义的paint方法
public void paint(Graphics g) {g.drawImage(RENWU_IMAGE, this.x, this.y, this.width, this.height, this.gameClient);}
//heart类中定义的paint方法
public void paint(Graphics g) {g.drawImage(HEART_IMAGE, this.x, this.y, this.width, this.height, this.gameClient);
}
//flower类中定义的paint方法
public void paint(Graphics g) {g.drawImage(FLOWER_IMAGE, this.x, this.y, this.width, this.height, this.gameClient);
}
//balloon类中定义的paint方法
public void paint(Graphics g) {g.drawImage(BALLOON_IMAGE, this.x, this.y, this.width, this.height, this.gameClient);}

现在我们已经写完了每个类中的画出图片的方法了,那么怎么去实现呢?如果一个方法不能被实现,那这个方法和咸鱼有什么区别
所以我们需要一个控制台:GameClient类
我们要在这个类中画出女朋友的背景图片,小花图,爱心图和气球图当然还有我女朋友的照片。

public class GameClient extends Frame{public static final String BG_PATH="背景.jpg";private static Image image;private people renwu = new people(400,300,this);private heart heart = new heart(1050,400,this);private flower flower_v1 = new flower(300,80,50,50,this);private flower flower_v2 = new flower(1050,100,50,50,this);private flower flower_v3 = new flower(300,350,50,50,this);private flower flower_v4 = new flower(800,100,50,50,this);private flower flower_h1 = new flower(500,560,50,50,this);private balloon balloon = new balloon(150,600,this);//加载一次背景资源static {image = CommonUtils.getImage(BG_PATH);}public void paint(Graphics g) {//画背景g.drawImage(image, 0, 0, 1440, 1080, this);//画人物renwu.paint(g);//画爱心heart.paint(g);//画花flower_v1.paint(g);flower_v2.paint(g);flower_v3.paint(g);flower_v4.paint(g);flower_h1.paint(g);//画气球balloon.paint(g);}
}

ok,到这我们就把我们所有要呈现在画布上的图片画出来啦!
那我们的需求是什么呢?我们想要让女朋友能漫步在这花花草草和气球里,所以要怎么做,我们要让女朋友能动起来!那就又要在people类里增加功能了:

我们先在people类里定义五个布尔变量,分别是键盘上的上下左右和ctrl:

 boolean UP = false;boolean DOWN = false;boolean LEFT = false;boolean RIGHT = false;boolean CONTROL = false;

这是默认这五个键都没有被按下的,如果不是false,那女朋友的照片不就会来回乱跑了吗,哈哈哈,这个ctrl键被按下,我们想要让地图上的爱心增加1个,同时下方字幕也显示增加一个爱心。
那么怎么随着按下键盘能创建一个新的爱心呢?我们就要构造一个方法了:

 public heart createheart() {return new heart(this.x,this.y,this.gameClient);}

准备工作做完了,那么接下来就是实现上下左右控制女朋友移动了,这里我们就要用到键盘监听器,KeyEvent键盘事件等功能,我们先定义一个方法控制松开键盘。

 public void okDirReleased(int KeyCode) {switch(KeyCode) {case KeyEvent.VK_UP:UP = false;break;case KeyEvent.VK_DOWN:DOWN = false;break;case KeyEvent.VK_LEFT:LEFT = false;break;case KeyEvent.VK_RIGHT:RIGHT = false;break;case KeyEvent.VK_CONTROL:CONTROL = false;break;}}

然后再定义一个方法来接收我们按下键盘的指令

 public void okDirPressed(int KeyCode) {switch(KeyCode) {case KeyEvent.VK_UP:System.out.println("向上走");String dir = "UP";UP = true;this.setDir(dir);break;case KeyEvent.VK_DOWN:System.out.println("向下走");DOWN = true;this.setDir("DOWN");break;case KeyEvent.VK_LEFT:System.out.println("向左走");LEFT = true;this.setDir("LEFT");break;case KeyEvent.VK_RIGHT:System.out.println("向右走");RIGHT = true;this.setDir("RIGHT");break;case KeyEvent.VK_CONTROL:System.out.println("放置爱心");heart heart = this.createheart();//将爱心放入容器中()this.heartLists.add(heart);CONTROL = true;this.setDir("CONTROL");//看容器中还有多少爱心System.out.println("爱心数量"+this.heartLists.size());break;}//判断左上左下右上右下if(UP&&RIGHT) {this.setDir("UR");}if(UP&&LEFT) {this.setDir("UL");}if(DOWN&&RIGHT) {this.setDir("DR");}if(DOWN&&LEFT) {this.setDir("DL");}this.move(this.getDir());}
}

这里我们的String类型的dir变量就派上用场了,我们设置按下上下左右和ctrl键分别给dir传入"UP",“DOWN”,“LEFT”,“RIGHT”,“CONTROL”,如果是左上左下右上右下那么分别是"UL",“DL”,“UR”,“DR”,后面我们会用dir和这些字符串进行比对(equals),这样就可以实现按下键盘操作程序啦,现在我们按下键盘已经得到控制这些功能的字符串了,那么我们怎么利用这些字符串来控制图片移动呢?
我们就要定义一个move方法:

  public void move(String dir) {if("UP".equals(dir)) {this.y-=this.speed;}if("DOWN".equals(dir)) {this.y+=this.speed;}if("LEFT".equals(dir)) {this.x-=this.speed;}if("RIGHT".equals(dir)) {this.x+=this.speed;}if("UR".equals(dir)) {this.y-=this.speed;this.x+=this.speed;}if("UL".equals(dir)) {this.y-=this.speed;this.x-=this.speed;}if("DR".equals(dir)) {this.y+=this.speed;this.x+=this.speed;}if("DL".equals(dir)) {this.y+=this.speed;this.x-=this.speed;}}

到这里还不算完,我们只是定义了这个方法并且定义了如何使用这些方法,那么我们怎么能让计算机直到我们按下了上下左右ctrl键呢?
我们就要在控制台类里加一个监听器了:

     this.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {int KeyCode = e.getKeyCode();renwu.okDirPressed(KeyCode);}@Overridepublic void keyReleased(KeyEvent e) {int KeyCode = e.getKeyCode();renwu.okDirReleased(KeyCode);renwu.setDir("STOP");}});

那么这个监听器应该放在哪里呢?也不能把这个方法就扔在控制台里啊,我们要让它发挥作用啊,所以我们就要定义一个开始的方法了,这个方法里要创建窗口,关闭窗口,监听键盘事件:

 public void start() {//设置标题this.setTitle("老婆大人");//设置窗体大小以及边界this.setBounds(0,0,1440,1080);//关闭游戏窗口this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.out.println("Game over");System.exit(0);}});//监听键盘事件this.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {int KeyCode = e.getKeyCode();renwu.okDirPressed(KeyCode);}@Overridepublic void keyReleased(KeyEvent e) {int KeyCode = e.getKeyCode();renwu.okDirReleased(KeyCode);renwu.setDir("STOP");}});//显示窗体this.setVisible(true);}

运行一下我们发现问题了,女朋友为什么不动?原来是因为画面没有刷新,女朋友动了但是没显示她动了,所以我们要重新刷新一下画面,那么就要对画面进行重绘了:

public class RepaintThread implements Runnable {private GameClient gameClient;public RepaintThread(GameClient gameClient) {this.gameClient = gameClient;}public void run() {while(true) {try {Thread.sleep(100);gameClient.repaint();}catch(Exception e) {e.printStackTrace();}}}}

然后我们要实现一下重绘画面的方法,那么就要让这个线程工作起来,所以我们如何让这个线程工作呢?大家都知道了,我们应该把这个线程在start()方法中激活:
所以我们要在控制台中的start方法中加入几行代码激活线程并让这个线程运行:

     RepaintThread repaintThread = new RepaintThread(this);//创建线程Thread thread = new Thread(repaintThread);//调用游戏开始方法thread.start();

到这基本结束了。还有没解决的功能找机会再实现。代码不全,不重要的没放出来

Java做一个哄女朋友开心的小程序相关推荐

  1. 写一个哄女朋友的python小程序

    好的,下面给出一个哄女朋友的Python小程序,主要是通过一些温馨的话语来表达爱意: importtimedef love_words():print("宝贝,你是我的唯一,我爱你!&quo ...

  2. 怎么做一个分分钟哄女朋友开心的小程序

    点赞关注,不会迷路!    主要目的:做一个以女朋友照片为背景的画布,装饰点小花小草小气球小爱心,另设一个女朋友的小图片可以自由的移动. 那么就需要创建一个小花类一个气球类,一个爱心类一个移动的人物类 ...

  3. 送女朋友的java小程序_用C编写一个送给女朋友的情人节小程序 可爱!

    本文实例为大家分享了C编写送给女朋友的小程序,供大家参考,具体内容如下 #include #include #include #include #include using namespace std ...

  4. 如何做一个基于微信失物招领小程序毕业设计毕设作品

    分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):我们微信小程序项目属于CS架构,C客户端是我们要开发的小程序,S端是我们要开发的后台管理系 ...

  5. 如何做一个基于微信求职招聘小程序毕业设计毕设作品

    分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):我们微信小程序项目属于CS架构,C客户端是我们要开发的小程序,S端是我们要开发的后台管理系 ...

  6. 一个程序如何连接到外网_如何开发制作小程序?做一个电商带直播小程序

    开发制作小程序可以让商家更方便地引流获客.增加线上订单.尤其是今年小程序直播大火,商家有了新的运营私域流量的利器,因此做一个电商带直播功能的小程序是很有用的. 如何开发一个这样的小程序呢?流程如下: ...

  7. 沐风:做一个会自动赚钱的小程序

    当下互联网最火的莫过于小程序了,小程序具有很多天生的优势: 一.扎根于微信生态,拥微信10亿级的海量用户可挖掘. 二.用户界面和流畅度体验,可媲美原生APP. 三.开发周期短,成本低,成本相对原生AP ...

  8. 整个canvas玩一玩,做一个简单的水印相机小程序

    目录 体验地址 前言 一.知识点介绍 1.小程序camera组件 2.腾讯位置微信sdk 3.微信小程序Canvas相关API(就不多说了) 二.拍照添加水印(核心部分) 体验地址 前言 核心js代码 ...

  9. 【微信小程序】注册小程序账号、做一个案例——你好我的小程序

    介绍 这里是小编成长之路的历程,也是小编的学习之路.希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡. 一个人为什么要努力? ...

最新文章

  1. 零基础学python 明日科技-明日科技 - 课程
  2. s5720找mac 华为交换机_【基础】交换机堆叠模式
  3. 金融零售业务大数据分析解决方案
  4. CentOS系统参数优化
  5. 拼多多成为2021年春晚独家红包互动合作伙伴
  6. 前端python与php_WEB前端、PHP、python这三个学习哪一个比较好?
  7. conda加入pytorch清华源
  8. 数值保留小数点两位,但同时去除小数点后多余0 的 javascript、java实现
  9. java 远程调试 端口_java – 远程调试:在端口8787上没有连接到OpenJDK 11上的Wildfly 14...
  10. PIP(Python包管理工具)-Mac环境下安装
  11. 奔图 Pantum P2206NW 打印机驱动
  12. linux查看u盘的分区格式化,linux U盘格式化ext3
  13. Selina 爱我的每个人
  14. TEM测试常见问题及解答(五)
  15. Python之RFM建模分析
  16. NLP入门之综述阅读-基于深度学习的自然语言处理研究综述
  17. WinUSB安装以及与Linux通讯
  18. 通用样式 -表格的每行的复选框选中打印,清除已勾选
  19. uniapp开发微信小程序生成二维码海报
  20. 1024程序员节开幕,龙蜥多位技术专家参与演讲

热门文章

  1. DirectX 3D_基础之粒子系统 广告牌技术 粒子和点精灵 点精灵的结构 点精灵的绘制状态 粒子及其属性
  2. [读书分享]《壹百度》完整版
  3. ASEMI-US1M是什么二极管,US1M二极管分正负极吗
  4. lightroom使用小结一 导入和优化设置
  5. 高光谱与农业(一)植物叶片的反射、吸收光谱
  6. 服务器系统装音频设备,远程服务器未安装音频设备
  7. java倒序输出数字的方法
  8. 计算机文档用什么翻译,有什么方便使用的文档翻译软件?
  9. CMD学习笔记——rename、del和attrib
  10. 20考研「数学一」真题+解析完整版