• AutoJs学习-MC我的世界自动钓鱼


    往期文章分享

    👉关于作者

    众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣 !!!
    专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
    有什么需要欢迎私我,交流群让学习不再孤单

    在这里插入图片描述

    本文约5千字,新手阅读需要7分钟,复习需要2分钟收藏随时查阅不再迷路

    👉实践过程

    //我的世界MC自动钓鱼。
    //适用场景。
    //最好有一个附魔的钓鱼竿。
    //最好是在海边。
    //面向海水。
    //拿着钓鱼竿。
    //钓鱼的时候尽量让浮漂在屏幕中间。
    //然后点开始按钮就行了。
    //
    
    
    
    //请求截图
    if (!requestScreenCapture(true)) {
        //横屏截图。
        toast("请求截图失败");
        exit();
    };
    
    auto();
    //适配各种屏幕自动缩放坐标。
    setScreenMetrics(1080, 1920);
    
    //定义悬浮窗控制模块,命名为(悬块)。
    var 悬块 = function(window, view) {
        //判断是否缺少构造参数。
        if (!window || !view) {
            //缺少构造参数,抛出错误。
            throw "缺参数";
        };
        //记录按键被按下时的触摸坐标
        this.x = 0, this.y = 0;
        //记录按键被按下时的悬浮窗位置
        this.windowX, this.windowY;
        //按下时长超过此值则执行长按等动作
        this.downTime = 500;
        //记录定时执行器的返回id
        this.Timeout = 0;
        //创建点击长按事件
        this.Click = function() {};
        this.LongClick = function() {};
        //可修改点击长按事件
        this.setClick = function(fun) {
            //判断参数类型是否为函数?
            if (typeof fun == "function") {
                this.Click = fun;
            };
        };
        this.setLongClick = function(fun, ji) {
            //判断参数类型是否为函数?
            if (typeof fun == "function") {
                this.LongClick = fun;
                //判断参数是否可为设置数字?
                if (parseInt(ji) <= 1000) {
                    this.downTime = parseInt(ji);
                };
            };
        };
    
        view.setOnTouchListener(new android.view.View.OnTouchListener((view, event) => {
            //判断当前触控事件,以便执行操作。
            switch (event.getAction()) {
                //按下事件。
                case event.ACTION_DOWN:
                    //按下记录各种坐标数据。
                    this.x = event.getRawX();
                    this.y = event.getRawY();
                    this.windowX = window.getX();
                    this.windowY = window.getY();
                    //创建一个定时器用来定时执行长按操作。
                    this.Timeout = setTimeout(() => {
                        this.LongClick();
                        this.Timeout = 0;
                    }, this.downTime);
                    return true;
                    //移动事件。
                case event.ACTION_MOVE:
                    //移动距离过大则判断为移动状态
                    if (Math.abs(event.getRawY() - this.y) > 5 && Math.abs(event.getRawX() - this.x) > 5) {
                        //移动状态清除定时器
                        if (this.Timeout) {
                            //定时器存在则清除定时器。
                            clearTimeout(this.Timeout);
                            this.Timeout = 0;
                        };
                        //移动手指时调整悬浮窗位置
                        window.setPosition(this.windowX + (event.getRawX() - this.x), this.windowY + (event.getRawY() - this.y));
                    };
                    return true;
                    //抬起事件。
                case event.ACTION_UP:
                    if (this.Timeout) {
                        //手指抬起时,定时器存在,说明没有移动和按下时间小于长按时间。
                        //清除定时器。
                        clearTimeout(this.Timeout);
                        this.Timeout = 0;
                        //执行点击事件。
                        this.Click();
                    };
                    return true;
            };
            //控件的触控事件函数必须要返回true。否则报错。
            return true;
        }));
    };
    
    
    
    
    
    //创建并生成一个悬浮窗。
    var window = floaty.window(
        //创建一个按钮,并设置其id宽高文字等属性。
        <button  id="but" w="200px" h="200px" text="开始"/>
    );
    //输出提示信息。
    toastLog("长按悬浮窗关闭本脚本");
    //空运行定时器保持脚本运行中,这是悬浮窗脚本所必需的。
    setInterval(() => {}, 500);
    //声明一个变量用来控制线程。
    var thread = null;
    //创建一个新的悬浮控制模块 ad 并带入参数(所要控制的悬浮窗和用来控制悬浮窗移动的控件)。
    var ad = new 悬块(window, window.but);
    //设置长按事件。
    ad.setLongClick(function() {
        //输出气泡信息。
        toast("脚本已关闭");
        //脚本停止代码。
        exit();
    });
    //设置点击事件。
    ad.setClick(function() {
        //变量值为空则代表线程没有开启。变量值不为空,则判断线程是不是正在运行。
        if (thread ? !thread.isAlive() : true) { //线程没有运行。
            ui.run(() => {
                window.but.setText("停止");
            });
            //新建一个线程,赋值给变量thread
            thread = threads.start(Main);
        } else {
            thread.interrupt();
            ui.run(() => {
                window.but.setText("开始");
            });
        };
    });
    
    
    //960,540,960,820,
    function Main() {
        while (true) {
            var img = captureScreen();
            if (!判断(img)) {
                toastLog("钓鱼");
                click(960, 820);
                sleep(1000);
                click(960, 820);
                sleep(2000);
            };
            img.recycle();
            sleep(50);
        };
    };
    
    function 判断(img) {
        var w = parseInt(img.getWidth());
        var h = parseInt(img.getHeight());
        var x = Math.floor(w / 2);
        var y = Math.floor(h / 3);
        var s = y / 72;
        for (let i = 0; i < 72; i++) {
            var color = img.pixel(x, Math.floor(y + i * s));
            if (颜色(color)) {
                return true;
            };
        };
        return false;
    };
    
    
    function 颜色(color) {
        var r = colors.red(color),
            g = colors.green(color),
            b = colors.blue(color);
    
        if (weiyi([r - g, g - b, b - r]) < 30) {
            return true;
        };
        return false;
    };
    
    function weiyi(ary) {
        var sum = 0;
        for (var i = 0; i < ary.length; i++) {
            sum += Math.pow(ary[i], 2);
        };
        return Math.sqrt(sum);
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198

    👉其他

    📢作者:小空和小芝中的小空
    📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
    📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

    温馨提示点击下方卡片获取更多意想不到的资源。
    空名先生

  • 相关阅读:
    Java项目:基于jsp+sevlet+mysql日记系统
    Java接入sqlserver的一些坑点记录
    “数字化重构系统,搞定 CEO 是第一步”
    【Java】综合案例——发红包【界面版】
    详细解读_SpringMvc类型转换&数据格式化&数据验证
    MySQL中的锁机制、MyISAM表锁、MyISAM表级锁争用情况、MyISAM并发插入Concurrent Inserts、MyISAM的锁调度
    Redis分布式锁相关总结
    远程调用的问题,调用失败到底是什么的问题(语言-java)
    广告内容定向分级,保护未成年人身心健康
    牛客月赛c(简单推理,以及对set的灵活运用)
  • 原文地址:https://blog.csdn.net/qq_27489007/article/details/126692702