从另一个类调用方法混淆(Robot类)

3

我有点困惑,因为我刚上了我的第一堂Java面向对象编程课,我决定需要多练习,因为我们采用的是“自顶向下”的设计方法,这基本上意味着我们首先编写主程序块,并使用任何方法,然后在新类中编写这些方法的定义。

所以我决定玩一下我在一个大型多人在线游戏中使用的机器人类,我的计划是让我的角色随机从地图到地图,我做的第一件事就是简单地将鼠标移动到我的游戏中“门”的坐标位置,然后点击该门以打开我可以移动到的位置,如果我使用以下代码,它就可以正常工作:

import java.awt.Robot;
import java.awt.event.InputEvent;

    public class Move {

      public static void main(String[] args) throws Exception {

            Robot sW = new Robot();

            Thread.sleep(2000);
            sW.mouseMove(262,105);
            Thread.sleep(500);
            sW.mousePress( InputEvent.BUTTON1_MASK );
            sW.mouseRelease( InputEvent.BUTTON1_MASK );
            Thread.sleep(5000);



      }
    }

但是,正如我所说的,由于我想练习自顶向下的设计,我需要使我的主方法更加清晰,因此我尝试了以下方法:

package test;

public class Test {

    public static void main (String [] args){

        Gater sW = new Gater();

        sW.moveToGate();
    }

}

package test;

import java.awt.event.InputEvent;
import java.awt.Robot;

public class Gater {

    public void moveToGate(){

        Thread.sleep(2000);
        mouseMove(262,105);
        Thread.sleep(500);
        mousePress( InputEvent.BUTTON1_MASK );
        mouseRelease( InputEvent.BUTTON1_MASK );
        Thread.sleep(5000);
    }

}

根据我从课堂上了解到的,类似"mouseMove();"这样的代码应该是可以生效的(但实际上并不能),因为我们所使用的是“Karel the Robot”这个软件,而不是“Robot”类。在这种情况下,使用方法“move();”而不是“robot.move();”是完全可以的。现在我的问题是,我是不是漏了什么,还是说在“真正”的Java世界中这样的用法是“不合法”的?

如果是后者,那么有没有什么办法可以达到我想要的效果呢?

谢谢。


2
在第一个例子中,您在Robot上调用了mouseMove。在第二个例子中,您期望这个方法在“Gater”中,但在您的示例中它不在那里。 - Yannic Bürgmann
1
谁是Karel?除此之外,你应该使用一个IDE进行编程,并使用一个名为“重构/提取方法...”的功能。这将创建一个可重用的方法,但保持您的代码完整。 - Thomas Weller
1
你已完全删除了机器人。你只是导入了该类,但不再创建它的对象。 - Thomas Weller
谢谢你们的回答,伙计们。虽然我现在还不能点赞,但是一旦我达到足够的声望,我会给你们点赞的。 - PainKiller
1个回答

1
在你的第二次尝试中,你试图从Gater类中调用Robot类的方法,但没有提供Robot对象。
你必须创建一个Robot实例:
public class Gater {

    public void moveToGate(){
        Robot robot = new Robot ();
        Thread.sleep(2000);
        robot.mouseMove(262,105);
        Thread.sleep(500);
        robot.mousePress( InputEvent.BUTTON1_MASK );
        robot.mouseRelease( InputEvent.BUTTON1_MASK );
        Thread.sleep(5000);
    }

}

哦,我以为如果我在Gater内创建另一个机器人,那么我就无法从主方法调用moveToGate()方法,但它完全正常工作,非常感谢! - PainKiller
1
如果您想在主方法中使用与机器人对象相同的对象,您也可以通过构造函数或方法参数将机器人对象传递给您的gater类,例如moveToGate(Robot robot)。 - Rhayene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接