Example Usage
Defining resource paths
interface Health {
health: number;
maxHealth: number;
}
interface PlayerResource {
health: Health;
position: Vec3;
}
interface ExampleResourcePaths {
// Players are looked up by their BiomesId.
"/player": PathDef<[BiomesId], PlayerResource>;
"/player/health": PathDef<[BiomesId], Health>;
"/player/position": PathDef<[BiomesId], { position: Vec3 }>;
// The clock has no parameters.
"/clock": PathDef<[], { time: number }>;
}
Defining components
type ExampleResourcesBuilder = BiomesResourcesBuilder<ExampleResourcePaths>;
type ExampleResourceDeps = TypedResourceDeps<ExampleResourcePaths>;
type ExampleResources = TypedResources<ExampleResourcePaths>;
type ExampleReactResources = ReactResources<ExampleResourcePaths>;
Building resources
function genPlayerResource(deps: ExampleResourceDeps, id: BiomesId) {
// Calling deps.get() here creates a dependency between
// "/player" and "/player/health" + "/player/position".
// Whenever the dependencies update, this generator function will rerun.
const health = deps.get("/player/health", id);
const { position } = deps.get("/player/position", id);
return {
health,
position,
};
}
function addExampleResources(builder: ExampleResourcesBuilder) {
// Define a global resource.
builder.addGlobal("/clock", { time: secondsSinceEpoch() });
builder.add("/player", genPlayerResource);
builder.add("/player/health", { health: 100, maxHealth: 100 });
builder.add("/player/position", { position: [0, 0, 0] });
}
Accessing resources
Note: The same can be done using
ExampleReactResources
.
Resources are accessed using the get()
method.
function healthBarColor(resources: ExampleResources, id: BiomesId): string {
const { health, maxHealth } = resources.get("/player/health", id);
const healthPercentage = Math.round((health / maxHealth) * 100);
if (healthPercentage >= 80) {
return "GREEN";
} else if (healthPercentage >= 50) {
return "YELLOW";
} else if (healthPercentage > 0) {
return "RED";
} else {
return "BLACK";
}
}
Updating resources
Note: The same can be done using
ExampleReactResources
.
Resources are updated using the set()
method.
const JUMP_POWER = 10;
function jump(resources: ExampleResources, id: BiomesId) {
const { position } = resources.get("/player/position", id);
// Perform a realistic jump.
resources.set("/player/position", id, {
position: [position[0], position[1] + JUMP_POWER, position[2]],
});
}
Using resources within React
If you want a resource update to trigger a react component to re-render, use the use()
method on
ReactResources
. ReactResources
can be accessed from within all game components, through the ClientContext
.
const PlayerHealth: React.FC<{ playerId: BiomesId }> = ({ playerId }) => {
const { reactResources, userId } = useClientContext();
// Updates to this player's "/player/health" will cause a re-render.
const { health, maxHealth } = reactResources.use("/player/health", playerId);
return (
<div>
<h1>{`${health}/${maxHealth}`}</h1>
</div>
);
};