ACSUtils Wiki

An ACS library for ZDoom-based ports

User Tools

Site Tools


new:input

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
new:input [2018/02/16 23:20] korshunnew:input [2018/02/17 14:10] (current) korshun
Line 1: Line 1:
-====== Input functions ======+====== Input library ======
  
 ACSUtils provides a set of wrappers for [[zdoom>GetPlayerInput]] to make writing correct input code easier. ACSUtils provides a set of wrappers for [[zdoom>GetPlayerInput]] to make writing correct input code easier.
Line 5: Line 5:
 ===== Basic concepts ===== ===== Basic concepts =====
  
-Every key is either **up** or **down** at any time. +  * Every key is either **up** or **down** at any time. 
- +  If the key was up the previous tic, but is now down, it is said to have been **pressed**. 
-If the key was **up** the previous tic, but is now **down**, it is said to have been **pressed**. +  If the key was down the previous tic, but is now up, it is said to have been **released**. 
- +  If the key has been pressed or released, it is said to have been **toggled**.
-If the key was **down** the previous tic, but is now **up**, it is said to have been **released**. +
- +
-If the key has been **pressed or released**, it is said to have been **toggled**.+
  
 ACSUtils provide a way to easily check these all these states for every key without writing compliated ''GetPlayerInput'' expressions. ACSUtils provide a way to easily check these all these states for every key without writing compliated ''GetPlayerInput'' expressions.
Line 17: Line 14:
 ===== What's the point of "pressed" and "released"? ===== ===== What's the point of "pressed" and "released"? =====
  
-If you want to detect if the player has pressed the key just once, you can't do so just by checking if they key is down like this:+Say, you have an on-screen button to sell items that can be [[mouse|clicked with mouse]]:
  
 <code> <code>
-// This code is bugged. +if (/* check that mouse cursor is inside the button */) 
-if (GetPlayerInput(-1, INPUT_BUTTONS) & BT_X+    if (GetPlayerInput(-1, INPUT_BUTTONS) & BT_ATTACK)) // check left mouse button click 
-    print("You pressed X once");+        SellItem();
 </code> </code>
  
-The key will be down for some time after the presscausing the condition to trigger multiple times. To avoid this, you need to check whether the key was up the previous tic, which is exactly what ''KeyPressed'' checks:+**This code is wrong.** If the player clicks the button once, it will likely cause him to sell multiple items. That's because this code checks if the mouse button is **down**. But the mouse button may be down for multiple tics after a clickas it may not be immediately released. 
 + 
 +To avoid this bug, you need to check if the button was up the previous tic, but is now down. And that'exactly what the **pressed** state means. The ''KeyPressed'' function contains all the repetitive code to perform this check:
  
 <code> <code>
-if (KeyPressed(BT_X)) +if (/* check that mouse cursor is inside the button */) 
-    print("You pressed X once");+    if (KeyPressed(BT_ATTACK)) // check left mouse button click 
 +        SellItem();
 </code> </code>
  
-The same goes for **released** state.+Now the button works correctly. Performing an action on releasing the button can be done the same way using ''KeyReleased''.
  
 ===== Functions ===== ===== Functions =====
Line 49: Line 49:
  
 <code> <code>
-if (KeyPressed(BT_FORWARD)) +if (KeyPressed(BT_ATTACK)) 
-    print(s:"You just pressed W");+    print(s:"You clicked left mouse button");
 </code> </code>
  
Line 81: Line 81:
  
 <code> <code>
-if (KeyDown(BT_FORWARD | BT_BACK | BT_MOVELEFT | BT_MOVERIGHT))+if (KeyDownAny(BT_FORWARD | BT_BACK | BT_MOVELEFT | BT_MOVERIGHT))
     print(s:"You are trying to move.");     print(s:"You are trying to move.");
 </code> </code>
  
  
-To use these wrappers on players other than the activator, prefix any function with ''Player'' and add player number as the first argument:+To use these wrappers on players other than the activator, prefix any of the above functions with ''Player'' and add player number as the first argument:
  
   * ''bool PlayerKeyUp(int player, int key)''   * ''bool PlayerKeyUp(int player, int key)''
new/input.1518816050.txt.gz · Last modified: 2018/02/16 23:20 by korshun