Przeglądaj źródła

implemented KeyState

Daniel Salvadori 7 lat temu
rodzic
commit
d0c132be4d
2 zmienionych plików z 182 dodań i 0 usunięć
  1. 10 0
      util/application/application.go
  2. 172 0
      util/application/keystate.go

+ 10 - 0
util/application/application.go

@@ -37,6 +37,7 @@ type Application struct {
 	camera            camera.ICamera        // Current camera
 	orbit             *control.OrbitControl // Camera orbit controller
 	frameRater        *FrameRater           // Render loop frame rater
+	keyState          *KeyState             // State of keys
 	audioDev          *al.Device            // Default audio device
 	scene             *core.Node            // Node container for 3D tests
 	guiroot           *gui.Root             // Gui root panel
@@ -179,6 +180,9 @@ func Create(ops Options) (*Application, error) {
 	app.gl.ClearColor(cc.R, cc.G, cc.B, 1)
 	app.gl.Clear(gls.DEPTH_BUFFER_BIT | gls.STENCIL_BUFFER_BIT | gls.COLOR_BUFFER_BIT)
 
+	// Creates KeyState
+	app.keyState = NewKeyState(win)
+
 	// Creates perspective camera
 	width, height := app.win.Size()
 	aspect := float32(width) / float32(height)
@@ -245,6 +249,12 @@ func (app *Application) Window() window.IWindow {
 	return app.win
 }
 
+// KeyState returns the application KeyState
+func (app *Application) KeyState() *KeyState {
+
+	return app.keyState
+}
+
 // Gl returns the OpenGL state
 func (app *Application) Gl() *gls.GLS {
 

+ 172 - 0
util/application/keystate.go

@@ -0,0 +1,172 @@
+package application
+
+import (
+	"github.com/g3n/engine/window"
+)
+
+// KeyState keeps track of the state of all keys.
+type KeyState struct {
+	win    window.IWindow
+	states map[window.Key]bool
+}
+
+// NewKeyState returns a new KeyState object.
+func NewKeyState(win window.IWindow) *KeyState {
+
+	ks := new(KeyState)
+	ks.win = win
+	ks.states = map[window.Key]bool{
+		window.KeyUnknown      : false,
+		window.KeySpace        : false,
+		window.KeyApostrophe   : false,
+		window.KeyComma        : false,
+		window.KeyMinus        : false,
+		window.KeyPeriod       : false,
+		window.KeySlash        : false,
+		window.Key0            : false,
+		window.Key1            : false,
+		window.Key2            : false,
+		window.Key3            : false,
+		window.Key4            : false,
+		window.Key5            : false,
+		window.Key6            : false,
+		window.Key7            : false,
+		window.Key8            : false,
+		window.Key9            : false,
+		window.KeySemicolon    : false,
+		window.KeyEqual        : false,
+		window.KeyA            : false,
+		window.KeyB            : false,
+		window.KeyC            : false,
+		window.KeyD            : false,
+		window.KeyE            : false,
+		window.KeyF            : false,
+		window.KeyG            : false,
+		window.KeyH            : false,
+		window.KeyI            : false,
+		window.KeyJ            : false,
+		window.KeyK            : false,
+		window.KeyL            : false,
+		window.KeyM            : false,
+		window.KeyN            : false,
+		window.KeyO            : false,
+		window.KeyP            : false,
+		window.KeyQ            : false,
+		window.KeyR            : false,
+		window.KeyS            : false,
+		window.KeyT            : false,
+		window.KeyU            : false,
+		window.KeyV            : false,
+		window.KeyW            : false,
+		window.KeyX            : false,
+		window.KeyY            : false,
+		window.KeyZ            : false,
+		window.KeyLeftBracket  : false,
+		window.KeyBackslash    : false,
+		window.KeyRightBracket : false,
+		window.KeyGraveAccent  : false,
+		window.KeyWorld1       : false,
+		window.KeyWorld2       : false,
+		window.KeyEscape       : false,
+		window.KeyEnter        : false,
+		window.KeyTab          : false,
+		window.KeyBackspace    : false,
+		window.KeyInsert       : false,
+		window.KeyDelete       : false,
+		window.KeyRight        : false,
+		window.KeyLeft         : false,
+		window.KeyDown         : false,
+		window.KeyUp           : false,
+		window.KeyPageUp       : false,
+		window.KeyPageDown     : false,
+		window.KeyHome         : false,
+		window.KeyEnd          : false,
+		window.KeyCapsLock     : false,
+		window.KeyScrollLock   : false,
+		window.KeyNumLock      : false,
+		window.KeyPrintScreen  : false,
+		window.KeyPause        : false,
+		window.KeyF1           : false,
+		window.KeyF2           : false,
+		window.KeyF3           : false,
+		window.KeyF4           : false,
+		window.KeyF5           : false,
+		window.KeyF6           : false,
+		window.KeyF7           : false,
+		window.KeyF8           : false,
+		window.KeyF9           : false,
+		window.KeyF10          : false,
+		window.KeyF11          : false,
+		window.KeyF12          : false,
+		window.KeyF13          : false,
+		window.KeyF14          : false,
+		window.KeyF15          : false,
+		window.KeyF16          : false,
+		window.KeyF17          : false,
+		window.KeyF18          : false,
+		window.KeyF19          : false,
+		window.KeyF20          : false,
+		window.KeyF21          : false,
+		window.KeyF22          : false,
+		window.KeyF23          : false,
+		window.KeyF24          : false,
+		window.KeyF25          : false,
+		window.KeyKP0          : false,
+		window.KeyKP1          : false,
+		window.KeyKP2          : false,
+		window.KeyKP3          : false,
+		window.KeyKP4          : false,
+		window.KeyKP5          : false,
+		window.KeyKP6          : false,
+		window.KeyKP7          : false,
+		window.KeyKP8          : false,
+		window.KeyKP9          : false,
+		window.KeyKPDecimal    : false,
+		window.KeyKPDivide     : false,
+		window.KeyKPMultiply   : false,
+		window.KeyKPSubtract   : false,
+		window.KeyKPAdd        : false,
+		window.KeyKPEnter      : false,
+		window.KeyKPEqual      : false,
+		window.KeyLeftShift    : false,
+		window.KeyLeftControl  : false,
+		window.KeyLeftAlt      : false,
+		window.KeyLeftSuper    : false,
+		window.KeyRightShift   : false,
+		window.KeyRightControl : false,
+		window.KeyRightAlt     : false,
+		window.KeyRightSuper   : false,
+		window.KeyMenu         : false,
+	}
+
+	// Subscribe to window key events
+	ks.win.SubscribeID(window.OnKeyUp, &ks, ks.onKey)
+	ks.win.SubscribeID(window.OnKeyDown, &ks, ks.onKey)
+
+	return ks
+}
+
+// Dispose unsubscribes from the window events.
+func (ks *KeyState) Dispose() {
+
+	ks.win.UnsubscribeID(window.OnKeyUp, &ks)
+	ks.win.UnsubscribeID(window.OnKeyDown, &ks)
+}
+
+// Pressed returns whether the specified key is currently pressed.
+func (ks *KeyState) Pressed(k window.Key) bool {
+
+	return ks.states[k]
+}
+
+// onKey receives key events and updates the internal map of states.
+func (ks *KeyState) onKey(evname string, ev interface{}) {
+
+	kev := ev.(*window.KeyEvent)
+	switch evname {
+	case window.OnKeyUp:
+		ks.states[kev.Keycode] = false
+	case window.OnKeyDown:
+		ks.states[kev.Keycode] = true
+	}
+}