123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]--><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="Asciidoctor 1.5.4"><meta name="keywords" content="keyinput, input, documentation"><title>Input Handling</title><link rel="stylesheet" href="./asciidoctor.css">
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
- <link rel="stylesheet" href="./coderay-asciidoctor.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/2/docsearch.min.css"></head><body class="article toc2 toc-left"><div id="header"><div id="toolbar"><a href="https://github.com/jMonkeyEngine/wiki/edit/master/src/docs/asciidoc/jme3/advanced/input_handling.adoc"><i class="fa fa-pencil-square" aria-hidden="true"></i></a><a href="https://github.com/jMonkeyEngine/wiki/new/master/src/docs/asciidoc/jme3/advanced/"><i class="fa fa-plus-square" aria-hidden="true"></i></a><input dir="auto" style="position: relative; vertical-align: top;" spellcheck="false" autocomplete="off" class="searchbox__input aa-input" id="doc-search" name="search" placeholder="Search in the doc" required="required" type="search"></div><h1>Input Handling</h1><div class="details"><span class="author" id="author"></span><br><span id="revnumber">version ,</span> <span id="revdate">2016/03/17 20:48</span></div><div id="toc" class="toc2"><div id="toctitle">Table of Contents</div><ul class="sectlevel1"><li><a href="#code-samples">Code Samples</a></li><li><a href="#1-choose-trigger">1. Choose Trigger</a></li><li><a href="#2-remove-default-trigger-mappings">2. Remove Default Trigger Mappings</a></li><li><a href="#3-add-custom-trigger-mapping">3. Add Custom Trigger Mapping</a></li><li><a href="#4-create-listeners">4. Create Listeners</a><ul class="sectlevel2"><li><a href="#actionlistener">ActionListener</a></li><li><a href="#analoglistener">AnalogListener</a></li></ul></li><li><a href="#4-register-mappings-to-listeners">4. Register Mappings to Listeners</a></li><li><a href="#5-implement-actions-in-listeners">5. Implement Actions in Listeners</a><ul class="sectlevel2"><li><a href="#actionlistener-2">ActionListener</a></li><li><a href="#analoglistener-2">AnalogListener</a></li></ul></li><li><a href="#let-users-remap-keys">Let Users Remap Keys</a></li></ul></div></div><div id="content"><div id="preamble"><div class="sectionbody"><div class="paragraph"><p>Users interact with your jME3 application with different input devices – the mouse, the keyboard, or a joystick. To respond to inputs we use the <code>inputManager</code> object in <code>SimpleApplication</code>.</p></div>
- <div class="paragraph"><p>This is how you add interaction to your game:</p></div>
- <div class="olist arabic"><ol class="arabic"><li><p>For each action, choose the trigger(s) (a key or mouse click etc)</p></li><li><p>For each action, add a trigger mapping to the inputManager</p></li><li><p>Create at least one listener in SimpleApplication</p></li><li><p>For each action, register its mappings to a listener</p></li><li><p>Implement each action in the listener</p></li></ol></div></div></div>
- <div class="sect1"><h2 id="code-samples">Code Samples</h2><div class="sectionbody"><div class="ulist"><ul><li><p><a href="https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/input/TestControls.java">TestControls.java</a></p></li><li><p><a href="https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/input/TestJoystick.java">TestJoystick.java</a></p></li></ul></div></div></div>
- <div class="sect1"><h2 id="1-choose-trigger">1. Choose Trigger</h2><div class="sectionbody"><div class="paragraph"><p>Choose one or several key/mouse events for the interaction. We use <code>KeyTrigger</code>, <code>MouseAxisTrigger</code>, <code>MouseButtonTrigger</code>, <code>JoyAxisTrigger</code> and <code>JoyButtonTrigger</code> constants from the <code>com.jme3.input.controls</code> package.</p></div>
- <div class="paragraph"><p><strong>Note:</strong> The MouseAxis and JoyAxis triggers go along the X axis (right/left) or Y axis (up/down). These Triggers come with extra booleans for the negative half of the axis (left, down). Remember to write code that listens to the negative (true) and positive (false) axis!</p></div>
- <table class="tableblock frame-all grid-all spread"><colgroup><col style="width: 50%;"><col style="width: 50%;"></colgroup><thead><tr><th class="tableblock halign-left valign-top">Trigger</th><th class="tableblock halign-left valign-top">Code</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Mouse button: Left Click</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>MouseButtonTrigger(MouseInput.BUTTON_LEFT)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Mouse button: Right Click</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>MouseButtonTrigger(MouseInput.BUTTON_RIGHT)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Mouse button: Middle Click</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>MouseButtonTrigger(MouseInput.BUTTON_MIDDLE)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Mouse movement: Right</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>MouseAxisTrigger(MouseInput.AXIS_X, true)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Mouse movement: Left</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>MouseAxisTrigger(MouseInput.AXIS_X, false)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Mouse movement: Up</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>MouseAxisTrigger(MouseInput.AXIS_Y, true)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Mouse movement: Down</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>MouseAxisTrigger(MouseInput.AXIS_Y, false)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Mouse wheel: Up</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>MouseAxisTrigger(MouseInput.AXIS_WHEEL,false)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Mouse wheel: Down</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>MouseAxisTrigger(MouseInput.AXIS_WHEEL,true)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>NumPad: 1, 2, 3, …</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KeyTrigger(KeyInput.KEY_NUMPAD1) …</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Keyboard: 1, 2 , 3, …</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KeyTrigger(KeyInput.KEY_1) …</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Keyboard: A, B, C, …</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KeyTrigger(KeyInput.KEY_A) …</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Keyboard: Spacebar</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KeyTrigger(KeyInput.KEY_SPACE)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Keyboard: Shift</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KeyTrigger(KeyInput.KEY_RSHIFT), +KeyTrigger(KeyInput.KEY_LSHIFT)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Keyboard: F1, F2, …</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KeyTrigger(KeyInput.KEY_F1) …</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Keyboard: Return, Enter</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KeyTrigger(KeyInput.KEY_RETURN), +KeyTrigger(KeyInput.KEY_NUMPADENTER)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Keyboard: PageUp, PageDown</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KeyTrigger(KeyInput.KEY_PGUP), +KeyTrigger(KeyInput.KEY_PGDN)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Keyboard: Delete, Backspace</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KeyTrigger(KeyInput.KEY_BACK), +KeyTrigger(KeyInput.KEY_DELETE)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Keyboard: Escape</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KeyTrigger(KeyInput.KEY_ESCAPE)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Keyboard: Arrows</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KeyTrigger(KeyInput.KEY_DOWN), +KeyTrigger(KeyInput.KEY_UP) +KeyTrigger(KeyInput.KEY_LEFT), KeyTrigger(KeyInput.KEY_RIGHT)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Joystick Button:</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>JoyButtonTrigger(0, JoyInput.AXIS_POV_X), +JoyButtonTrigger(0, JoyInput.AXIS_POV_Y) ?</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Joystick Movement: Right</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>JoyAxisTrigger(0, JoyInput.AXIS_POV_X, true)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Joystick Movement: Left</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>JoyAxisTrigger(0, JoyInput.AXIS_POV_X, false)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Joystick Movement: Forward</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>JoyAxisTrigger(0, JoyInput.AXIS_POV_Z, true)</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Joystick Movement: Backward</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>JoyAxisTrigger(0, JoyInput.AXIS_POV_Z, false)</p></div></div></td></tr></tbody></table>
- <div class="paragraph"><p>In your IDE, use code completion to quickly look up Trigger literals. In the jMonkeyEngine SDK for example, press ctrl-space or ctrl-/ after <code>KeyInput.|</code> to choose from the list of all keys.</p></div></div></div>
- <div class="sect1"><h2 id="2-remove-default-trigger-mappings">2. Remove Default Trigger Mappings</h2><div class="sectionbody"><div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code>inputManager.deleteMapping( SimpleApplication.INPUT_MAPPING_MEMORY );</code></pre></div></div>
- <table class="tableblock frame-all grid-all spread"><colgroup><col style="width: 33.3333%;"><col style="width: 33.3333%;"><col style="width: 33.3334%;"></colgroup><thead><tr><th class="tableblock halign-left valign-top">Default Mapping</th><th class="tableblock halign-left valign-top">Key</th><th class="tableblock halign-left valign-top">Description</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>INPUT_MAPPING_HIDE_STATS</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>F5</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Hides the statistics in the bottom left.</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>INPUT_MAPPING_CAMERA_POS</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KEY_C</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Prints debug output about the camera.</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>INPUT_MAPPING_MEMORY</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KEY_M</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Prints debug output for memory usage.</p></div></div></td></tr><tr><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>INPUT_MAPPING_EXIT</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>KEY_ESCAPE</p></div></div></td><td class="tableblock halign-left valign-top"><div><div class="paragraph"><p>Closes the application by calling <code>stop();</code>. Typically you do not remove this, unless you replace it by another way of quitting gracefully.</p></div></div></td></tr></tbody></table></div></div>
- <div class="sect1"><h2 id="3-add-custom-trigger-mapping">3. Add Custom Trigger Mapping</h2><div class="sectionbody"><div class="paragraph"><p>When initializing the application, add a Mapping for each Trigger.</p></div>
- <div class="paragraph"><p>Give the mapping a meaningful name. The name should reflect the action, not the button/key (because buttons/keys can change). Here some examples:</p></div>
- <div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java">inputManager.addMapping(<span class="string"><span class="delimiter">"</span><span class="content">Pause Game</span><span class="delimiter">"</span></span>, <span class="keyword">new</span> KeyTrigger(KeyInput.KEY_P));
- inputManager.addMapping(<span class="string"><span class="delimiter">"</span><span class="content">Rotate</span><span class="delimiter">"</span></span>, <span class="keyword">new</span> KeyTrigger(KeyInput.KEY_SPACE));
- ...</code></pre></div></div>
- <div class="paragraph"><p>There are cases where you may want to provide more then one trigger for one action. For example, some users prefer the WASD keys to navigate, while others prefer the arrow keys. Add several triggers for one mapping, by separating the Trigger objects with commas:</p></div>
- <div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java">inputManager.addMapping(<span class="string"><span class="delimiter">"</span><span class="content">Left</span><span class="delimiter">"</span></span>, <span class="keyword">new</span> KeyTrigger(KeyInput.KEY_A),
- <span class="keyword">new</span> KeyTrigger(KeyInput.KEY_LEFT)); <span class="comment">// A and left arrow</span>
- inputManager.addMapping(<span class="string"><span class="delimiter">"</span><span class="content">Right</span><span class="delimiter">"</span></span>, <span class="keyword">new</span> KeyTrigger(KeyInput.KEY_D),
- <span class="keyword">new</span> KeyTrigger(KeyInput.KEY_RIGHT)); <span class="comment">// D and right arrow</span>
- ...</code></pre></div></div></div></div>
- <div class="sect2"><h3 id="4-create-listeners">4. Create Listeners</h3><div class="paragraph"><p>The jME3 input manager supports two types of event listeners for inputs: AnalogListener and ActionListener. You can use one or both listeners in the same application. Add one or both of the following code snippets to your main SimpleApplication-based class to activate the listeners.</p></div>
- <div class="paragraph"><p><strong>Note:</strong> The two input listeners do not know, and do not care, which actual key was pressed. They only know which <em>named input mapping</em> was triggered.</p></div>
- <div class="sect2"><h3 id="actionlistener">ActionListener</h3><div class="paragraph"><p><code>com.jme3.input.controls.ActionListener</code></p></div>
- <div class="ulist"><ul><li><p>Use for absolute “button pressed or released?, “on or off? actions.</p><div class="ulist"><ul><li><p>Examples: Pause/unpause, a rifle or revolver shot, jump, click to select.</p></li></ul></div></li><li><p>JME gives you access to:</p><div class="ulist"><ul><li><p>The mapping name of the triggered action.</p></li><li><p>A boolean whether the trigger is still pressed or has just been released.</p></li><li><p>A float of the current time-per-frame as timing factor</p></li></ul></div></li></ul></div>
- <div class="paragraph"><p>*</p></div>
- <div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java"><span class="directive">private</span> <span class="predefined-type">ActionListener</span> actionListener = <span class="keyword">new</span> <span class="predefined-type">ActionListener</span>() {
- <span class="directive">public</span> <span class="type">void</span> onAction(<span class="predefined-type">String</span> name, <span class="type">boolean</span> keyPressed, <span class="type">float</span> tpf) {
- <span class="comment">/** TODO: test for mapping names and implement actions */</span>
- }
- };</code></pre></div></div></div>
- <div class="sect2"><h3 id="analoglistener">AnalogListener</h3><div class="paragraph"><p><code>com.jme3.input.controls.AnalogListener</code></p></div>
- <div class="ulist"><ul><li><p>Use for continuous and gradual actions.</p><div class="ulist"><ul><li><p>Examples: Walk, run, rotate, accelerate vehicle, strafe, (semi-)automatic weapon shot</p></li></ul></div></li><li><p>JME gives you access to:</p><div class="ulist"><ul><li><p>The mapping name of the triggered action.</p></li><li><p>A gradual float value between how long the trigger has been pressed.</p></li><li><p>A float of the current time-per-frame as timing factor</p></li></ul></div></li></ul></div>
- <div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java"><span class="directive">private</span> AnalogListener analogListener = <span class="keyword">new</span> AnalogListener() {
- <span class="directive">public</span> <span class="type">void</span> onAnalog(<span class="predefined-type">String</span> name, <span class="type">float</span> keyPressed, <span class="type">float</span> tpf) {
- <span class="comment">/** TODO: test for mapping names and implement actions */</span>
- }
- };</code></pre></div></div></div></div>
- <div class="sect1"><h2 id="4-register-mappings-to-listeners">4. Register Mappings to Listeners</h2><div class="sectionbody"><div class="paragraph"><p>To activate the mappings, you must register them to a Listener. Write your registration code after the code block where you have added the mappings to the inputManager.</p></div>
- <div class="paragraph"><p>In the following example, you register the “Pause Game mapping to the <code>actionListener</code> object, because pausing a game is in “either/or decision.</p></div>
- <div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java">inputManager.addListener(actionListener, <span class="keyword">new</span> <span class="predefined-type">String</span><span class="type">[]</span>{<span class="string"><span class="delimiter">"</span><span class="content">Pause Game</span><span class="delimiter">"</span></span>});</code></pre></div></div>
- <div class="paragraph"><p>In the following example, you register navigational mappings to the <code>analogListener</code> object, because walking is a continuous action. Players typically keep the key pressed to express continuity, for example when they want to “walk on or “accelerate.</p></div>
- <div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java">inputManager.addListener(analogListener, <span class="keyword">new</span> <span class="predefined-type">String</span><span class="type">[]</span>{<span class="string"><span class="delimiter">"</span><span class="content">Left</span><span class="delimiter">"</span></span>, <span class="string"><span class="delimiter">"</span><span class="content">Right</span><span class="delimiter">"</span></span>});</code></pre></div></div>
- <div class="paragraph"><p>As you see, you can add several listeners in one String array. You can call the addListener() method more than once, each time with a subset of your list, if that helps you keep you code tidy. Again, the Listeners do not care about actual which keys are configured, you only register named trigger mappings.</p></div>
- <div class="admonitionblock tip"><table><tr><td class="icon"><i class="fa icon-tip" title="Tip"></i></td><td class="content"><div class="paragraph"><p>Did you register an action, but it does not work? Check the string’s capitalization and spelling, it’s case sensitive!</p></div></td></tr></table></div></div></div>
- <div class="sect2"><h3 id="5-implement-actions-in-listeners">5. Implement Actions in Listeners</h3><div class="paragraph"><p>You specify the action to be triggered where it says TODO in the Listener code snippets. Typically, you write a series of if/else conditions, testing for all the mapping names, and then calling the respective action.</p></div>
- <div class="paragraph"><p>Make use of the distinction between <code>if</code> and <code>else if</code> in this conditional.</p></div>
- <div class="ulist"><ul><li><p>If several actions can be triggered simultaneously, test for all of these with a series of bare `if`s. For example, a character can be running forward <em>and</em> to the left.</p></li><li><p>If certain actions exclude one another, test for them with <code>else if</code>, the the rest of the exclusive tests can be skipped and you save some miliseconds. For example, you either shoot or pick something up.</p></li></ul></div>
- <div class="sect2"><h3 id="actionlistener-2">ActionListener</h3><div class="paragraph"><p>In the most common case, you want an action to be triggered once, in the moment when the button or key trigger is released. For example, when the player presses a key to open a door, or clicks to pick up an item. For these cases, use an ActionListener and test for <code>&& !keyPressed</code>, like shown in the following example.</p></div>
- <div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java"><span class="directive">private</span> <span class="predefined-type">ActionListener</span> actionListener = <span class="keyword">new</span> <span class="predefined-type">ActionListener</span>() {
- <span class="directive">public</span> <span class="type">void</span> onAction(<span class="predefined-type">String</span> name, <span class="type">boolean</span> keyPressed, <span class="type">float</span> tpf) {
- <span class="keyword">if</span> (name.equals(<span class="string"><span class="delimiter">"</span><span class="content">Pause Game</span><span class="delimiter">"</span></span>) && !keyPressed) { <span class="comment">// test?</span>
- isRunning = !isRunning; <span class="comment">// action!</span>
- }
- <span class="keyword">if</span> ...
- }
- };</code></pre></div></div></div>
- <div class="sect2"><h3 id="analoglistener-2">AnalogListener</h3><div class="paragraph"><p>The following example shows how you define actions with an AnalogListener. These actions are triggered continuously, as long (intensity <code>value</code>) as the named key or mouse button is down. Use this listeners for semi-automatic weapons and navigational actions.</p></div>
- <div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java"><span class="directive">private</span> AnalogListener analogListener = <span class="keyword">new</span> AnalogListener() {
- <span class="directive">public</span> <span class="type">void</span> onAnalog(<span class="predefined-type">String</span> name, <span class="type">float</span> value, <span class="type">float</span> tpf) {
- <span class="keyword">if</span> (name.equals(<span class="string"><span class="delimiter">"</span><span class="content">Rotate</span><span class="delimiter">"</span></span>)) { <span class="comment">// test?</span>
- player.rotate(<span class="integer">0</span>, value*speed, <span class="integer">0</span>); <span class="comment">// action!</span>
- }
- <span class="keyword">if</span> ...
- }
- };</code></pre></div></div></div></div>
- <div class="sect1"><h2 id="let-users-remap-keys">Let Users Remap Keys</h2><div class="sectionbody"><div class="paragraph"><p>It is likely that your players have different keyboard layouts, are used to “reversed mouse navigation, or prefer different navigational keys than the ones that you defined. You should create an options screen that lets users customize their mouse/key triggers for your mappings. Replace the trigger literals in the <code>inputManager.addMapping()</code> lines with variables, and load sets of triggers when the game starts.</p></div>
- <div class="paragraph"><p>The abstraction of separating triggers and mappings has the advantage that you can remap triggers easily. Your code only needs to remove and add some trigger mappings. The core of the code (the listeners and actions) remains unchanged.</p></div></div></div></div><div id="footer"><div id="footer-text">Version <br>Last updated 2016-07-22 07:15:15 UTC</div></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/2/docsearch.min.js"></script><script>docsearch({
- apiKey: 'a736b6d93de805e26ec2f49b55013fbd',
- indexName: 'jmonkeyengine',
- inputSelector: '#doc-search',
- debug: false // Set debug to true if you want to inspect the dropdown
- });</script></body></html>
|