1 module re.input.virtual.button; 2 3 import re.input; 4 import std.algorithm; 5 6 /// a virtual button 7 class VirtualButton : VirtualInput { 8 /// monitors a single button 9 static abstract class Node : VirtualInput.Node { 10 @property public bool is_down(); 11 @property public bool is_up(); 12 @property public bool is_pressed(); 13 @property public bool is_released(); 14 } 15 16 /// logic-controllable button 17 static class LogicButton : Node { 18 public bool logic_pressed = false; 19 20 @property public override bool is_down() { return logic_pressed; } 21 @property public override bool is_up() { return !logic_pressed; } 22 @property public override bool is_pressed() { return logic_pressed; } 23 @property public override bool is_released() { return !logic_pressed; } 24 } 25 26 /// monitors a keyboard key 27 static class KeyboardKey : Node { 28 /// the key being monitored 29 public Keys key; 30 31 /// creates a keyboard key node 32 this(Keys key) { 33 this.key = key; 34 } 35 36 @property public override bool is_down() { 37 return Input.is_key_down(key); 38 } 39 40 @property public override bool is_up() { 41 return Input.is_key_up(key); 42 } 43 44 @property public override bool is_pressed() { 45 return Input.is_key_pressed(key); 46 } 47 48 @property public override bool is_released() { 49 return Input.is_key_released(key); 50 } 51 } 52 53 @property public bool is_down() { 54 return nodes.any!(x => (cast(Node) x).is_down); 55 } 56 57 @property public bool is_up() { 58 return nodes.any!(x => (cast(Node) x).is_up); 59 } 60 61 @property public bool is_pressed() { 62 return nodes.any!(x => (cast(Node) x).is_pressed); 63 } 64 65 @property public bool is_released() { 66 return nodes.any!(x => (cast(Node) x).is_released); 67 } 68 } 69 70 @("input-button") 71 unittest { 72 auto the_button = new VirtualButton(); 73 the_button.nodes ~= new VirtualButton.KeyboardKey(Keys.KEY_E); 74 75 assert(the_button.nodes.length > 0); 76 }