A hackable template for creating small and fast browser games.
at main 57 lines 1.9 kB view raw
1import {pointer_clicked} from "../../lib/input.js"; 2import {Entity} from "../../lib/world.js"; 3import {SelectedState} from "../components/com_selectable.js"; 4import {Game} from "../game.js"; 5import {Has} from "../world.js"; 6 7const QUERY = Has.Transform | Has.Selectable | Has.Children; 8 9export function sys_select(game: Game, delta: number) { 10 for (let i = 0; i < game.World.Signature.length; i++) { 11 if ((game.World.Signature[i] & QUERY) == QUERY) { 12 update(game, i); 13 } 14 } 15 16 game.Selected = undefined; 17 for (let i = 0; i < game.World.Signature.length; i++) { 18 if ((game.World.Signature[i] & QUERY) == QUERY) { 19 let selectable = game.World.Selectable[i]; 20 if (selectable.Selected) { 21 game.Selected = i; 22 } 23 } 24 } 25} 26 27function update(game: Game, entity: Entity) { 28 let selectable = game.World.Selectable[entity]; 29 30 if (selectable.Selected === SelectedState.ThisFrame) { 31 selectable.Selected = SelectedState.Currently; 32 } 33 34 if (pointer_clicked(game, 0, 0)) { 35 // When the user left-clicks… 36 37 if (game.Picked?.Entity === entity) { 38 if (selectable.Selected === SelectedState.None) { 39 // …select. 40 selectable.Selected = SelectedState.ThisFrame; 41 game.World.Signature[entity] |= Has.ControlPlayer; 42 } 43 } else if (selectable.Selected > SelectedState.None) { 44 // …deselect. 45 selectable.Selected = SelectedState.None; 46 game.World.Signature[entity] &= ~Has.ControlPlayer; 47 } 48 } else if (pointer_clicked(game, 2, 1)) { 49 // When the user right-clicks… 50 51 if (selectable.Selected > SelectedState.None) { 52 // …deselect. 53 selectable.Selected = SelectedState.None; 54 game.World.Signature[entity] &= ~Has.ControlPlayer; 55 } 56 } 57}