Skip to content

Instantly share code, notes, and snippets.

@ligabloo
Last active August 25, 2020 20:13
Show Gist options
  • Save ligabloo/3c0dcc6479a80442d6a64100a715a259 to your computer and use it in GitHub Desktop.
Save ligabloo/3c0dcc6479a80442d6a64100a715a259 to your computer and use it in GitHub Desktop.
An initial implementation of keyboard state for my ECSY game.
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