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

2023-05-16

点赞关注,不会迷路!   

 

 

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

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


//创建移动的人物类
public class people
	private 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 heart
	private int x;
	private int y;
	private int width;
	private int height;
	private int speed;
	private GameClient gameClient;
//创建花朵类
public class flower
	private int x;
	private int y;
	private int width;
	private int height;
	private GameClient gameClient;
//创建气球类
public class balloon
	private 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() {
			@Override
			public void keyPressed(KeyEvent e) {
				int KeyCode = e.getKeyCode();
				renwu.okDirPressed(KeyCode);
				
			}
			@Override
			public 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() {
			@Override
			public void keyPressed(KeyEvent e) {
				int KeyCode = e.getKeyCode();
				renwu.okDirPressed(KeyCode);
				
			}
			@Override
			public 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();

 

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

最新2021整理收集的一些面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud等详细讲解,也有详细的学习规划图,面试题整理等,

 点击 : 一线大厂核心技术分享 分享最新技术,走在知识前端

点击一起学习 暗号:csdn 最新学习资料+简历优化资源

                         

  å¨è¿éæå¥å¾çæè¿°

后续会分享更多纯干货文章,希望能真正帮到你们。你们的支持就是我最大的动力!欢迎关注点赞啊!

                                                       

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

怎么做一个分分钟哄女朋友开心的小程序 的相关文章

  • Ubuntu系统各个版本

    http releases ubuntu com releases
  • ArduSub ROV无法前进

    本方案仅适用于ArduSub 控制系统的ROV xff0c 本方案参考ArduSub 官网http www ArduSub com 里的解决方法 问题描述 xff1a 本人在ROV实验中遇到的问题 xff1a 使用遥控器控制ROV向前行驶时
  • STM32F103C8T6核心板——引脚使用注意!!!

    STM32F103C8T6核心板 引脚使用注意 xff01 xff01 xff01 有的引脚与下载JTAG端口复用 有的与BOOT复用 xff0c 若发生引脚不够使用的情况 xff0c 可以将他们进行一点特殊的设置 xff0c 变成普通引脚
  • Keil5_因为临时环境变量造成的编译错误

    Keil5 因为临时环境变量造成的编译错误 如果安装本文所附文件 xff08 注册时打开两个软件都需要管理员权限运行 xff09 仍有同样问题 xff0c 原因可能有如下四个可能 一 电脑用户名使用了中文 解决办法 xff1a 更改为英文
  • STM32_CUBE_IDE_工程的导入和导出

    STM32 CUBE IDE 工程的导入和导出 1 我们写好了代码想要上传到代码仓库共享给别人怎么办 xff0c 就需要先导出工程再上传而不能直接将工程代码直接上传 2 导出工程 3 上传到码云仓库 4 导入之前导出的工程 导出工程 导出的
  • 常见驱动电路

    常见驱动电路 1 基础知识补充 xff08 三极管和MOS管 xff09 2 网上搜集的一些资料 xff08 个人认为可行 xff09 3 实践中使用过的一些驱动电路 4 学习开发板上面的驱动电路 三极管和MOS管的区别 1 三极管和MOS
  • VScode+keil插件-取代keil开发不要太爽了

    VScode 43 keil插件 取代keil开发不要太爽了 前言 xff1a 之前几年开发都是使用的keil xff0c 所以基本所有工程都是keil的工程 xff0c 一时间开发项目还不能及时转变使用HAL库开发 xff08 stm32
  • 关于maven项目中pom.xml文件报红问题的解决方法

    主要原因是可能需要的依赖没有进行自动的加载到本地仓库 xff0c 可以通过设置File gt Settings 设置好maven的本地仓库的位置以及maven的位置 xff0c 即可解决依赖的问题
  • 网络调试助手——局域网广播消息——模拟HTTP服务器

    网络调试助手 局域网广播消息 模拟HTTP服务器 前言 xff1a 作为一名嵌入式开发者 xff0c 不能熟练使用网络调试助手 xff0c 我羞愧至极 xff0c 赶紧弄明白记录下来才是正事 怎么使用网络调试助手向局域网广播消息 注释 xf
  • AT89C51、AT89S51、STC89C51有什么区别?

    标题AT89C51 AT89S51 STC89C51有什么区别 xff1f 1 首先明确一点 xff0c 这几个型号都属于51单片机 xff0c 程序和电路是通用的 xff1b 2 AT89C51是美国ATMEL公司生产的 xff0c 下载
  • 新装的GIT需要配置秘钥才能正常使用

    新装的GIT需要配置秘钥才能正常使用 实际这个过程就是git配置SSH 1 打开git 命令行终端输入指令生成秘钥 操作过程 xff1a 连击三次回车 xff0c 如下图即为成功 ssh span class token operator
  • 正则表达式_总结

    正则表达式 总结 说明 xff1a 限定SpinBox控件的输入范围 span class token comment 限定输入框为1 120 span SpinBox span class token punctuation span i
  • 电路设计_运算放大器应用

    电路设计 运算放大器应用 说明 xff1a 运算放大器是个万用宝 xff0c 要好好利用起来 xff0c 1 电压跟随 xff1a 起到隔离作用 xff0c 高阻抗变低阻抗 2 同向比例放大器 xff1a 放大输入电压信号 xff0c 在输
  • ESP32_IDF_基于win11的开发环境搭建

    ESP32 IDF 基于win11的开发环境搭建 说明 xff1a 1 安装ofline 2 编译下载 xff08 本来打算使用vscode配合使用来开发的 xff0c 奈何vscode环境真难搞 xff0c 放弃了 xff0c 用不惯 x
  • 树莓派的联网方式

    树莓派的多种联网方式 配置WiFi文件将空白的ssh文件放入sd卡配置WiFI文件 家庭局域网或热点查找树莓派ip 通过网线联网 配置WiFi文件 在sd卡中烧录系统之后 xff0c sd卡中会有如下程序 xff1a 将空白的ssh文件放入
  • STM32F103系列PWM波

    话不多说 xff0c 直接上我能跑通的代码 pwm h span class token macro property span class token directive hash span span class token direct
  • HTTP的几种认证方式之DIGEST 认证(摘要认证) 服务端

    https www cnblogs com xy ouyang p 12609387 html
  • Ubuntu 22.04LTS中使用aptitude来解决build-essential安装过程中过高版本包依赖问题

    小白近日安装完Ubuntu 22 04LTS后 xff0c 记不清是不是用了Software Updater还是自己手动upgrade了包 xff0c 导致在配置编译工具build essential 输入sudo apt install
  • 解决com.github.penggle kaptcha 2.3.2 报错

    需要从该地址处kaptcha的jar包下载位置 xff0c 从该地址下载jar包后 xff0c 可以把该jar包存放在C Users hp Desktop这个位置 xff0c 通过windows的cmd命令进入命令操作界面 执行以下命令 x

随机推荐

  • children 获取所有的子元素节点 2020/11/21

    children 获取所有的子元素节点 也是我们实际开发常用的 span class token operator lt span span class token operator span span class token consta
  • window常见事件 2020/11/24

    window onload是窗口 xff08 页面 xff09 加载时间 xff0c 当文档内容完全加载完成后触发该事件注意 xff1a window onload传统注册事件方式只能写一次 xff0c 如果有多个 xff0c 会以最后一个
  • 用if函数,进入无限循环,如何退出当前函数

    用if函数 xff0c 进入无限循环 xff0c 如何退出当前函数 wxml文件 span class token operator lt span view class span class token operator 61 span
  • form-type:submit和reset用法

    form type submit和reset用法 span class token operator lt span form bindsubmit span class token operator 61 span span class
  • checkbox背景颜色设置

    checkbox背景颜色设置 js文件 data span class token punctuation span languages span class token punctuation span span class token
  • MongoDB安装方案

    安装MongoDB 黑马头条项目 43 人力资源后台项目的接口服务均采用了 MongoDB 43 KOA2 技术栈 xff0c 所以在使用本地服务之前 xff0c 我们需要首先安装MongoDB xff0c 这也是该环节中出问题最多的一项
  • 小程序生成海报携带参数-云函数生成二维码

    1 逻辑代码 span class token keyword async span span class token function qcFn span span class token punctuation span span cl
  • 小程序动画

    小程序动画 点击事件 span class token comment lt 三大特色 gt span span class token tag span class token tag span class token punctuati
  • 小程序云开发--内容安全审查API云调用

    云调用 云调用是小程序 云开发提供的在云函数中调用微信开放接口的能力 xff0c 需要在云函数中通过 wx server sdk 使用 接口方法 openapi span class token punctuation span secur
  • 如何通过异或运算快速简单的实现两个数的值的交换

    实现代码如下图所示 xff1a public class class01 public static void swap int a int b a 61 a b b 61 a b a 61 a b System out println a
  • Cisco ISE AAA认证

    ISE 介绍 思科身份服务引擎 ISE 是一种身份验证安全服务 可以在简单而灵活的界面中显示用户和设备 查看并通过网络平台共享详细信息 使其了解用户 设备和网络的具体情况 当然Cisco还有类型的产品 xff0c 比如NAC ACS 那么三
  • PNET模拟器 安装(附下载地址)

    PNET模拟器介绍 Lab is Simple PNET安装步骤 1 将OVA文件导入Vmware 2 注意点 3 开机 xff0c 进行安装 4 选择第一个 5 安装成功 6 打开浏览器输入上边的IP地址 7 选择Online Mode
  • Python自动化备份网络设备配置

    前提 xff1a https blog csdn net weixin 50299079 article details 109300864 好嘞 xff0c 废话不多说 xff0c 开始搞 本文以Cisco CSR1000V设备配合Pyt
  • Check Point R80.40 防火墙

    Check Point 它是一家以色列的公司 xff0c 是面向全球企业用户业内领先的信息安全解决方案提供商 Check Point 解决方案对恶意软件 勒索软件和高级目标威胁的防范率处于业界领先水准 xff0c 可有效保护客户免受网络攻击
  • YangSuite 与 Netconf

    Cisco YangSuite 提供了一组工具和插件 xff0c 用于学习 xff0c 测试采用yang模型的可编程接口 xff0c 例如Netconf Restconf gNMI等 关于理论可以参考之前写的Cisco YangExplor
  • DMVPN 动态多点隧道技术

    DMVPN的特点 配置简单 中心站点只需要配置一次即可 xff0c 增加站点无需修改中心站点配置 xff0c 分支站点配置几乎相同 xff1b 性能好 能够实现动态mGRE隧道 xff0c 数据在分支之间能够直接通信 xff0c 一次加解密
  • Cisco Viptela SD-WAN 基本部署

    Cisco SD WAN Cisco SD WAN四平面 xff0c 四组件 管理平面 vManage xff1b 提供了一个高度可视化的仪表板 xff0c 可简化网络操作 它在整个 SD WAN 结构中提供集中配置 管理 操作和监控 编排
  • Ubuntu20.04安装ROS系统(其中里边出现了很多错误并解决了)

    目录 前言配置流程1 Software amp Update设置2 ifconfig命令3 安装支持SSH4 安装源5 密钥6 更新7 开始安装ROS8 配置环境变量9 验证是否安装成功 前言 首先非常感谢网上的各种安装教程 xff0c 以
  • 大龄程序员没有出路吗?

    点赞关注 xff0c 不会迷路 xff01 前言 说好的更新终于来了 文末有福利 关于这篇文章 xff0c 其实一直在犹豫怎么跟大家说 因为大龄程序员是一个群体 xff0c 但是每个人的情况又各有不同 这篇文章只能给你一个参考 xff0c
  • 怎么做一个分分钟哄女朋友开心的小程序

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