`
貌似掉线
  • 浏览: 260517 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用电脑玩Android版“天天连萌”刷高分(四)——模拟按键及程序优化

阅读更多
这一系列文章,没想到从去年10月份以来,写了三篇我就忘了写了,现在才想起来,所以一不小心就成了跨年系列文章了。
第四篇主要是写一下如何进行模拟按键,以及对程序的一些优化以使到分数更容易达到更高的分。
时间一段时间了,毕竟是去年在写的文章,都忘了原来项目的代码了。
模拟发送按键消息到手机,一开始百度到的是使用monkeyrunner.jar包里的api,但是该相关的api,在貌似4.0版本之后就改动了,构造方法要传进两个我不知道要传什么的参数。所以在这里,我使用了sdk里面的另外的API,即chimpchat.jar包里的api。
进行模拟按键,需要获取一个IChimpDevice对象,获取的方法如下:
		AdbBackend adbBack = new AdbBackend();
		IChimpDevice mChimpDevice = adbBack.waitForConnection();

IChimpDevice有以下主要的API:
// 获取各层级的view以便查询view的状态。
HierarchyViewer getHierarchyViewer();

// 返回一个ChimpManager对象。
ChimpManager getManager();

// 获取设备的属性
 String getProperty(String key);

// 获取所有我们能获取的设备属性
Collection<String> getPropertyList();

// 获取系统的属性
String getSystemProperty(String key);

// 安装指定的程序
boolean installPackage(String path);

// 运行指定的程序。
Map<String, Object> instrument(String packageName, Map<String, Object> args);

// 删除指定的程序
boolean removePackage(String packageName);

// 执行shell命令
String shell(String cmd);

// 发送广播
void broadcastIntent(@Nullable String uri, @Nullable String action, @Nullable String data, @Nullable String mimeType, Collection<String> categories, Map<String, Object> extras, @Nullable String component, int flags);

// 释放资源
void dispose();

// 拖动
void drag(int startx, int starty, int endx, int endy, int steps, long ms);

// 按下
void press(String keyName, TouchPressType type);

// 重启设备
void reboot(@Nullable String into);

// 启动一个Activity
void startActivity(@Nullable String uri, @Nullable String action, @Nullable String data, @Nullable String mimeType, Collection<String> categories, Map<String, Object> extras, @Nullable String component, int flags);

// 截图
IChimpImage takeSnapshot();

// 触摸
void touch(int x, int y, TouchPressType type);

// 打字输入
void type(String string);

还有其他一些方法,在此不一一列举了。
庆幸的是,在天天连萌中,需要模拟的事件还是挺简单的,只是触摸,也就是用了其中的mChimpDevice.touch(int, int, ToushPressType)方法。
在前面的文章中,我们已经继续出需要触摸的元素在数组中的位置,再根据已经知道的边距,以及每个元素所占的宽高,我们可以继续出它在屏幕当中的位置。但是需要注意的是,前面截屏,获取到的图像是竖屏的,我们进行处理过程中,也一直都是用竖屏的。但是在该游戏里模拟按钮,使用的却是横屏下的坐标,所以对于传过来的元素的位置,我们还需要进行转换。代码如下:
	/**
	 * 触摸
	 * 
	 * @param p 在数组中的横、纵坐标位置。
	 * @throws InterruptedException
	 */
	public void touch(Point p) throws InterruptedException {
		// 截图使用的是竖屏,这里触摸使用的是横屏
		int x = PADDING_TOP + (p.x - 1) * IMAGE_HEIGHT + CORNER_HEIGHT;
		int y = 480 - (PADDING_LEFT + (p.y - 1) * IMAGE_WIDTH + CORNER_WIDTH);
		mChimpDevice.touch(x, y, TouchPressType.DOWN_AND_UP);
	}


然后再在我们的Main.java中,进行整个游戏的过程。先写一个循环,在循环中先截图,然后设置数据,然后进行路径搜索,最后将搜索到的坐标传给模拟按键的方法进行模拟消除。main方法代码如下:
while (true) {
	img = robot.snapshot();
	robot.setNum(img);
	robot.startSearch();
}


程序流程基本如上。接下来说一下如何优化。
实际上,电脑将图像转化为数组并进行路径搜索的过程是很快的,只需要几十毫秒。所以当截完一张图之后,电脑很快就计算完成并进行按键模拟。但是手机上接收按键信息并处理,游戏的方块消除及消除的动画的显示都需要时间和处理器。所以当电脑的整个过程太快时,会造成手机画面卡,反而影响下一次的截图。并且下一次的截图通常都是带着许多消除动画的,影响图像识别及转化。所以需要在触摸事件中加上延迟。在我的手机中,测试结果发现15毫秒到30毫秒比较合适(关掉手机中的声音播放,降低分辨率及帧数等都有利于使电脑上的按键延迟设置得更小)。具体设置多少看手机。

另外,这里使用的截图方法,截取一张图需要1200毫秒左右,这时间还包括了从手机传输截屏数据到电脑的时间。如果开启后台线程,不断地进行截图,便可以将平均截图时间减少。同样以我的手机为例,测试到以3个线程最为合适。另外,main方法中我也没再写做一个死循环,考虑到一次游戏结束之后,将不会再消除成功,所以当5秒没有任何消除时即认为游戏结束,退出循环。所以最后修改Main.java代码如下:
public class Main {
	private static BufferedImage img = null;
	private static Executor executors = Executors.newCachedThreadPool();
	private static boolean isOver = false;

	public static void main(String[] args) throws IOException, InterruptedException {
		final Robot robot = new Robot();
		final long startTime = System.currentTimeMillis();
		new Thread() {
			public void run() {
				try {
					while (!isOver) {
						executors.execute(new Runnable() {

							@Override
							public void run() {
								img = robot.snapshot();
							}
						});
						Thread.sleep(350);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			};
		}.start();

		BufferedImage preImage = null;
		long lastClearTime = System.currentTimeMillis();
		while (System.currentTimeMillis() - lastClearTime < 5000
				|| System.currentTimeMillis() - startTime < 60000) {
			long snapTime = System.currentTimeMillis();

			while (img == null || img == preImage) {
				Thread.sleep(50);
			}
			preImage = img;
			System.out.println("snapTime:" + (System.currentTimeMillis() - snapTime));
			robot.setNum(img);
			if (robot.startSearch()) {
				lastClearTime = System.currentTimeMillis();
			}
			System.out.println("playTime:" + (System.currentTimeMillis() - snapTime));
		}
		System.out.println("is over");
		isOver = true;
		System.exit(0);
	}
}
0
2
分享到:
评论

相关推荐

    Android游戏星座连萌

    《Android游戏星座连萌》是一款深受玩家喜爱的休闲益智类手机游戏,它结合了星座元素和连连看的玩法,为玩家带来独特的娱乐体验。在深入探讨这款游戏之前,我们需要了解Android平台的基础知识以及游戏开发的相关技术...

    天天连萌源码

    天天连萌源码

    安卓Android源码——星座连萌.zip

    【标题】"安卓Android源码——星座连萌.zip" 提供的是一个基于Android平台开发的休闲游戏“星座连萌”的源代码。这个压缩包中包含了应用程序的可执行文件(星座连萌.apk)以及可能的其他开发资源或配置文件(xzlm)...

    安卓Android源码——精典源码之星座连萌.zip

    【标题】"安卓Android源码——精典源码之星座连萌"是一个关于安卓应用程序开发的项目,重点在于分析和理解其源代码。这个项目的目的是为开发者提供一个学习和研究Android应用开发的实例,特别是针对游戏开发的部分。...

    基于Java实现的天天连萌游戏自动玩+源码(毕业设计&课程设计&项目开发)

    基于Java实现的天天连萌游戏自动玩+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于Java实现的天天连萌游戏自动玩+源码,适合毕业设计、课程设计、项目...

    安卓Android源码——[安卓开源]星座连萌.7z

    【标题】"安卓Android源码——[安卓开源]星座连萌.7z" 提供的是一个基于Android平台的开源项目,名为“星座连萌”。这个项目可能是为了展示Android应用程序的开发技术,或者是教学材料,让开发者能够理解并学习...

    安卓Android源码——娱乐项目安卓星座连萌.zip

    《安卓Android源码——娱乐项目安卓星座连萌》是一个针对Android平台开发的娱乐应用源代码,旨在提供一种轻松有趣的星座连连看游戏体验。这个项目的源码对于学习Android应用开发,尤其是游戏开发的开发者来说,是一...

    安卓Android源码——[安卓开源]星座连萌.zip

    【安卓Android源码——[安卓开源]星座连萌】是一个以星座为主题的开源安卓游戏项目,其源码可供开发者学习和研究。在这个项目中,我们可以深入理解Android应用开发的基本流程、UI设计、游戏逻辑以及Android平台上的...

    Android应用源码之星座连萌.zip

    《Android应用源码解析:星座连萌》 在Android应用开发的世界中,源码是开发者探索、学习和改进应用的基础。本次我们关注的是一个名为“星座连萌”的应用,通过分析其源码,我们可以深入理解Android应用的工作原理...

    Android 星座连萌-IT计算机-毕业设计.zip

    13. **测试与调试**:应用可能包含单元测试用例,使用JUnit和Mockito等工具进行功能验证,同时利用Android Studio的调试器进行性能优化。 通过分析并学习【AndrodeApe.com]星座连萌】这个项目的源码,学生不仅可以...

    Android应用源码之星座连萌-IT计算机-毕业设计.zip

    《Android应用源码解析——以“星座连萌”为例》 在移动开发领域,Android作为全球最广泛使用的操作系统之一,其应用开发对于学生和开发者来说是至关重要的技能。本篇文章将深入探讨一个名为“星座连萌”的Android...

    小游戏源码-一起来玩心动连萌吧!.rar

    "小游戏源码-一起来玩心动连萌吧!.rar" 这个标题揭示了我们正在处理的是一个小型游戏的源代码,游戏名为“心动连萌”。源码通常指的是编程语言编写的原始代码,是软件或程序开发的基础。"心动连萌"可能是一款休闲...

    Android应用源码娱乐项目安卓星座连萌.zip

    这个压缩包文件“Android应用源码娱乐项目安卓星座连萌.zip”显然包含了开发一个基于Android平台的娱乐应用的源代码,特别是一个与星座相关的游戏——星座连连萌。从描述来看,“源码参考,欢迎下载”,这表明这个...

    Android应用源码娱乐项目安卓星座连萌

    一款关于星座的娱乐项目源码 UI精致度可以达到企业级 项目主要实现了动态多点绘图功能 可以逐步绘画出一个星座的连线 另外还有背景音乐的播放实现 项目主要是通过解析json里面的连线关系使用一个绘图工具类还实现的...

    星座连萌.zip安卓程序源码资源下载

    【标题】"星座连萌.zip安卓程序源码资源下载"是一个提供给开发者的资源包,包含了一个名为"星座连萌"的安卓应用程序的完整源代码。这个资源对于不同层次的编程爱好者都有价值,无论是学生进行毕业设计,还是程序员...

Global site tag (gtag.js) - Google Analytics