@benev/tact 0.4.0-4 → 0.4.0-6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -42
- package/package.json +1 -1
- package/s/index.html.ts +1 -1
- package/s/lib/ui/deck/setup/tact.ts +6 -2
- package/x/demo/main.bundle.min.js +64 -64
- package/x/demo/main.bundle.min.js.map +4 -4
- package/x/gamepad/index.html +1 -1
- package/x/index.html +3 -3
- package/x/index.html.js +1 -1
- package/x/index.html.js.map +1 -1
- package/x/lib/ui/deck/setup/tact.d.ts +2 -0
- package/x/lib/ui/deck/setup/tact.js +6 -2
- package/x/lib/ui/deck/setup/tact.js.map +1 -1
package/README.md
CHANGED
|
@@ -64,38 +64,12 @@ i made tact because i want to make indie web game development easier. user input
|
|
|
64
64
|
tact.gamepads("gamepad")
|
|
65
65
|
tact.registerElements()
|
|
66
66
|
```
|
|
67
|
-
- 💡 *set `maxPlayers` to 1 for single player.*
|
|
68
|
-
- 🍏 **
|
|
69
|
-
```html
|
|
70
|
-
<tact-deck></tact-deck>
|
|
71
|
-
```
|
|
72
|
-
- 💡 *you also have each panel, `<tact-controllers>` and `<tact-customize>`.*
|
|
73
|
-
- 💡 *you can customize the colors with css:*
|
|
74
|
-
```html
|
|
75
|
-
<style>
|
|
76
|
-
html {
|
|
77
|
-
--tact-prime: aqua;
|
|
78
|
-
--tact-bg: black;
|
|
79
|
-
}
|
|
80
|
-
</style>
|
|
81
|
-
```
|
|
82
|
-
- 🎉 **now users can configure controllers and customize bindings!**
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
<br/>
|
|
87
|
-
|
|
88
|
-
## 🎮 encoding, decoding, and your game logic.
|
|
89
|
-
|
|
90
|
-
- 🍏 **now it's time for the real action!**
|
|
67
|
+
- 💡 *you can set `maxPlayers` to 1 for single player.*
|
|
68
|
+
- 🍏 **encoding, decoding, and your game logic.**
|
|
91
69
|
```ts
|
|
92
|
-
import {Collector} from "@benev/tact"
|
|
93
|
-
|
|
94
|
-
const collector = new Collector(bindings)
|
|
95
|
-
|
|
96
70
|
setInterval(() => {
|
|
97
71
|
const buffer = tact.deck.hub.encodeAll()
|
|
98
|
-
for (const {playerId, inputs} of collector.decodeAll(buffer)) {
|
|
72
|
+
for (const {playerId, inputs} of tact.collector.decodeAll(buffer)) {
|
|
99
73
|
|
|
100
74
|
// your game logic can read these handy input values.
|
|
101
75
|
inputs.jump.value // values are numbers 0 to 1.
|
|
@@ -107,14 +81,30 @@ i made tact because i want to make indie web game development easier. user input
|
|
|
107
81
|
}
|
|
108
82
|
}, 16.67)
|
|
109
83
|
```
|
|
110
|
-
- 💡 *
|
|
111
|
-
- 💡 *maybe imagine
|
|
84
|
+
- 💡 *maybe imagine streaming the buffers across the network to a remote collector.*
|
|
85
|
+
- 💡 *maybe imagine the tact deck on the clientside, and the collector on the serverside (or a web worker!).*
|
|
86
|
+
- 🍏 **put the `<tact-deck>` element in your html page.**
|
|
87
|
+
```html
|
|
88
|
+
<tact-deck></tact-deck>
|
|
89
|
+
```
|
|
90
|
+
- 💡 *you also have each panel, `<tact-controllers>` and `<tact-customize>`.*
|
|
91
|
+
- 💡 *you can customize the colors with css.*
|
|
92
|
+
```html
|
|
93
|
+
<style>
|
|
94
|
+
html {
|
|
95
|
+
--tact-prime: aqua;
|
|
96
|
+
--tact-bg: black;
|
|
97
|
+
}
|
|
98
|
+
</style>
|
|
99
|
+
```
|
|
100
|
+
- 🎉 **you're done! your users can manage controllers and customize bindings!**
|
|
112
101
|
|
|
113
102
|
|
|
114
103
|
|
|
115
104
|
<br/>
|
|
116
105
|
|
|
117
106
|
## 🎮 get down to brass tacks.
|
|
107
|
+
> *tact is flexible and composable for alternative use-cases.*
|
|
118
108
|
|
|
119
109
|
- 🍏 **pov: your app isn't a game, no multiplayer, no gamepads.**
|
|
120
110
|
```ts
|
|
@@ -122,15 +112,15 @@ i made tact because i want to make indie web game development easier. user input
|
|
|
122
112
|
|
|
123
113
|
const tact = await setupTact({presets, maxPlayers: 1})
|
|
124
114
|
const controller = tact.mouseKeyboard()
|
|
125
|
-
tact.registerElements()
|
|
126
|
-
|
|
127
115
|
const decoder = new InputDecoder(bindings)
|
|
116
|
+
tact.registerElements()
|
|
128
117
|
|
|
129
118
|
setInterval(() => {
|
|
130
119
|
const inputs = decoder.decode(controller.encode())
|
|
131
120
|
|
|
132
|
-
//
|
|
133
|
-
|
|
121
|
+
// 🧙♂️ handle your inputs.
|
|
122
|
+
inputs.jump.value
|
|
123
|
+
|
|
134
124
|
}, 16.67)
|
|
135
125
|
```
|
|
136
126
|
- 💡 *then the only ui you need is the `<tact-customize>` panel (also available as a sly view `CustomizeView`).*
|
|
@@ -138,15 +128,17 @@ i made tact because i want to make indie web game development easier. user input
|
|
|
138
128
|
```ts
|
|
139
129
|
import {Controller, InputDecoder, KeyboardSource, PointerSource, Sources} from "@benev/tact"
|
|
140
130
|
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
source: new Sources(new KeyboardSource(), new PointerSource()),
|
|
144
|
-
})
|
|
145
|
-
|
|
131
|
+
const source = new Sources(new KeyboardSource(), new PointerSource())
|
|
132
|
+
const controller = new Controller({bindings, source})
|
|
146
133
|
const decoder = new InputDecoder(bindings)
|
|
147
134
|
|
|
148
|
-
|
|
149
|
-
|
|
135
|
+
setInterval(() => {
|
|
136
|
+
const inputs = decoder.decode(controller.encode())
|
|
137
|
+
|
|
138
|
+
// 🧙♂️ handle your inputs.
|
|
139
|
+
inputs.jump.value
|
|
140
|
+
|
|
141
|
+
}, 16.67)
|
|
150
142
|
```
|
|
151
143
|
|
|
152
144
|
|
package/package.json
CHANGED
package/s/index.html.ts
CHANGED
|
@@ -4,7 +4,7 @@ import {template, html, dataSvgEmoji, socialCard} from "@e280/scute"
|
|
|
4
4
|
const title = "@benev/tact"
|
|
5
5
|
const domain = "tact.benev.gg"
|
|
6
6
|
const favicon = "/assets/b.png"
|
|
7
|
-
const description = "🎮
|
|
7
|
+
const description = "🎮 from keypress to couch co-op"
|
|
8
8
|
|
|
9
9
|
export default template(import.meta.url, async orb => html`
|
|
10
10
|
<!doctype html>
|
|
@@ -3,6 +3,7 @@ import {register} from "@e280/sly"
|
|
|
3
3
|
|
|
4
4
|
import {setupDeck} from "./deck.js"
|
|
5
5
|
import {SetupParams} from "./types.js"
|
|
6
|
+
import {Collector} from "../collector.js"
|
|
6
7
|
import {Bindings} from "../../../input/types.js"
|
|
7
8
|
import {autoGamepads} from "../auto-gamepads.js"
|
|
8
9
|
import {ellipsis} from "../../../utils/ellipsis.js"
|
|
@@ -23,6 +24,8 @@ import gameControllerSvg from "../../icons/akar/game-controller.svg.js"
|
|
|
23
24
|
|
|
24
25
|
export async function setupTact<B extends Bindings>(params: SetupParams<B>) {
|
|
25
26
|
const deck = await setupDeck(params)
|
|
27
|
+
const first = firstPreset(deck.controls.presets)
|
|
28
|
+
const collector = new Collector(first.profile.bindings)
|
|
26
29
|
const visualizer = new Visualizer()
|
|
27
30
|
|
|
28
31
|
const elements = {
|
|
@@ -40,14 +43,14 @@ export async function setupTact<B extends Bindings>(params: SetupParams<B>) {
|
|
|
40
43
|
handle,
|
|
41
44
|
tooltip: handle,
|
|
42
45
|
name: ellipsis(handle, 32),
|
|
43
|
-
defaultProfileKey: defaultProfileKey ??
|
|
46
|
+
defaultProfileKey: defaultProfileKey ?? first.key,
|
|
44
47
|
})
|
|
45
48
|
return () => deck.controls.detach(controller)
|
|
46
49
|
})
|
|
47
50
|
}
|
|
48
51
|
|
|
49
52
|
function mouseKeyboard() {
|
|
50
|
-
const {key, profile} =
|
|
53
|
+
const {key, profile} = first
|
|
51
54
|
|
|
52
55
|
const controller = new Controller({
|
|
53
56
|
bindings: profile.bindings,
|
|
@@ -76,6 +79,7 @@ export async function setupTact<B extends Bindings>(params: SetupParams<B>) {
|
|
|
76
79
|
|
|
77
80
|
return {
|
|
78
81
|
deck,
|
|
82
|
+
collector,
|
|
79
83
|
gamepads,
|
|
80
84
|
mouseKeyboard,
|
|
81
85
|
visualizer,
|