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
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]