Last active
August 25, 2020 20:13
-
-
Save ligabloo/3c0dcc6479a80442d6a64100a715a259 to your computer and use it in GitHub Desktop.
An initial implementation of keyboard state for my ECSY game.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class KeyState { | |
isPressed: boolean; | |
timeSinceChanged: number; | |
constructor(isPressed) { | |
this.isPressed = isPressed; | |
this.timeSinceChanged = 0; | |
} | |
} | |
type KeyboardComponentProps = { | |
keys: Map<number, KeyState>; | |
}; | |
class KeyboardComponent extends Component<KeyboardComponentProps> { | |
static schema = { | |
keys: { type: Types.Ref, default: new Map() }, | |
}; | |
setKey = (keyCode: number, isPressed: boolean) => { | |
let key: KeyState; | |
if (this.keys.has(keyCode)) { | |
key = this.keys.get(keyCode); | |
const hasStateChanged = key.isPressed != isPressed; | |
if (hasStateChanged) key.timeSinceChanged = 0; | |
key.isPressed = isPressed; | |
} else { | |
key = new KeyState(isPressed); | |
} | |
console.log(key); | |
this.keys.set(keyCode, key); | |
}; | |
getKey = (keyCode) => { | |
this.keys.get(keyCode); | |
}; | |
setKeyFromEvent = (event: KeyboardEvent) => { | |
const { keyCode, type } = event; | |
const isPressed = type === "keydown"; | |
this.setKey(keyCode, isPressed); | |
}; | |
keys: Map<number, KeyState>; | |
} | |
class KeyboardSystem extends System { | |
static queries = { | |
keyboard: { | |
components: [KeyboardComponent], | |
listen: { | |
added: true, | |
removed: true, | |
}, | |
}, | |
}; | |
execute(delta): void { | |
const { added, removed, results } = this.queries.keyboard; | |
added.forEach((entity) => { | |
const keyboard = entity.getComponent<KeyboardComponent>(KeyboardComponent); | |
window.addEventListener("keydown", keyboard.setKeyFromEvent); | |
window.addEventListener("keyup", keyboard.setKeyFromEvent); | |
}); | |
removed.forEach((entity) => { | |
const keyboard = entity.getComponent<KeyboardComponent>(KeyboardComponent); | |
window.removeEventListener("keydown", keyboard.setKeyFromEvent); | |
window.removeEventListener("keyup", keyboard.setKeyFromEvent); | |
}); | |
results.forEach((entity) => { | |
const keyboard = entity.getComponent<KeyboardComponent>(KeyboardComponent); | |
keyboard.keys.forEach((key) => { | |
key.timeSinceChanged += delta; | |
}); | |
}); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment