ControlManager

First of all i know there is somewhere jmonkey code for somethin like this, but i just wanted to create my own IO controller. Code is not great, but maybe will help someone. Ahh and forgot to include isActive, but is it not hard to add :slight_smile:





ControlIOInterface.java

[java]/**

*

  • @author oxplay
  • Radosław Kwolek

    */

    public interface ControlIOInterface {



    public void setPriority(int priority);



    public int getPriority();



    public boolean mouseEvent(int mouseX, int mouseY, boolean clicked, boolean clickState);



    public boolean MouseWheel(int dir, boolean clicked, boolean clickState);



    public boolean keyEvent(String key);



    public boolean isActive();



    public void setActive(boolean active);

    }[/java]





    ControlIO.java

    [java]/**

    *
  • @author oxplay
  • Radosław Kwolek

    */

    public abstract class ControlIO implements ControlIOInterface {



    public int priority = 0;

    public boolean active = false;



    public ControlIO() {

    System.out.println("[ControlIO "+this.getClass().getSimpleName()+"]");

    ControlIOInterface derivedObject = this;

    if (!ControlManager.controlStates.contains(derivedObject)) {

    System.out.println("[ControlIO::adding control]");

    ControlManager.controlStates.add(derivedObject);

    }

    System.out.println("[sizeof controls:" + ControlManager.controlStates.size() + "]");

    ControlManager.sortStates();

    }



    public void setPriority(int priority) {

    this.priority = priority;

    }



    public int getPriority() {

    return priority;

    }



    public boolean mouseEvent(int mouseX, int mouseY, boolean clicked, boolean clickState) {

    return false;

    }



    public boolean MouseWheel(int dir, boolean clicked, boolean clickState) {

    return false;

    }



    public boolean keyEvent(String key) {

    return false;

    }



    @Override

    public boolean isActive() {

    return active;

    }



    @Override

    public void setActive(boolean active) {

    this.active = active;

    }

    }

    [/java]





    ControlManager.java // Debugger is just my debug class - replace it or remove

    [java]

    /**

    *
  • @author oxplay
  • Radosław Kwolek

    */

    import com.jme3.app.Application;

    import com.jme3.input.InputManager;

    import com.jme3.input.KeyInput;

    import com.jme3.input.MouseInput;

    import com.jme3.input.controls.ActionListener;

    import com.jme3.input.controls.AnalogListener;

    import com.jme3.input.controls.KeyTrigger;

    import com.jme3.input.controls.MouseAxisTrigger;

    import com.jme3.input.controls.MouseButtonTrigger;

    import java.util.ArrayList;

    import java.util.Collections;

    import java.util.Comparator;

    import oxplay.debug.Debug;



    public class ControlManager {



    public static ArrayList<ControlIOInterface> controlStates = new ArrayList<ControlIOInterface>();

    private final Application app;

    private final InputManager inputManager;



    public ControlManager(Application app, InputManager inputManager) {

    this.app = app;

    this.inputManager = inputManager;

    }



    public static void sortStates() {

    class CompareStates implements Comparator<ControlIOInterface> {



    @Override

    public int compare(ControlIOInterface obj1, ControlIOInterface obj2) {

    ControlIOInterface emp1 = (ControlIOInterface) obj1;

    ControlIOInterface emp2 = (ControlIOInterface) obj2;

    return (emp1.getPriority()>emp2.getPriority() ? -1 : (emp1.getPriority()==emp2.getPriority() ? 0 : 1));

    }

    }

    CompareStates compareStates = new CompareStates();

    Collections.sort(controlStates, compareStates);

    }



    public void updateMouseEvent(int mouseX, int mouseY, boolean clicked, boolean clickState) {

    int num = controlStates.size();

    for (int i = 0; i < num; i++) {

    ControlIOInterface state = controlStates.get(i);

    Debug.reportInfo(Debug.PRIORITY_ZERO, "state() "+state.getClass().getSimpleName()+"");

    if (state != null && state.mouseEvent(mouseX, mouseY, clicked, clickState)) {

    return;

    }

    }

    }



    public void updateMouseWheel(int dir, boolean clicked, boolean clickState) {

    int num = controlStates.size();

    for (int i = 0; i < num; i++) {

    ControlIOInterface state = controlStates.get(i);

    if (state != null && state.MouseWheel(dir, clicked, clickState)) {

    return;

    }

    }

    }



    public void updateKeyEvent(String key) {

    int num = controlStates.size();

    for (int i = 0; i < num; i++) {

    ControlIOInterface state = controlStates.get(i);

    if (state != null && state.keyEvent(key)) {

    return;

    }

    }

    }



    public void initKeys() {

    inputManager.addMapping("mouseMove", new MouseAxisTrigger(0, true));

    inputManager.addMapping("mouseMove", new MouseAxisTrigger(0, false));

    inputManager.addMapping("mouseMove", new MouseAxisTrigger(1, true));

    inputManager.addMapping("mouseMove", new MouseAxisTrigger(1, false));

    inputManager.addListener(analogListener, "mouseMove");

    inputManager.addMapping("MOUSE_W+", new MouseAxisTrigger(2, false));

    inputManager.addMapping("MOUSE_W-", new MouseAxisTrigger(2, true));

    inputManager.addMapping("LMB", new MouseButtonTrigger(MouseInput.BUTTON_LEFT));

    inputManager.addMapping("RMB", new MouseButtonTrigger(MouseInput.BUTTON_RIGHT));

    inputManager.addMapping("MMB", new MouseButtonTrigger(MouseInput.BUTTON_MIDDLE));

    inputManager.addMapping("kea_q", new KeyTrigger(KeyInput.KEY_Q));

    inputManager.addMapping("kea_w", new KeyTrigger(KeyInput.KEY_W));

    inputManager.addMapping("kea_e", new KeyTrigger(KeyInput.KEY_E));

    inputManager.addMapping("kea_r", new KeyTrigger(KeyInput.KEY_R));

    inputManager.addMapping("kea_t", new KeyTrigger(KeyInput.KEY_T));

    inputManager.addMapping("kea_y", new KeyTrigger(KeyInput.KEY_Y));

    inputManager.addMapping("kea_u", new KeyTrigger(KeyInput.KEY_U));

    inputManager.addMapping("kea_i", new KeyTrigger(KeyInput.KEY_I));

    inputManager.addMapping("kea_o", new KeyTrigger(KeyInput.KEY_O));

    inputManager.addMapping("kea_p", new KeyTrigger(KeyInput.KEY_P));

    inputManager.addMapping("kea_a", new KeyTrigger(KeyInput.KEY_A));

    inputManager.addMapping("kea_s", new KeyTrigger(KeyInput.KEY_S));

    inputManager.addMapping("kea_d", new KeyTrigger(KeyInput.KEY_D));

    inputManager.addMapping("kea_f", new KeyTrigger(KeyInput.KEY_F));

    inputManager.addMapping("kea_g", new KeyTrigger(KeyInput.KEY_G));

    inputManager.addMapping("kea_h", new KeyTrigger(KeyInput.KEY_H));

    inputManager.addMapping("kea_j", new KeyTrigger(KeyInput.KEY_J));

    inputManager.addMapping("kea_k", new KeyTrigger(KeyInput.KEY_K));

    inputManager.addMapping("kea_l", new KeyTrigger(KeyInput.KEY_L));

    inputManager.addMapping("kea_z", new KeyTrigger(KeyInput.KEY_Z));

    inputManager.addMapping("kea_x", new KeyTrigger(KeyInput.KEY_X));

    inputManager.addMapping("kea_c", new KeyTrigger(KeyInput.KEY_C));

    inputManager.addMapping("kea_v", new KeyTrigger(KeyInput.KEY_V));

    inputManager.addMapping("kea_b", new KeyTrigger(KeyInput.KEY_B));

    inputManager.addMapping("kea_n", new KeyTrigger(KeyInput.KEY_N));

    inputManager.addMapping("kea_m", new KeyTrigger(KeyInput.KEY_M));

    inputManager.addMapping("lbracket", new KeyTrigger(KeyInput.KEY_LBRACKET));

    inputManager.addMapping("rbracket", new KeyTrigger(KeyInput.KEY_RBRACKET));

    inputManager.addMapping("esc", new KeyTrigger(KeyInput.KEY_ESCAPE));

    inputManager.addMapping("enter", new KeyTrigger(KeyInput.KEY_RETURN));

    inputManager.addMapping("backspace", new KeyTrigger(KeyInput.KEY_BACK));

    inputManager.addMapping("Rotate", new KeyTrigger(KeyInput.KEY_SPACE), new MouseButtonTrigger(MouseInput.BUTTON_LEFT));

    inputManager.addListener(actionListener, new String[]{"LMB", "RMB", "backspace", "esc", "kea_q", "kea_w", "kea_e", "kea_r", "kea_t", "kea_y", "kea_u", "kea_i", "kea_o", "kea_p", "kea_a", "kea_s", "kea_d", "kea_f", "kea_g", "kea_h", "kea_j", "kea_k", "kea_l", "kea_z", "kea_x", "kea_c", "kea_v", "kea_b", "kea_n", "kea_m"});

    inputManager.addListener(analogListener, new String[]{"MMB", "MOUSE_W+", "MOUSE_W-", "Left", "Right", "Rotate"});

    }

    /////////////////////////////////////////////////////////////////////

    AnalogListener analogListener = new AnalogListener() {



    public void onAnalog(String name, float value, float tpf) {

    if (name.equals("Rotate")) {

    System.out.println("Rotate");

    }

    if (name.equals("Right")) {

    System.out.println("Right");

    }

    if (name.equals("Left")) {

    System.out.println("Left");

    }

    if (name.equals("MOUSE_W+")) {

    updateMouseWheel(1, false, false);

    }

    if (name.equals("MOUSE_W-")) {

    updateMouseWheel(0, false, false);

    }

    if (name.equals("mouseMove")) {

    updateMouseEvent((int) inputManager.getCursorPosition().x, (int) inputManager.getCursorPosition().y, false, false);

    }

    }

    };

    ActionListener actionListener = new ActionListener() {



    public void onAction(String name, boolean keyPressed, float tpf) {

    if (name.equals("kea_a") && !keyPressed) {

    updateKeyEvent("a");

    }

    if (name.equals("kea_b") && !keyPressed) {

    updateKeyEvent("b");

    }

    if (name.equals("kea_c") && !keyPressed) {

    updateKeyEvent("c");

    }

    if (name.equals("kea_d") && !keyPressed) {

    updateKeyEvent("d");

    }

    if (name.equals("kea_e") && !keyPressed) {

    updateKeyEvent("e");

    }

    if (name.equals("kea_f") && !keyPressed) {

    updateKeyEvent("f");

    }

    if (name.equals("kea_g") && !keyPressed) {

    updateKeyEvent("g");

    }

    if (name.equals("kea_h") && !keyPressed) {

    updateKeyEvent("h");

    }

    if (name.equals("kea_i") && !keyPressed) {

    updateKeyEvent("i");

    }

    if (name.equals("kea_j") && !keyPressed) {

    updateKeyEvent("j");

    }

    if (name.equals("kea_k") && !keyPressed) {

    updateKeyEvent("k");

    }

    if (name.equals("kea_l") && !keyPressed) {

    updateKeyEvent("l");

    }

    if (name.equals("kea_m") && !keyPressed) {

    updateKeyEvent("m");

    }

    if (name.equals("kea_n") && !keyPressed) {

    updateKeyEvent("n");

    }

    if (name.equals("kea_o") && !keyPressed) {

    updateKeyEvent("o");

    }

    if (name.equals("kea_p") && !keyPressed) {

    updateKeyEvent("p");

    }

    if (name.equals("kea_r") && !keyPressed) {

    updateKeyEvent("r");

    }

    if (name.equals("kea_s") && !keyPressed) {

    updateKeyEvent("s");

    }

    if (name.equals("kea_t") && !keyPressed) {

    updateKeyEvent("t");

    }

    if (name.equals("kea_y") && !keyPressed) {

    updateKeyEvent("y");

    }

    if (name.equals("kea_u") && !keyPressed) {

    updateKeyEvent("u");

    }

    if (name.equals("kea_w") && !keyPressed) {

    updateKeyEvent("w");

    }

    if (name.equals("kea_q") && !keyPressed) {

    updateKeyEvent("q");

    }

    if (name.equals("kea_v") && !keyPressed) {

    updateKeyEvent("v");

    }

    if (name.equals("kea_z") && !keyPressed) {

    updateKeyEvent("z");

    }

    if (name.equals("kea_x") && !keyPressed) {

    updateKeyEvent("x");

    }

    if (name.equals("lbracket") && !keyPressed) {

    updateKeyEvent("lbracket");

    }

    if (name.equals("rbracket") && !keyPressed) {

    updateKeyEvent("rbracket");

    }

    if (name.equals("esc") && !keyPressed) {

    updateKeyEvent("esc");

    }

    if (name.equals("enter") && !keyPressed) {

    updateKeyEvent("enter");

    }

    if (name.equals("backspace") && !keyPressed) {

    updateKeyEvent("backspace");

    }

    if (name.equals("LMB")) {

    if (keyPressed) {

    updateMouseEvent((int) inputManager.getCursorPosition().x, (int) inputManager.getCursorPosition().y, true, true);

    } else {

    updateMouseEvent((int) inputManager.getCursorPosition().x, (int) inputManager.getCursorPosition().y, true, false);

    }

    }

    }

    };

    }

    [/java]







    so now any class can be easly controlled



    [java]private ControlManager controlManager = null;



    public void initControlManager() throws Exception {

    controlManager = new ControlManager(application, inputManager);

    controlManager.initKeys();

    }

    [/java]







    so having class MyClass: // Priority tell us what IOControl will be checked first. When we return true from keaEvent then other class will not do keaEvent actions, same for mouseEvent.



    [java]public class MyClass {

    // for example isMouseOver() & isUsingKey() defined



    public class Controls extends ControlIO {



    GUIControls() {

    this.setPriority(10);

    }



    @Override

    public boolean keyEvent(String key) {



    if (isUsingKey()) {

    return true; // so it block other lower priority tasks for keaEvent

    }



    return false;

    }



    @Override

    public boolean mouseEvent(int mouseX, int mouseY, boolean clicked, boolean clickState) {



    if (isMouseOver()) {

    return true; // so it block other lower priority tasks for mouseEvent

    }



    return false;

    }

    }

    Controls controls = new Controls();





    }[/java]
3 Likes