其中模仿学习了
2017年最后一篇文章:微信小程序游戏"跳一跳"刷榜原理解析!
http://blog.csdn.net/F0ED9cZN4Ly992G/article/details/78937011
java获取图片像素点的RGB值
http://blog.csdn.net/ubuntu_yanglei/article/details/46443929
以下是内容
1.创建主程序
2.创建截图类
截图类基础JPanel
JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,可以进行嵌套,功能是对窗体中具有相同逻辑功能的组件进行组合。
先输入
//不懂
private static final long serialVersionUID = 1L;
创建Image类
private Image image=null;
创建paint方法带上Garphics对象
Graphics 类,封装一个 GDI+ 绘图图面
public void paint(Graphics g){
创建Process类
Process类
Process类:提供对本地和远程进程的访问权限并使你能够启动和停止本地系统进程。
Runtime.getRuntime().exec()方法主要用于执行外部的程序或命令。
Process p1 = Runtime.getRuntime().exec("adb shell screencap -p /sdcard/jump.png");
然后在输入
//waitFor等待 如果已终止该子进程,此方法立即返回??
p1.waitFor();
创建另一个
//adb pull:adb命令下pull的作用是从手机端向电脑端拷文件。
Process p2 = Runtime.getRuntime().exec("adb pull /sdcard/jump.png c:/sss/jump.png");
然后在输入
//waitFor等待 如果已终止该子进程,此方法立即返回??
p1.waitFor();
接下来设置一个储存在电脑上的地址,如下:
导入包
import javax.imageio.ImageIO;
//这个路径需要自己设定
image = ImageIO.read(new File("c:/sss/jump.png"));
设置图像大小
//这个图像展示大小需要自己设定,这里用的是小辣椒GM-Q1手机720*1280
g.drawImage(image, 0, 0, 720, 1280, null);
4. 创建坐标类
5. 创建勾股定理算法
public static int calDistance(Point p1, Point p2){
return (int)Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
6. 添加模拟滑动方法
public static void jump(int time){
try {
//模拟滑动?
Runtime.getRuntime().exec("adb shell input touchscreen swipe 170 187 170 187 " + time);
} catch (Exception e) {
e.printStackTrace();
}
}
X.创建主运行类
主运行类继承JFrame
JFrame 简介;
java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。
先输入
private static final long serialVersionUID = 1L;
新建一个截图类
//截图类
private PhoneImagePanel phoneImgPanel = null;
一个判断类来判断是否起跳
private boolean isFirst = true;
两个坐标,一个记录单位坐标一个记录目标坐标
//以下两个是坐标类
private Point prePoint = new Point();
private Point curPoint = new Point();
在里面创建个构造方法来实现
在方法内
添加截图类,设置大小,设置可见与否
//截图
phoneImgPanel = new PhoneImagePanel();
//添加截图
this.add(phoneImgPanel);
//设置窗体的大小为720*1280像素大小
this.setSize(720, 1280);
//用户单击窗口的关闭按钮时程序执行的操作
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体可见,没有该语句,窗体将不可见,此语句必须有,否则没有界面就没有如何意义了
this.setVisible(true);
给窗口添加点击事件
//给窗口添加鼠标点击事件,匿名类MouseListener
/*
MouseListener的五个常用方法
1.public void mouseClicked(MouseEvent e) 鼠标按键在组件上单击(按下并释放)时调用。
2.public void mouseEntered(MouseEvent e) 鼠标进入到组件上时调用。
3.public void mouseExited(MouseEvent e) 鼠标离开组件时调用。
4.public void mousePressed(MouseEvent e) 鼠标按键在组件上按下时调用。
5.public void mouseReleased(MouseEvent e) 鼠标按钮在组件上释放时调用。
*/
phoneImgPanel.addMouseListener(new MouseListener() {
实现起跳
//每次在跳动之前,需要点击球柱的起跳点,也就是中心点
if(isFirst){
prePoint.x = event.getX();
prePoint.y = event.getY();
isFirst = false;
return;
}
//储存坐标
curPoint.x = event.getX();
curPoint.y = event.getY();
//使用勾股定理计算跳跃的距离,calDistance方法是勾股定理计算
int distance = Utils.calDistance(prePoint, curPoint);
//这个定值是需要手动调解出来的,每个手机尺寸或许不一样,需要自己手动调节
int time = (int)(distance/0.49);
//jump方法是长按屏幕的事件
Utils.jump(time);
System.out.println("distance:"+distance+",time:"+time);
//这里的时间是为了等待截图绘制图片到面板中,时间也是需要自己设定,不然图像绘制会出现错乱
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//为了下一次能够点击起跳点
isFirst = true;
//跳完了,就开始刷新面板,获取最新的手机屏幕信息
//validate验证此容器及其所有子组件。
phoneImgPanel.validate();
//repaint重绘此组件。
phoneImgPanel.repaint();
其他的方法留空就好,如
以下是我模仿并添加了自动获取玩家坐标的代码
package com.yang.rm.system;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class WXjumponejump {
//开始
public static void main(String[] args) throws Exception {
new WXjumponejump.weixingame();
}
public static Point getImagePixel(String image) throws Exception {
int[] rgb = new int[3];
File file = new File(image);
BufferedImage bi = null;
try {
bi = ImageIO.read(file);
} catch (Exception e) {
e.printStackTrace();
}
int width = bi.getWidth();
int height = bi.getHeight();
int minx = bi.getMinX();
int miny = bi.getMinY();
System.out.println("width=" + width + ",height=" + height + ".");
System.out.println("minx=" + minx + ",miniy=" + miny + ".");
for (int i = minx; i < width; i++) {
for (int j = miny; j < height; j++) {
int pixel = bi.getRGB(i, j); // 下面三行代码将一个数字转换为RGB数字
rgb[0] = (pixel & 0xff0000) >> 16;
rgb[1] = (pixel & 0xff00) >> 8;
rgb[2] = (pixel & 0xff);
System.out.println("i=" + i + ",j=" + j + ":(" + rgb[0] + ","
+ rgb[1] + "," + rgb[2] + ")");
if (rgb[0] == 75 && rgb[1] == 62 && rgb[2] == 103){
j = j+118;
Point point = new Point();
point.x = i;
point.y = j;
return point;
}
}
}
return null;
}
/**
* 返回屏幕色彩值
*
* @param x
* @param y
* @return
* @throws AWTException
*/
public int getScreenPixel(int x, int y) throws AWTException { // 函数返回值为颜色的RGB值。
Robot rb = null; // java.awt.image包中的类,可以用来抓取屏幕,即截屏。
rb = new Robot();
Toolkit tk = Toolkit.getDefaultToolkit(); // 获取缺省工具包
Dimension di = tk.getScreenSize(); // 屏幕尺寸规格
System.out.println(di.width);
System.out.println(di.height);
Rectangle rec = new Rectangle(0, 0, di.width, di.height);
BufferedImage bi = rb.createScreenCapture(rec);
int pixelColor = bi.getRGB(x, y);
return 16777216 + pixelColor; // pixelColor的值为负,经过实践得出:加上颜色最大值就是实际颜色值。
}
static class weixingame extends JFrame{
//不懂
private static final long serialVersionUID = 1L;
//截图类创建
private jietu jietu = null;
private boolean okjump = true;
private Point now = new Point();
private Point next = new Point();
public weixingame(){
jietu = new jietu();
this.add(jietu);
this.setSize(720,1080);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
jietu.addMouseListener(new MouseListener() {
@Override
public void mousePressed(MouseEvent e) {
Point nows = null;
try {
nows = getImagePixel("c:/sss/jump.png");
} catch (Exception e1) {
e1.printStackTrace();
}
now.x = nows.getX();
now.y = nows.getY();
next.x = e.getX();
next.y = e.getY();
int distance = calDistance(nows,next);
//这个定值是需要手动调解出来的,每个手机尺寸或许不一样,需要自己手动调节
int time = (int)(distance/0.49);
jump(time);
System.out.println("distance:"+distance+",time:"+time);
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
jietu.validate();
jietu.repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
}
}
//截图类
//JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,可以进行嵌套,功能是对窗体中具有相同逻辑功能的组件进行组合。
public static class jietu extends JPanel{
//不懂
private static final long serialVersionUID = 1L;
private Image image = null;
public void paint(Graphics g){
try {
Process p1 = Runtime.getRuntime().exec("adb shell screencap -p /sdcard/jump.png");
p1.waitFor();
Process p2 = Runtime.getRuntime().exec("adb pull /sdcard/jump.png c:/sss/jump.png");
p2.waitFor();
image = ImageIO.read(new File("c:/sss/jump.png"));
g.drawImage(image,0,0,720,1280,null);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static int calDistance(Point p1, Point p2){
return (int)Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
public static void jump(int time){
try {
//模拟滑动?
Runtime.getRuntime().exec("adb shell input touchscreen swipe 170 187 170 187 " + time);
} catch (Exception e) {
e.printStackTrace();
}
}
}